OraclePL/SQL編程規範指南

一、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;
/ 來源:考試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章