[訳]PL/SQLフォーマットガイド(PL/SQL Formatting Guide)


最近ずっと以前同僚が書いたOracleストレージプロセスを修正していますが、コードが規範化されていないため、修正するのにかなり苦労しています.そこで、このPL/SQL Formatting Guide(Oracle PL/SQL by Example,Appendix A)を翻訳して、苦労して、やっと翻訳して、やっと自分の英語がどれだけ腐っているかを知っていました.
声明:オリジナル翻訳、不足点はご指摘ください、転載は出典を明記してください!
一、大文字と小文字
SQLのように、PL/SQLでは大文字と小文字は区別されません.一般的なガイドラインは次のとおりです.
  • キーワード(BEGIN,EXCEPTION,END,IF THEN ELSE,LOOP,END LOOP)、データ型(VARCHAR2,NUMBER)、内部関数(LEAST,SUBSTR)、およびユーザ定義のサブルーチン(procedures,functions,packages)は、大文字で使用される.
  • 変数名およびSQLのカラム名とテーブル名は、小文字を使用します.

  • 二、空白
    空白(空白行とスペース)は、PL/SQLでSQLと同様に重要です.コードの可読性を向上させる重要な要素です.つまり、コードにインデントを使用することでプログラムの論理構造を表現できます.以下にいくつかのアドバイスを示します.
  • 等号または比較オペレータの左右にスペースを1つずつ残します.
  • 構造語(DECLARE、BEGIN、EXCEPTION、END、IFおよびEND IF、LOOPおよびEND LOOP)が左に並んでいます.また、構造内のネストされた構造は、Tabキーではなく3つのスペース(スペースキーを使用)インデントします.
  • 主要コードセグメント間は空の行で区切られている.
  • は、この構造が短くても、同じ構造の異なる論理部分を独立した行に別々に書く.例えば、IFとTHENは同じ行に置かれ、ELSEとEND IFは独立した行に置かれる.

  • 三、命名規則
    次のプレフィックスを使用すると、キーワードとテーブル名のカラム名との競合を回避できます.
  • v_変数名
  • con_定数名
  • i_パラメータ名を入力、o_出力パラメータ名、io_入出力パラメータ名
  • c_カーソル名またはカーソル名_cur
  • rc_ Ref Cursor名
  • r_レコード名またはレコード名_rec
  • FOR r_stud IN c_stud LOOP…
  • FOR stud_rec IN stud_cur LOOP
  • type_名前、名前_type(ユーザ定義のタイプ)
  • t_テーブル名、テーブル名_tab(PL/SQL表)
  • rec_レコード名、レコード名_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のコメントはSQLのコメントと同じくらい重要です.彼らはプログラムの主要な部分とすべての肝心な論理ステップを説明しなければならない.
    複数行のコメント(/*)ではなく、1行のコメント(-)を使用します.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;