📘 PL/SQLとは
PL/SQLはOracle Databaseのための手続き型言語拡張です。SQL文にプログラミング機能を追加し、データベース操作の効率化が可能になります。
PL/SQLは「Procedural Language/Structured Query Language」の略で、SQLに制御構造やプロシージャなどのプログラミング要素を追加したものです。
🧩 基本構文
PL/SQLの基本構造はブロックと呼ばれる単位で構成されています。
DECLARE
-- 変数宣言部
BEGIN
-- 実行部
EXCEPTION
-- 例外処理部
END;
- DECLARE: 変数や定数を宣言するセクション(省略可)
- BEGIN: 実行するコードを記述するセクション(必須)
- EXCEPTION: エラー処理を行うセクション(省略可)
- END: ブロックの終了を示す(必須)
🔤 データ型
スカラー型
- NUMBER: 数値(整数・小数)
- VARCHAR2: 可変長文字列
- CHAR: 固定長文字列
- DATE: 日付
- BOOLEAN: 論理値(TRUE/FALSE/NULL)
複合型
- RECORD: レコード型(複数のフィールドをグループ化)
- TABLE: コレクション型(配列のようなもの)
DECLARE
v_name VARCHAR2(100) := 'Taro Yamada';
v_age NUMBER(3) := 30;
v_is_active BOOLEAN := TRUE;
BEGIN
-- 処理
END;
🔄 制御構造
条件分岐(IF文)
IF 条件 THEN
-- 処理1
ELSIF 条件 THEN
-- 処理2
ELSE
-- 処理3
END IF;
条件分岐(CASE文)
CASE 変数
WHEN 値1 THEN 処理1;
WHEN 値2 THEN 処理2;
ELSE 処理3;
END CASE;
ループ構造
-- 基本ループ
LOOP
-- 処理
EXIT WHEN 条件;
END LOOP;
-- WHILEループ
WHILE 条件 LOOP
-- 処理
END LOOP;
-- FORループ
FOR i IN 1..10 LOOP
-- 処理
END LOOP;
📝 カーソル
カーソルは複数行の結果セットを処理するためのポインタのようなものです。
明示的カーソル
DECLARE
CURSOR emp_cursor IS
SELECT * FROM employees
WHERE department_id = 10;
emp_rec emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_rec;
EXIT WHEN emp_cursor%NOTFOUND;
-- 処理
END LOOP;
CLOSE emp_cursor;
END;
FOR LOOPを使ったカーソル処理
BEGIN
FOR emp_rec IN (SELECT * FROM employees) LOOP
-- 処理
END LOOP;
END;
🔧 ストアドプロシージャ&関数
プロシージャ(値を返さない)
CREATE OR REPLACE PROCEDURE greet_user(
p_name IN VARCHAR2
) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('こんにちは、' || p_name || 'さん!');
END;
-- 呼び出し方法
BEGIN
greet_user('山田');
END;
関数(値を返す)
CREATE OR REPLACE FUNCTION calc_tax(
p_amount IN NUMBER
) RETURN NUMBER IS
v_tax_rate NUMBER := 0.1;
BEGIN
RETURN p_amount * v_tax_rate;
END;
-- 呼び出し方法
DECLARE
v_tax NUMBER;
BEGIN
v_tax := calc_tax(1000);
DBMS_OUTPUT.PUT_LINE('税額: ' || v_tax);
END;
⚠️ 例外処理
PL/SQLでは例外処理を使って、エラーが発生した場合の動作を制御できます。
事前定義例外
- NO_DATA_FOUND: SELECTで行が見つからない
- TOO_MANY_ROWS: 1行を期待するSELECTで複数行が返る
- VALUE_ERROR: 算術・変換エラー
- ZERO_DIVIDE: ゼロ除算エラー
BEGIN
-- 処理
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- 行が見つからない場合の処理
WHEN TOO_MANY_ROWS THEN
-- 複数行が返る場合の処理
WHEN OTHERS THEN
-- その他のエラー処理
END;
💡 初心者向けTips
- コメントを活用:
-- 一行コメント
と/* 複数行コメント */
- インデント: コードの可読性向上のため一貫したインデントを使用
- 命名規則: 変数には接頭辞を使用(v_name, p_id, c_taxなど)
- コミット: トランザクション制御に
COMMIT
とROLLBACK
を適切に使用 - 例外処理: すべてのブロックに例外処理を含める
- SQLクエリのテスト: 複雑なクエリは別途テスト後に組み込む
PL/SQLは最初は複雑に感じるかもしれませんが、基本的な構文とパターンを理解すれば効率的なデータベースプログラミングが可能になります。