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;

  • 相关阅读:
    Postgresql HStore 插件试用小结
    postgres-xl 安装与部署 【异常处理】ERROR: could not open file (null)/STDIN_***_0 for write, No such file or directory
    GPDB 5.x PSQL Quick Reference
    postgresql 数据库schema 复制
    hive 打印日志
    gp与 pg 查询进程
    jquery table 发送两次请求 解惑
    python 字符串拼接效率打脸帖
    postgresql 日期类型处理实践
    IBM Rational Rose软件下载以及全破解方法
  • 原文地址:https://www.cnblogs.com/wwwfj/p/3971710.html
Copyright © 2011-2022 走看看