【PL/SQLの基本原則】データベースプログラミングの初歩

スポンサーリンク

この記事ではPL/SQLはどうゆうものか、理解することができます。
初めてPL/SQLに触れる方は是非この記事を読んでみてください。

PL/SQLとは

PL/SQL(Procedural Language/Structured Query Language)は、Oracleデータベースで使用されるプログラミング言語です。PL/SQLは、SQL文を含むプログラムを作成し、データベース上で実行するための構造化された手法を提供します。

PL/SQLの特徴や基本的な要素について

  1. ブロック構造: PL/SQLはブロック構造を持ちます。ブロックはDECLARE(無名のPL/SQLプログラムの場合。PL/SQLプログラムの名前を付ける場合は以下で紹介)、BEGIN、ENDのキーワードで囲まれ、変数の宣言、処理の開始、終了を示します。
  2. 変数とデータ型: PL/SQLでは変数を宣言し、データを格納することができます。変数のデータ型には、数値、文字列、日付などがあります。DECLAREセクションで変数を宣言します。
  3. 制御構造: IF-THEN-ELSE文、FORループ、WHILEループなどの制御構造を使用して、プログラムのフローを制御します。条件に基づいて処理を分岐させたり、反復処理を行ったりすることができます。
  4. カーソル: カーソルはデータベースの結果セットを操作するための仕組みです。カーソルを使用してクエリの結果を取得し、それを処理することができます。
  5. 例外処理: PL/SQLでは例外処理をサポートしています。例外はエラー状態を表し、例外が発生した場合に適切な処理を行うことができます。例外処理はBEGIN-ENDブロック内に記述されます。
  6. プロシージャと関数: PL/SQLではプロシージャと関数を作成することができます。プロシージャはデータベース上で実行される手続きであり、関数は値を返す手続きです。

PL/SQLの基本的な使い方

プログラムの作成

PL/SQLプログラムを作成するには、以下のような形式でコードを記述します。
1、宣言部
2,実行部
※パラメータや変数は使用しなければ設定しなくても大丈夫です。

CREATE [OR REPLACE] PROCEDURE プロシージャ名
(パラメータ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_nameemployee_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をオープンするには、以下のようにします。

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をクローズするには、以下のようにします。

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コマンドを使用します。

EXECUTE プロシージャ名;

まとめ

この記事ではPL/SQLについて基本的な事を紹介しました。

  1. PL/SQLの構造
  2. 変数と条件分岐
  3. LOOPについて
  4. 例外処理について
  5. カーソルについて