1. PL/SQLとは?
・PL/SQLの定義: Oracleデータベースで使われるプログラミング言語であることを説明。
・SQLとの違い: SQLがデータ操作言語であるのに対し、PL/SQLはSQLの機能を拡張し、ループや条件分岐などをサポートする。
・使用目的: PL/SQLを使うことで複雑な処理をデータベース内で効率的に実行可能。
2. PL/SQLの基本構造
・基本構造の説明: DECLARE、BEGIN、EXCEPTION、ENDのブロック構成について解説。
・コード例: 以下は「Hello, World!」を表示する簡単な例です。
DECLARE
message VARCHAR2(50) := 'PL/SQLの世界へようこそ!';
BEGIN
DBMS_OUTPUT.PUT_LINE(message);
END;
SQL> set serveroutput on;
SQL> DECLARE
2 message VARCHAR2(50) := 'PL/SQLの世界へようこそ!';
3 BEGIN
4 DBMS_OUTPUT.PUT_LINE(message);
5 END;
6 /
PL/SQLの世界へようこそ! ★
PL/SQLプロシージャが正常に完了しました。
・この例では、DECLARE
で変数message
を定義し、BEGIN
セクションで内容を表示します。
3. 変数とデータ型
・変数の宣言方法: NUMBER
、VARCHAR2
、DATE
など一般的なデータ型を紹介。
・コード例: 数値計算の簡単な例。
DECLARE
first_name VARCHAR2(20) := '山田';
last_name VARCHAR2(20) := '太郎';
full_name VARCHAR2(40);
BEGIN
full_name := first_name || ' ' || last_name;
DBMS_OUTPUT.PUT_LINE('氏名: ' || full_name);
END;
SQL> DECLARE
2 first_name VARCHAR2(20) := '山田';
3 last_name VARCHAR2(20) := '太郎';
4 full_name VARCHAR2(40);
5 BEGIN
6 full_name := first_name || ' ' || last_name;
7 DBMS_OUTPUT.PUT_LINE('氏名: ' || full_name);
8 END;
9 /
氏名: 山田 太郎 ★
PL/SQLプロシージャが正常に完了しました。
ここではnum1
とnum2
を宣言し、sum
に合計を代入して表示しています。
4. 制御構文
・IF文: 条件分岐を行うIF文の使い方。
DECLARE
age NUMBER := 30;
BEGIN
IF age < 18 THEN
DBMS_OUTPUT.PUT_LINE('未成年です');
ELSIF age BETWEEN 18 AND 64 THEN
DBMS_OUTPUT.PUT_LINE('成人です');
ELSE
DBMS_OUTPUT.PUT_LINE('高齢者です');
END IF;
END;
SQL> DECLARE
2 age NUMBER := 30;
3 BEGIN
4 IF age < 18 THEN
5 DBMS_OUTPUT.PUT_LINE('未成年です');
6 ELSIF age BETWEEN 18 AND 64 THEN
7 DBMS_OUTPUT.PUT_LINE('成人です');
8 ELSE
9 DBMS_OUTPUT.PUT_LINE('高齢者です');
10 END IF;
11 END;
12 /
成人です ★
PL/SQLプロシージャが正常に完了しました。
LOOP文: 繰り返し処理のLOOP文。
DECLARE
i NUMBER;
BEGIN
FOR i IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE('ループ: ' || i);
END LOOP;
END;
SQL> DECLARE
2 i NUMBER;
3 BEGIN
4 FOR i IN 1..5 LOOP
5 DBMS_OUTPUT.PUT_LINE('ループ: ' || i);
6 END LOOP;
7 END;
8 /
ループ: 1 ★
ループ: 2
ループ: 3
ループ: 4
ループ: 5
PL/SQLプロシージャが正常に完了しました。
この例では、変数i
が5以下の間ループが続きます。
5. 手続き的な処理(プロシージャ)
・プロシージャの概要: 繰り返し使用可能な処理をカプセル化。
CREATE OR REPLACE PROCEDURE insert_employee(p_name VARCHAR2, p_age NUMBER) IS
BEGIN
INSERT INTO employees (name, age) VALUES (p_name, p_age);
DBMS_OUTPUT.PUT_LINE('レコードを挿入しました: ' || p_name);
END;
・呼び出し方: プロシージャを実行するにはEXECUTE greet_user;
とします。
6. 関数
・関数の概要: 計算結果などの値を返すことが可能。
CREATE OR REPLACE FUNCTION calculate_tax(salary NUMBER) RETURN NUMBER IS
tax NUMBER;
BEGIN
tax := salary * 0.1;
RETURN tax;
END;
・呼び出し方: 関数を呼び出す際にはSELECT add_numbers(10, 20) FROM dual;
のようにして使用します。
7. トリガー
・トリガーの概要: 特定のイベント(INSERT、UPDATE、DELETE)に自動で実行される処理。
CREATE OR REPLACE TRIGGER after_update_salary
AFTER UPDATE OF salary ON employees
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('給料が変更されました。新しい給料: ' || :NEW.salary);
END;
・この例では、employees
テーブルに新しい行が追加される際に、created_at
フィールドに自動で現在の日時を設定します。
8. エラーハンドリング
・例外処理: エラーが発生したときの処理方法。
DECLARE
insufficient_balance EXCEPTION;
balance NUMBER := 500;
withdrawal NUMBER := 600;
BEGIN
IF withdrawal > balance THEN
RAISE insufficient_balance;
END IF;
EXCEPTION
WHEN insufficient_balance THEN
DBMS_OUTPUT.PUT_LINE('残高不足です。');
END;
・ZERO_DIVIDE
例外でゼロ除算エラーをキャッチし、メッセージを表示します。
9. 動的SQL
・EXECUTE IMMEDIATE: 動的に生成したSQL文を実行。
DECLARE
table_name VARCHAR2(50) := 'employees';
sql_stmt VARCHAR2(200);
BEGIN
sql_stmt := 'SELECT COUNT(*) FROM ' || DBMS_ASSERT.SIMPLE_SQL_NAME(table_name);
EXECUTE IMMEDIATE sql_stmt INTO :result;
DBMS_OUTPUT.PUT_LINE('レコード数: ' || result);
END;
10. まとめと次のステップ
・まとめ: PL/SQLでの基本的な操作と構文を通じて、データベース内でのプログラミングの可能性を示しました。
・次のステップ: 実際の業務に応用しやすいプロシージャやトリガーのカスタマイズについて学びを進めることを推奨。
[参考]
データベースPL/SQL言語リファレンス – 1 PL/SQLの概要
コメント