zoukankan      html  css  js  c++  java
  • plsql 书写命名规范

    俗话说事不预则废,无规矩不成方圆。

    对sql脚本程序的设计,个人认为应该是从编码规范开始。

    前段时间公司一些同事提交的脚本,风格迥异,让我审核起来倍感难受,丝毫没有审核代码的快感。

    特整理了公司部分常规的编码规范,对新人进行了培训,希望同志们写的代码更美观和高效(注:规范部分收集于网络,感谢网络大虾们的贡献):

    1.1. PL/SQL 程序命名规范

    1.              无论是 PL/SQL 对象还是 PL/SQL 对象内部用的变量和游标等,都必须能从名称上能让人理解变量和游标的含义,而且一定要做好注释。

    2.              传到 CVS 上的文本文件全部采用 ’.sql’ 作为文件名的后缀

    1.1.1.   存储过程

    存储过程的命名必须符合USP_DETAILNAME 格式,其中 USP 表示是存储过程,DETAILNAME 是与存储过程意义相关的意义的名称,如:USP_BUSINESS_RULE 。

    1.1.2.   软件包

    软件包的命名必须符合PKG_ DETAILNAME 格式,其中 PKG 表示是软件包, DETAILNAME 是与软件包意义相关的意义的名称,例如:PKG_SORCE_ALL 。

    1.1.3.   触发器

    触发器的的命名必须符合TRG_DETAILNAME 格式,其中TRG 表示是触发器,DETAILNAME 是与触发器用途相关的意义的名称,具体可以参考已有的TRIGGER 对象。

    1.1.4.   函数

      函数的命名必须符合FNC_DETAILNAME 格式,其中FNC 表示是函数,,DETAILNAME 是与函数意义相关的意义名称,例如:FNC_SALARYCOUNT 。

    1.1.5.   变量&游标

    1.    变量的命名必须符合规约, 请采用 ” XXX_variablename ” 开头, 其中XXX 表示变量的类型。Variablename 表示变量名,如为函数传入参数请根据传入类型加上IN,OUT,INOUT 等,如: IN_NUM_CUST_CODE.

    2.    如果依据表的字段请采用%type 或者%rowtype 方式。请不要直接定义变量。

    如: NUM_CUST_CODE TableName.CUST_CODE%type

    3.    显示游标请采用 ” CUR_ ” 开头,在代码开头请说明,同时说明游标的定义.

    如:CUR_CUST_INFO

       

    4.    所有的变量前必须带上变量类型的标志,NUMBER 型采用NUM,VARCAHR2 采用VAR ,而在函数等入口的传入方法IN_VAR_CUST_NAME,OUT_NUM_CODE,INOUT_NUM_CODE 的方式来区分变量的类型是否位IN,OUT,INOUT 类型

    5.    不能超过30 个字符,不能采用关键字,要以字母开头。

    注: 以上命名规则将主要在于新建对象时使用,如果在原有的PL/SQL 对象的基础上修改,请按照原来代码的命名规范,注意做好代码的注释。同时必须在PL/SQL 代码开头,做好注释说明。

    1.2. PL/SQL 编码规范

    PL/SQL 的编码规范包括:

    ²        注释

    ²        变量命名

    ²        书写格式

    ²        逻辑分支

    ²       循环处理

    1.2.1注释

    1.  请在所有程序一开始处严格按如下格式写出注释块:

    -- *******************************************

    -- 过程名: 

    -- 功能描述:

    -- 输入参数说明:

    -- 输出参数说明:

    -- 调用的过程或函数:

    -- 创建人员:

    -- 创建日期:

    -- 修改人员:

    -- 修改日期:

    -- 修改原因:

    -- 修改结果:

    -- 版本说明:

    -- ********** *********************************

    2.  通常在PL/SQL 块的declare ,begin ,exception 和end 部分设置分隔线和注释;

    3.  每个变量都需要加上变量的注释,说明变量的用途;

    4.  请在重要的程序段和难懂的程序段加上分隔线和注释;

    5.  请注明游标等的用途和用法

    6. 注释量与程序量的总比例尽量做到1 :1 。

    1.2.2变量取名及含义

    变量取名请 遵守命名规范,对使用频繁、关键变量,为了便于 阅读和修改, 请在定义时加上注释标明其含义。

    为了便于阅读和调试,尽量少用单字母变量,禁止使用诸如i 、l 等作为变量名,同时注意小写字母l 和数字1 之间的区别使用。并严禁使用关键字,要符合ORACLE 的命名规范。

    1.2.3对现有程序的修改

    1.       删除 在删除代码前后上 /*deleted by yourname on yyyy/mm/dd start*/ 和 /*deleted by yourname  on yyyy/mm/dd end*/ 同时请注明删除的原因。

    2.     修改 将原有的代码全部注释(删除)掉,在最后说明注释的原因,同时将你新增加的代码写在注释后,首先加上 /*modified by yourname on yyyy/mm/dd start*/ 和 /* modified by yourname  on yyyy/mm/dd  end*/需要保证

    a.       所有被注释的代码都是原来的代码

    b.     所有没有被注释的代码都是新增加的代码

    3.     增加,在增加的代码前加后 /*added by yourname on yyyy/mm/dd start*/ 和 /*added by yourname  on yyyy/mm/dd  end*/ 同时请注释说明,增加的原因等。

    为了便于阅读和调试,尽量少用单字母变量,禁止使用诸如i 、l 等作为变量名,同时注意小写字母l 和数字1 之间的区别使用。

     

    请注意,必须在PL/SQL 代码的开头处,详细说明你所做的修改,包括修改了那些地方,修改的原因,修改的日期,修改人等。

    1.2.4书写格式

    1. 用语句分层缩进的写法显示嵌套结构的层次;

    2. 在注释段与程序段、以及不同程序段插入空行;

    3. 每行只写一条语句。

    1.2.5逻辑分支

    逻辑分支的格式如下:

    l         IF……THEN
        ……
    ELSE
        ……
    END IF;

    l        CHOOSE   CASE
         CASE 1  …
                 ……
         CASE 2 …
                ……
         CASE ELSE  …
                ……
    CASE END;

    1.2.6循环处理

    循环处理的格式如下:

    l         FOR …… LOOP
     ……
    END LOOP;

    l         WHILE ……LOOP
       ……  
    END LOOP;

    l         DECLARE
    CURSOR cursor_name IS
       ……
       (SQL STATEMENT FOR THER CURSOR)
    BEGIN
       FOR variable_name IN cursor_name LOOP

       (STATEMENT)
       END LOOP;
    END

    1.2.7 游标处理

    游标的本身就是一个SQL 的工作区,用于处理多行或单行的查询处理,主要分为如下两类

    1.     implicit cursor 由DML 和PL/SQL 的SELECT 隐式的定义,不能使用FETCH,OPEN,COLSE 等来控制SQL 游标,但可以使用游标的属性, 如select xxx into xxx from xxx.

    2.     explicit cursor 主要由程序控制, 用于显示返回一行或者多行数据。

    执行的四个步骤

    1.

    声明:定义游标的名字和结构,select 中可以使用order by

    2. 打开游标:执行查询同时绑定所有涉及到的变量

    执行的内容:

    为select 分配内存并分析select 语句

    绑定输入的变量

    配置指针在活动集的第一行

    注意: 如果 查询不返回结果,不会引发PL/SQL 的异常,你可以在执行fetch 后测试返回的结果

    如果游标内的声明包括update 。一样会执行行锁定

    3.Fetch :把当前行的值赋给变量,每个fetch 都会把游标指针向下移动一行。

               如果到了最后一行就会自动退出for loop

    4. 关闭:释放活动的集, 可以再次使用open 

     

    游标的几个属性:

     SQL%ROWCOUNT 受最近执行的SQL 语句影响的行的数目。(一个整数值) 
    SQL%FOUND Boolean 属性,如果最近的SQL 语句影响了一行或多行,其值为 
    TRUE 。 
    SQL%NOTFOUND Boolean 属性,如果最近的SQL 语句没有影响任何行,其值为 
    TRUE 。 
    SQL%ISOPEN 总是为FALSE ,原因是PL/SQL 总是它们结束执行后立即关闭内隐游标。

    例子

    EG1: 常规用法

    CURSOR c1 IS

        SELECT empno, ename

        FROM       emp;

      emp_record   c1%ROWTYPE;

    BEGIN

      OPEN c1;

    . . .

      FETCH c1 INTO emp_record;

    EG2: 使用for 循环实现游标

    DECLARE

      CURSOR c1 IS

        SELECT empno, ename

    FROM   emp;

    emp_record    c1%ROWTYPE;

    BEGIN

      FOR emp_record IN c1 LOOP

             -- implicit open and implicit fetch occur

        IF emp_record.empno = 7839 THEN

          ...

      END LOOP; -- implicit close occurs

    END;

    游标FOR 循环不需要FETCH 语句的。游标打开,在循环中每次重复提取一行,所有的行都处理后,游标会自动关闭。

    EG3: 不定义游标的方式

    BEGIN

      FOR emp_record IN ( SELECT empno, ename

                              FROM   emp) LOOP

             -- implicit open and implicit fetch occur

        IF emp_record.empno = 7839 THEN

          ...

      END LOOP; -- implicit close occurs

    END;

    EG1: 带变量的游标

    你必须指定指定参数的数据类型,但不用指定大小

      DECLARE

      CURSOR c1

      (v_deptno NUMBER, v_job VARCHAR2) IS

        SELECT  empno, ename

        FROM    emp

        WHERE   deptno = v_deptno

         AND    job = v_job;

    BEGIN

      OPEN c1(10, 'CLERK');

    ...

    EG5:FOR UPDATE---- 当加上for update 则把整个表或字段锁住了。

        SELECT    ... FROM        ...

    FOR UPDATE [OF column_reference ][NOWAIT]

    DECLARE

      CURSOR c1 IS

        SELECT empno, ename

        FROM   emp

        FOR UPDATE NOWAIT;

    NOWAIT: 返回一个oracle 的错误信息如果此行给其他的会话锁住了。

    EG6 :WHERE CURRENT OF

    用于在游标中删除和更新当前行

    必须使用 FORUPDATE 去锁住行

    使用WHERE CURRENT OF 去指向当前的行

    DECLARE

      CURSOR c1 IS

        SELECT ...

        FOR UPDATE NOWAIT;

    BEGIN

      ...

      FOR emp_record IN c1 LOOP

        UPDATE ...

          WHERE CURRENT OF c1;

        ...

      END LOOP;

      COMMIT;

    END;

     

      1.2. 8 异常处理

    PL/SQL 的异常主要分为三大类

    1.     Predefined Exception 异常

    2.     Non-Predefined Exception 异常

    3.     User Defined Exception 异常

    其中1,2 将隐式raised ,3 需要显示raised

    如下例子

    Predefined Exception

    BEGIN  SELECT ... COMMIT;

    EXCEPTION

      WHEN NO_DATA_FOUND THEN

        statement1;

        statement2;                                

      WHEN TOO_MANY_ROWS THEN

        statement1;

      WHEN OTHERS THEN

        statement1;

        statement2;

        statement3;

    END; 

    …….

     Non-Predefined Exception

     DECLARE

      e_products_invalid  EXCEPTION;

      PRAGMA EXCEPTION_INIT (

          e_products_invalid, -2292);

      v_message VARCHAR2(50);

    BEGIN

    . . .

    EXCEPTION

      WHEN e_products_invalid THEN

        :g_message := 'Product code

          specified is not valid.';

    . . .

    END;

    User-Defined Exception

    DECLARE

      e_amount_remaining EXCEPTION;

    . . .

    BEGIN

    . . .

      RAISE e_amount_remaining;

    . . .

    EXCEPTION

      WHEN e_amount_remaining  THEN

        :g_message := 'There is still an amount

                   in stock.';

    . . .

    END;

    RAISE_APPLICATION_ERROR

    DECLARE

        …….

    Invalidpart EXCEPTION;

    BEGIN

       …….

       IF SQL%NOTFOUND THEN

       RAISE invalidpart;

       END IF;

    EXCEPTION

       WHEN invalidpart THEN

            Raise_application_error(-20003,’Invalid Part id #’||  partnum);

       WHEN OTHERS THEN

            Raise_application_error(-20000,errNum||errMsg);

       END

    ²        使用EXCEPTION 关键字在一个PL/SQL 块的声明部分声明用户自定义异常

    ²        使用PL/SQL 命令RAISE 检测用户自定义异常

    ²        PL/SQL 可使用Raise_Application_Error 过程返回一个用户自定义错误数和消息给调用环境。所有的用户自定义错误消息必须在-20000 到-20999 之间

    ²        PL/SQL 程序可以使用WHEN OTHERS 异常处理来处理没有特定处理的所有异常,WHEN OTHERS 一定放在异常处理的最后

    ²        PL/SQL 程序可以使用特殊的SQLCODE 和SQLERRM 函数返回oracle 内部错误号码和消息

    ²        SQLCODE SQLERRM ,SQLCODE 返回一个NUMBER 型的错误类型,而SQLERRM 将返回错误类型相关的错误信息描述。

    DECLARE

      v_error_code      NUMBER;

      v_error_message   VARCHAR2(255);

    BEGIN

    ...

    EXCEPTION

    ...

      WHEN OTHERS THEN

        ROLLBACK;

        v_error_code := SQLCODE ;

        v_error_message := SQLERRM ;

        INSERT INTO errors VALUES(v_error_code,

                       v_error_message);

    END;

  • 相关阅读:
    jquery validate使用总结
    javascript 学习笔记
    jquery easyui 学习总结
    javascript模式及javascript学习终极篇
    javascript学习笔记基础
    javascript学习笔记常见问题及技巧
    一道ITAT的题(C语言实现)
    JAVA实现约瑟夫算法
    JAXWS例子
    practical java笔记(实践1~5)
  • 原文地址:https://www.cnblogs.com/wwwfj/p/3971710.html
Copyright © 2011-2022 走看看