Oracle PL/SQLプログラミング仕様


一、PL/SQLプログラミング規範の大文字と小文字
SQLのように、PL/SQLでは大文字と小文字は区別されません.一般的なガイドラインは次のとおりです.
キーワード(BEGIN,EXCEPTION,END,IF THEN ELSE,LOOP,END LOOP)、データ型(VARCHR 2,NUMBER)、
内部関数(LEAST,SUBSTR)とユーザ定義サブルーチン(procedures,functions,packages)は、大文字で使用されます.
変数名とSQLのカラム名とテーブル名、小文字を使用します.
二、PL/SQLプログラミング規範の空白
空白(空白行とスペース)は、コードの可読性を向上させる重要な要素であるため、PL/SQLではSQLと同様に重要です.かえる
すなわち,プログラムの論理構造は,コードにインデントを用いることによって表現できる.以下に、いくつかの推奨事項を示します.
等号または比較オペレータの左右にスペースを1つずつ残します.
構造語(DECLARE,BEGIN,EXCEPTION,END,IF and END IF,LOOP and END LOOP)が左に並んでいます.また、
構造内のネストされた構造は、3つのスペースをインデントします(Tabキーではなくスペースキーを使用します).
プライマリ・コード・セグメント間は空の行で区切られます.
同じ構造の異なる論理部分を独立した行に別々に書き、この構造が短くても.例えばIFとTHENは同じ行に置かれ、
ELSEとEND IFは独立した行に置かれている.
三、PL/SQLプログラミング規範の命名規則
次のプレフィックスを使用すると、キーワードとテーブル名のカラム名との競合を回避できます.
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プログラミング規範の注釈
PL/SQLのコメントはSQLのコメントと同じくらい重要です.彼らはプログラムの主要な部分とすべての肝心な論理ステップを説明しなければならない.
複数行のコメント(/*)ではなく、1行のコメント(-)を使用します.PL/SQLがこれらのコメントを同様に処理しても、コード完了後に行う
複数行のコメントに複数行のコメントを埋め込むことができないため、デバッグも容易になります.すなわち、単行アノテーションコードでは部分的に取り消すことができる
コメントですが、複数行のコメントコードではできません.
五、その他の提案
PL/SQLに埋め込まれたSQL宣言については、同じフォーマットガイドを使用して、これらの宣言がコードブロックにどのように表示されるかを決定します.
コードブロックの用途を説明し、作成日と作成者の名前をリストするヘッダーコメントを提供します.改訂版ごとに1行が必要です
作者名、日付、リビジョンの説明を含むコメント.
たとえば、次の例では、上記の推奨事項を示します.各例では、等幅フォント(Courier New)も使用されていることに注意してください.
フォントが同じ幅を占めると、フォーマットがより簡単になります.等比スペースフォントはスペースを非表示にし、行間の位置合わせが困難になります.多数
テキストとプログラムエディタのデフォルトでは、等幅フォントが使用されます.

REM ********************************************************  
REM *    :coursediscount01.sql  3.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;  
/ 

原文:http://database.51cto.com/art/200907/138973.htm