[訳]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_例外名(ユーザ定義の例外) パッケージの名前は、パッケージ内のストレージ・プロシージャと関数が主に完了する機能を記述する必要があります.
ストアド・プロシージャの名前は、ストアド・プロシージャが実行するアクションを記述する必要があります.
関数の名前は、返される変数を記述する必要があります.
例:
四、注釈
PL/SQLのコメントはSQLのコメントと同じくらい重要です.彼らはプログラムの主要な部分とすべての肝心な論理ステップを説明しなければならない.
複数行のコメント(/*)ではなく、1行のコメント(-)を使用します.PL/SQLがこれらのコメントを同じ処理しても、コードが完了した後にデバッグするのは簡単です.複数行のコメントに複数行のコメントを埋め込むことはできません.すなわち、単行アノテーションコードではアノテーションを部分的に取り消すことができ、複数行アノテーションコードではできません.
五、その他の提案
PL/SQLに埋め込まれたSQL宣言については、同じフォーマットガイドを使用して、これらの宣言がコードブロックにどのように表示されるかを決定します.
コードブロックの用途を説明し、作成日と作成者の名前をリストするヘッダーコメントを提供します.各リビジョンには、著者名、日付、リビジョンの説明を含む注釈の行が必要です.
たとえば、次の例では、上記の推奨事項を示します.この例では、各フォントが同じ幅を占めるとフォーマットがより簡単になるため、等幅フォント(Courier New)も使用されています.等比スペースフォントはスペースを非表示にし、行間の位置合わせが困難になります.多くのテキストとプログラムエディタでは、デフォルトで等幅フォントが使用されています.
声明:オリジナル翻訳、不足点はご指摘ください、転載は出典を明記してください!
一、大文字と小文字
SQLのように、PL/SQLでは大文字と小文字は区別されません.一般的なガイドラインは次のとおりです.
二、空白
空白(空白行とスペース)は、PL/SQLでSQLと同様に重要です.コードの可読性を向上させる重要な要素です.つまり、コードにインデントを使用することでプログラムの論理構造を表現できます.以下にいくつかのアドバイスを示します.
三、命名規則
次のプレフィックスを使用すると、キーワードとテーブル名のカラム名との競合を回避できます.
ストアド・プロシージャの名前は、ストアド・プロシージャが実行するアクションを記述する必要があります.
関数の名前は、返される変数を記述する必要があります.
例:
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;