设为首页 收藏本站
查看: 1525|回复: 0

[经验分享] Oracle PL/SQL编程规范指南

[复制链接]

尚未签到

发表于 2016-8-9 06:47:56 | 显示全部楼层 |阅读模式
  一、PL/SQL编程规范之大小写

  就像在SQL中一样,PL / SQL中是不区分大小写的。其一般准则如下:
  关键字(BEGIN, EXCEPTION, END, IF THEN ELSE,LOOP, END
LOOP)、数据类型(VARCHAR2, NUMBER)、内部函数(LEAST, SUBSTR)和用户定义的子程序(procedures,
functions,packages),使用大写。
  变量名以及SQL中的列名和表名,使用小写。
  二、PL/SQL编程规范之空白

  空白(空行和空格)在PL/SQL中如同在SQL中一样重要,因为它是提高代码可读性的一个重要因素。换句话说,可以通过在代码中使用缩进来体现程
序的逻辑结构。以下是一些建议:
  在等号或比较操作符的左右各留一个空格;
  结构词(DECLARE, BEGIN, EXCEPTION, END,IF and END IF, LOOP and END
LOOP)居左排列。另外,结构中的嵌套结构要缩进三个空格(使用空格键,而不是Tab键);
  主要代码段之间用空行隔开;
  把同一结构的不同逻辑部分分开写在独立的行,即使这个结构很短。例如,IF和THEN被放在同一行,而ELSE 和END IF则放在独立的行。
  三、PL/SQL编程规范之命名约定

  使用以下前缀对于避免与关键字和表名列名相冲突是很有帮助的:
  v_变量名
  con_常量名
  i_输入参数名,o_输出参数名,io_输入输出参数名
  c_游标名 或者 游标名_cur
  rc_ Ref Cursor名
  r_Record名 或者 Record名_rec
  FOR r_stud IN c_stud LOOP…
  FOR stud_rec IN stud_cur LOOP
  type_名称,名称_type (用户定义的类型)
  t_表名,表名_tab (PL/SQL 表)
  rec_Record名,Record名_rec (Record变量)
  e_异常名 (用户定义的异常)
  包的名称应该描述包内的存储过程和函数主要所完成的功能
  存储过程的名称应该描述该存储过程所执行的动作
  函数的名称应该描述所返回的变量
  例如:
  PACKAGE student_admin
  – admin 后缀可能是用于表示管理功能.
  PROCEDURE remove_student (i_student_id IN student.studid%TYPE);
  FUNCTION student_enroll_count (i_student_id student.studid%TYPE)
  RETURN INTEGER;
  四、PL/SQL编程规范之注释

  PL/SQL中的注释如同SQL中的注释一样重要。他们应该解释程序的主要部分和所有关键的逻辑步骤。
  使用单行注释(–)而不是多行注释(/*)。即使PL/SQL对这些注释做同样处理,这样在代码完成后进行调试也会容易些,因为你不能在多行注释中
嵌入多行注释。换句话说,单行注释代码中可以部分取消注释,而在多行注释代码中则不行。
  五、其他的建议

  对于PL/SQL中嵌入的SQL声明,使用相同的格式化指南来决定这些声明应该如何在代码块中出现
  提供一个头部注释,用于说明代码块的用途并列出创建日期和作者名字。并且每个修订版都要有一行注释,包含作者名、日期和修订版描述。
  例如:下面的这个示例体现了上述建议。请注意该示例还使用了等宽字体(Courier
New),因为每个字体占据同等宽度可以使格式化更加简便。等比例空格字体会隐藏空格使得行间对齐比较困难。多数文本和程序编辑器默认使用等宽字体。



  • REM ********************************************************  


  • REM * 文件名:coursediscount01.sql  

  • REM * 版本:1  

  • REM * 用途:对于至少有一部分超过十个学生登记的课程给予折扣  

  • REM * 参数:无  

  • REM *  

  • REM * 作者:s.tashi  时间:2000.1.1  

  • REM * 修改者:y.sonam 时间:2000.2.1  

  • REM * 描述:修正游标,添加缩进和注释。  

  • REM ********************************************************  

  • DECLARE


     

  • - C_DISCOUNT_COURSE 找出那些至少有一部分超过十个学生登记的课程

     

  • CURSOR



  •  c_discount_course 
    IS



  • SELECT


    DISTINCT


     course_no  

  • FROM


    section


     sect  

  • WHERE


     10 <= (
    SELECT


     
    COUNT

    (*)  

  • FROM


     enrollment enr  

  • WHERE


     enr.section_id = sect.section_id  

  • );  

  • -- 费用超过 $2000.00的课程的折扣率

     

  • con_discount_2000 CONSTANT NUMBER := .90;  

  • -- 费用在$1001.00和$2000.00之间的课程的折扣率

     

  • con_discount_other CONSTANT NUMBER := .95;  

  • v_current_course_cost course.cost%TYPE;  

  • v_discount_all NUMBER;  

  • e_update_is_problematic EXCEPTION;  

  • BEGIN


     

  • -- 对于那些要打折的课程, 确定当前费用和新的费用

     

  • FOR


     r_discount_course 
    in

     c_discount_course LOOP  

  • SELECT


    cost  

  • INTO


     v_current_course_cost  

  • FROM


     course  

  • WHERE


     course_no = r_discount_course.course_no;  

  • IF v_current_course_cost > 2000 
    THEN


     

  • v_discount_all := con_discount_2000;  

  • ELSE



  • IF v_current_course_cost > 1000 
    THEN


     

  • v_discount_all := con_discount_other;  

  • ELSE



  • v_discount_all := 1;  

  • END


     IF;  

  • END


     IF;  

  • BEGIN



  • UPDATE


     course  

  • SET


     cost = cost * v_discount_all  

  • WHERE


     course_no = r_discount_course.course_no;  

  • EXCEPTION  

  • WHEN


     OTHERS 
    THEN


     

  • RAISE e_update_is_problematic;  

  • END



    -- 更新记录的子代码块结束

     

  • END


     LOOP; 
    -- 主循环结束


  • COMMIT


    ;  

  • EXCEPTION  

  • WHEN


     e_update_is_problematic 
    THEN


     

  • -- 事务回滚

     

  • ROLLBACK


    ;  

  • DBMS_OUTPUT.PUT_LINE  

  • (’There was a problem updating a course cost.’);  

  • WHEN


     OTHERS 
    THEN


     

  • NULL

    ;  
    END


    ;  

  • /  


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-254996-1-1.html 上篇帖子: oracle调用外部程序小例 下篇帖子: ORACLE序列号发生器用法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表