PL (Procedural Language)/SQL は、Oracle データベースのストアド プロシージャ、トリガー、関数などのオブジェクトを記述するために使用されるプログラミング言語であり、オブジェクト指向プログラミング (OOP) および動的 SQL をサポートしており、開発効率とアプリケーションを向上させることができます。保守性。
PL/SQL は、SQL ステートメントと一般的なプログラミング言語の特性を組み合わせて、複雑なデータ操作とビジネス ロジックを実現します。PL/SQL は、SQL ステートメントと比較して、より強力なデータ処理機能とより高い実行効率を備えており、サーバー側で処理できるため、ネットワーク通信のオーバーヘッドが削減され、メンテナンスと再利用が容易になります。
1. PL/SQL文のブロック構成
PL/SQL ステートメント ブロックは、ステートメント部分、実行部分、および例外処理の3 つの主要部分で構成されます。
DECLARE
Declaration statements
BEGIN
Executable statements
EXCEPTION
Exception-handling statements
END;
- 宣言セクション (Declaration Section): このセクションは、変数、定数、カーソル、サブルーチンなどのオブジェクトを宣言するために使用され、型とテーブルを定義できます。宣言セクションは
DECLARE
キーワードで始まり、BEGIN
キーワードで終わります。 - 実行セクション: このセクションには、PL/SQL コードの本体が含まれ、、、、、または制御ステートメント ( 、、など)などの SQL ステートメントなどの特定の操作
SELECT
を実行UPDATE
するために使用されます。実行セクションはキーワードで始まり、で終わります。DELETE
IF-THEN
LOOP
WHILE-DO
BEGIN
END
- 例外処理セクション (例外処理セクション): このセクションは、プログラムの実行中に発生する可能性のあるエラーをキャプチャして処理するために使用されます。実行部分では、例外が発生した場合、対応する処理のために例外処理部分にジャンプします。例外処理セクションは
EXCEPTION
キーワードで始まり、END で終わります。
2. 変数の宣言と使用
変数を使用すると、PL/SQL プログラムをより柔軟で読みやすくすることができます。
(1) 変数宣言
PL/SQL では、変数を使用する前に宣言し、その型を指定する必要があります。
- 整数変数を宣言する
DECLARE
my_variable INTEGER;
BEGIN
-- 代码块
END;
- 文字変数を宣言する
DECLARE
my_variable VARCHAR2(50);
BEGIN
-- 代码块
END;
- 日付変数を宣言する
DECLARE
my_variable DATE;
BEGIN
-- 代码块
END;
- カーソル変数を宣言する
DECLARE
my_cursor SYS_REFCURSOR;
BEGIN
-- 代码块
END;
(2) 変数の割り当て
変数はコード ブロックで使用でき、割り当て、計算、および比較できます。
- 割り当て操作
DECLARE
my_variable INTEGER := 10;
BEGIN
-- 代码块
END;
- 計算操作
DECLARE
x INTEGER := 5;
y INTEGER := 3;
result INTEGER;
BEGIN
result := x + y; -- 计算x和y的和
END;
- 比較演算
DECLARE
x INTEGER := 5;
y INTEGER := 3;
result BOOLEAN;
BEGIN
result := (x > y); -- 比较x是否大于y
END;
3. 制御ステートメント
(1) 分岐文
PL/SQL の分岐ステートメントには、IF-THEN-ELSE
ステートメントとCASE
ステートメントが含まれます。
IF-THEN-ELSE
ステートメントは、条件に従って異なるステートメント ブロックを実行します。CASE
ステートメントは、変数の値に応じてステートメントのさまざまなブロックを実行します
例 IF-THEN-ELSE
:
DECLARE
salary NUMBER := 5000;
BEGIN
IF salary > 10000 THEN
dbms_output.put_line('High Salary');
ELSIF salary > 5000 THEN
dbms_output.put_line('Medium Salary');
ELSE
dbms_output.put_line('Low Salary');
END IF;
END;
例 CASE
:
DECLARE
grade CHAR(1) := 'A';
BEGIN
CASE grade
WHEN 'A' THEN dbms_output.put_line('Excellent');
WHEN 'B' THEN dbms_output.put_line('Good');
WHEN 'C' THEN dbms_output.put_line('Fair');
ELSE dbms_output.put_line('Needs Improvement');
END CASE;
END;
(2) ループ文
LOOP
基本サイクル
LOOP
…
END LOOP;
例えば
BEGIN
X:=0;
LOOP
X:=X+1;
EXIT WHEN X>=3;
DBMS_OUTPUT.PUT_LINE('X:'||X);
END LOOP;
END;
WHILE
サイクル
WHILE expression LOOP
…
END LOOP;
例えば
BEGIN
X:=0;
WHILE X<=3 LOOP
X:=x+1;
END LOOP;
DBMS_OUTPUT.PUT_LINE('X='||X);
END;
FOR
サイクル
FOR counter IN [REVERSE] start_value..end_value LOOP
…
END LOOP;
例えば
-- 递增量只能是1
FOR I IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE('I='||I);
END LOOP;
4. 例外処理
PL/SQL での例外処理は、プログラムの実行中に発生したエラーをキャッチして処理するためのメカニズムです。例外が発生すると、例外を処理するコードのブロックを含む例外処理セクションに制御が移されます。例外処理により、プログラムの堅牢性と信頼性が向上し、予期しないプログラムのクラッシュやデータの損失を回避できます。
PL/SQL はBEGIN...EXCEPTION...END
ステートメント ブロックを使用して例外を処理します。BEGIN
との間のコードEXCEPTION
は「保護されたコード」と呼ばれ、このコードの実行中に例外が発生すると、対応する例外処理ロジックを実行するために EXCEPTION ブロックにジャンプします。
通常、例外処理ブロックは例外をログに記録し、プログラムが正常に続行または終了できるように何らかのアクションを実行します。たとえば、エラー メッセージをユーザーに表示したり、コミットされていないトランザクションをロールバックしたり、開いているファイルを閉じたりすることができます。
PL/SQLには多くの事前定義された例外タイプがあります。EXCEPTION WHEN文を使用して特定のタイプの例外を処理したり、例外タイプをカスタマイズしてRAISE文を介して手動で例外を発生させたりできます。
(1) システム異常
PL/SQL のシステム例外は、プログラムの実行中に Oracle データベース エンジンによってスローされる例外を指します。一般的な PL/SQL システム例外は次のとおりです。
NO_DATA_FOUND
: この例外は、SELECT ステートメントがデータを取得しない場合にスローされます。TOO_MANY_ROWS
: この例外は、SELECT ステートメントが複数行のデータを返す場合にスローされます。DUP_VAL_ON_INDEX
: この例外は、ユニーク制約を持つ列または主キーに重複する値を挿入しようとするとスローされます。INVALID_CURSOR
: この例外は、無効なカーソルを使用しようとするとスローされます。TIMEOUT_ON_RESOURCE
: この例外は、ロックまたは I/O 操作が完了するのを待機するなど、リソースがタイムアウトするのを待機しているときにスローされます。STORAGE_ERROR
: この例外は、PL/SQLメモリー領域が不十分な場合にスローされます。PROGRAM_ERROR
: この例外は、コンパイラ エラーまたは実行時エラーが発生したときにスローされます。OTHERS
: 一致する例外ハンドラがない場合、未処理の例外はすべてこの例外に変換されます。
例えば
DECLARE
TEST VARCHAR2(10);
BEGIN
SELECT X INTO TEST FROM DETAIL.T_JBXX WHERE ID=1;
DBMS_OUTPUT.PUT_LINE('TEST IS:'||TEST);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND');
END;
(2) カスタム例外
PL/SQL では、カスタム例外を使用して、プログラムの実行中に発生する可能性のあるエラーを処理できます。
例えば
DECLARE
TNAME VARCHAR2(20);
E EXCEPTION; /*声明异常*/
BEGIN
SELECT X INTO TNAME FROM DETAIL.T_JBXX WHERE ID=32334;
IF TNAME<>'TOM' THEN
RAISE E; /*抛出异常*/
END IF;
DBMS_OUTPUT.PUT_LINE(TNAME);
EXCEPTION /*异常处理*/
WHEN E THEN
DBMS_OUTPUT.PUT_LINE('ERROR NOT TOM');
END;