この記事ではPL/SQLはどうゆうものか、理解することができます。
初めてPL/SQLに触れる方は是非この記事を読んでみてください。
PL/SQLとは
PL/SQL(Procedural Language/Structured Query Language)は、Oracleデータベースで使用されるプログラミング言語です。PL/SQLは、SQL文を含むプログラムを作成し、データベース上で実行するための構造化された手法を提供します。
PL/SQLの特徴や基本的な要素について
- ブロック構造: PL/SQLはブロック構造を持ちます。ブロックはDECLARE(無名のPL/SQLプログラムの場合。PL/SQLプログラムの名前を付ける場合は以下で紹介)、BEGIN、ENDのキーワードで囲まれ、変数の宣言、処理の開始、終了を示します。
- 変数とデータ型: PL/SQLでは変数を宣言し、データを格納することができます。変数のデータ型には、数値、文字列、日付などがあります。DECLAREセクションで変数を宣言します。
- 制御構造: IF-THEN-ELSE文、FORループ、WHILEループなどの制御構造を使用して、プログラムのフローを制御します。条件に基づいて処理を分岐させたり、反復処理を行ったりすることができます。
- カーソル: カーソルはデータベースの結果セットを操作するための仕組みです。カーソルを使用してクエリの結果を取得し、それを処理することができます。
- 例外処理: PL/SQLでは例外処理をサポートしています。例外はエラー状態を表し、例外が発生した場合に適切な処理を行うことができます。例外処理はBEGIN-ENDブロック内に記述されます。
- プロシージャと関数: PL/SQLではプロシージャと関数を作成することができます。プロシージャはデータベース上で実行される手続きであり、関数は値を返す手続きです。
PL/SQLの基本的な使い方
プログラムの作成
PL/SQLプログラムを作成するには、以下のような形式でコードを記述します。
1、宣言部
2,実行部
※パラメータや変数は使用しなければ設定しなくても大丈夫です。
(パラメータ1 [IN/OUT] 型, パラメータ2 [IN/OUT] 型, …)
IS
/*– 宣言部 –*/
— ローカル変数の宣言などを行う
変数名1 型;
変数名2 型;
…
BEGIN
/*– 実行部 –*/
— プログラムの本体
処理を記載;
…
END プロシージャ名;
変数の宣言と条件分岐
PL/SQLでは、変数を宣言して使用することができます。変数は、プロシージャ内でのデータの一時的な保持や計算に使用されます。
条件分岐はIF-THEN-ELSE文を使用します。
以下は、変数の宣言と条件分岐の使用例です。
CREATE OR REPLACE PROCEDURE procedure_name (value1 IN NUMBER, value2 IN NUMBER, value3 IN NUMBER) IS -- ローカル変数の宣言 variable1 NUMBER; variable2 NUMBER; BEGIN -- 変数への値の代入 variable1 := value1;-- 変数の使用 IF variable1 > value2 THEN variable2 := variable1 + value3; ELSE variable2 := variable1 - value3; END IF;-- 結果の表示 DBMS_OUTPUT.PUT_LINE('Result: ' || variable2); END;
ループ
PL/SQLでは、LOOP文などを使用して、ループ処理を行うことができます。
以下は、ループの例です。
CREATE OR REPLACE PROCEDURE procedure_name IS counter NUMBER := 5; str VARCHAR2(100) := 'ループ回数:'; BEGIN -- ループ FOR a IN 1..counter LOOP --1~5回処理を行う -- ループ内の処理 DBMS_OUTPUT.PUT_LINE(str || a); END LOOP; END;
SQL文を使った簡単なプログラム
次は、SQL文を使った簡単なプログラムです。
SELECT文で取得したデータを表示します。
CREATE OR REPLACE PROCEDURE print_employee_details( employee_id IN NUMBER, employee_name OUT VARCHAR2, employee_salary OUT NUMBER ) IS BEGIN SELECT name, salary INTO employee_name, employee_salary FROM employees WHERE id = employee_id;DBMS_OUTPUT.PUT_LINE('Employee Name: ' || employee_name); DBMS_OUTPUT.PUT_LINE('Employee Salary: ' || employee_salary); END print_employee_details;
このプログラムでは、employee_id
という入力パラメータがあり、employee_name
とemployee_salary
という出力パラメータがあります。プログラムの本体では、employees
テーブルからemployee_id
に対応する従業員の名前(name)と給与(salary) を取得し、出力パラメータに設定(INTO を使用)してから、DBMS_OUTPUT
サブプログラムを使用してこれらの値を出力します。
※注意点として、INTO を使用したSELECT文では複数レコードを取得すると例外が発生します。また、取得件数が0件の場合でも例外が発生します。
例外の処理
PL/SQLプログラムには、例外処理機構があります。例外は、実行中に予期しない状況が発生した場合に発生します。以下は、例外処理を含むプログラムの例です。
CREATE OR REPLACE PROCEDURE print_employee_details( employee_id IN NUMBER, employee_name OUT VARCHAR2, employee_salary OUT NUMBER ) IS BEGIN SELECT name, salary INTO employee_name, employee_salary FROM employees WHERE id = employee_id; DBMS_OUTPUT.PUT_LINE('Employee Name: ' || employee_name); DBMS_OUTPUT.PUT_LINE('Employee Salary: ' || employee_salary); --例外処理 WHEN no_data_found THEN --例外名(no_data_found)を記載します。 DBMS_OUTPUT.PUT_LINE('データがありません。'); --取得件数が0件の場合の処理 WHEN others THEN --例外名「others」はすべての例外をキャッチします。 DBMS_OUTPUT.PUT_LINE('予想外の例外が発生しました。'); END print_employee_details;
カーソルについて
PL/SQLでは、カーソルを使用して結果セットを処理することができます。以下は、カーソルの基本的な使い方の例です。
カーソルの定義は宣言部に記載してそれ以外は実行部に記載します。
カーソルの定義
カーソルを定義するには、以下のように宣言部に記述します。
たとえば、以下はemployees
テーブルから全ての従業員の名前と給与を取得するカーソルの例です。
DECLARE --カーソルの宣言とデータの取得 CURSOR employee_cursor IS SELECT name, salary FROM employees; --カーソルで取得したデータを保持する変数を宣言(cursor_row ) cursor_row employee_cursor %ROWTYPE; - BEGIN /* 実行部*/ END;
「employee_cursor」というカーソルを宣言します。
カーソルのオープン
カーソルに対応付けられたSELECT文を実行し、結果セットを識別します。結果セットはオープンした時点のデータを保持します。
カーソルをオープンするには、以下のようにOPENステートメントを使用します。
たとえば、上記のemployee_cursor
をオープンするには、以下のようにします。
カーソルの取得
カーソルから値を取得するには、FETCHステートメントを使用します。
たとえば、上記のemployee_cursor
から1行分の値を取得するには、以下のようにします。
FETCH INTO文を使用する際は、1行のみを取り出すため、LOOP文を併用して複数行を取り出します。また、ループから抜けるための処理を記載します。
LOOP FETCH employee_cursor INTO cursor_row ; --1レコードの結果セットが「cursor_row 」に格納される EXIT WHEN employee_cursor%NOTFOUND; --ループから抜けるための処理 -- 処理を記載 END LOOP;
カーソルのクローズ
カーソルを使用した際はクローズしなければなりません。カーソルをクローズするには、以下のようにCLOSEステートメントを使用します。
たとえば、上記のemployee_cursor
をクローズするには、以下のようにします。
サンプルプログラム
DECLARE
CURSOR employee_cursor IS SELECT name, salary FROM employees;
cursor_row employee_cursor %ROWTYPE;
BEGIN
OPEN employee_cursor;
LOOP
FETCH employee_cursor INTO cursor_row ;
EXIT WHEtN employee_cursor %NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Name: ' || cursor_row.name || ', Salary: ' || cursor_row.salary);
END LOOP;
CLOSE employee_cursor ;
END;
PL/SQLプログラムの実行
作成したPL/SQLプログラムを実行するには、以下のようなSQLコマンドを使用します。
まとめ
この記事ではPL/SQLについて基本的な事を紹介しました。
- PL/SQLの構造
- 変数と条件分岐
- LOOPについて
- 例外処理について
- カーソルについて