初心者向けPL/SQL入門

Oracle Master Silver

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. 変数とデータ型

変数の宣言方法: NUMBERVARCHAR2DATEなど一般的なデータ型を紹介。
コード例: 数値計算の簡単な例。

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プロシージャが正常に完了しました。



ここではnum1num2を宣言し、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の概要

【初心者向け】Oracle SQLでの表の作成、INSERT、UPDATE、DELETEをマスター
データベースを操作する際、テーブル(表)を作成し、データを追加、更新、削除することは基本中の基本です。Oracle SQLは、強力かつ柔軟なデータベース管理システムであり、多くの企業で使われています。本記事では、Oracle SQLを使って...

コメント

タイトルとURLをコピーしました