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

1. PL/SQL编码规范
PL/SQL对大小写不敏感,故切忌使用大小写区分变量和其它用户定义的元素。为使代码具有可读性,可遵循以下简单的大小写规则以便在源代码中区分这些元素:
²         全部保留字、Oracle提供的程序包、内建函数、用户定义的常数、Oracle和用户定义的数据类型,以及模式名均采用大写;
²         所有程序命名和过程名称全部采用大写。
²         修改前必须从CVS去取最新的版本去,同时如存在多个人同时修改的情况,请注意协调分工,注意事后合并版本。
²         所有的包和过程等PL/SQL脚本,请将最新的放在CVS上,
\JCN\20Engineering\20.40SourceCode\PLSQL\这个目录下。
(FUNCTION和PACKAGE等要分开放)
 
   文件的路径如下图片所示
 
如果是改修的,请到下图的Baseline下去取文件,然后保存到上述路径:
 
²         PL/SQL的包和包体将采用一个文件,名称为包的名字,保留到CVS将,请不要将包和包体分开为两个文件update到CVS。
²         在提交到CVS上去以前,请清理掉临时的变量,和编码的时候采用的临时表等,并请格式化你的代码,不定期将会对代码进行review。
 
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的编码规范包括:


²        注释
²        变量命名
²        书写格式
²        逻辑分支
²       循环处理
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;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值