tbwshc

PL/SQL编码规范: 注释、变量命名、书写格式、逻辑分支、 循环处理

PL/SQL编码规范

TBPL/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;

 

 

 

 

posted on 2012-06-04 11:55 chen11-1 阅读(1909) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: