【初心者用】PL/SQLとは

今度の案件で触ることになりそうなので、PL/SQLも触ることになりそうなので今回まとめたいと思います。

SQLのクエリ操作などの基礎は全て学びなおしたのですが、PL/SQLの操作はまた別のようなので学んでいきたいと思います。

1. そもそもPL/SQLって何?


PL/SQLはオラクル社が開発した手続き型言語となっており、非手続き型言語のSQLを拡張したものとなっています。

SQLでは本来使用することのできないif,for,loopなどの制御を行うことができ、クエリ操作のみだけではできないより効率的な処理を行うことが可能となっています。


PL/SQLでは例えば表から取り出したデータを元に、レコードを更新するかどうかを判断するまたはあるSQLを指定した回数で繰り返し実行するなど、SQL単体では行えない一連の処理(手続き処理)を実行することができます。

PL/SQLは無名のPL/SQLプログラムとストアドプログラムがあり、上記は無名のPL/SQLプログラムとなっています。


ストアドプログラムの場合は、さらにストアドファンクションとストアドプロシージャに分かれています。

処理実行後に戻り値があるのがストアドファンクション、戻り値がないのがストアドプロシージャとなっています。


PL/SQLの基本構造は宣言部、実行部、例外処理部の3つで構成されています。

無名のPL/SQLプログラムは以下のような構造となっています。

1-1. DECLARE 宣言部 BEGIN 実行部

EXCEPTION 例外処理部
END;

ストアドプログラムの場合は、戦闘にも関数名を記名し例えばストアドプロシージャの場合は以下のような形になります。

1-2. CREATE OR REPLACE PROCEDURE 関数名

IS 宣言部
BIGIN 実行部
EXCEPTION 例外処理部
END;

1-3. PL/SQL宣言部の記述方法

宣言部では変数や配列カーソル及び例外定義などの、PL/SQLブロックで使用するオブジェクトを定義します。

◆関数名の記述方法

・ストアドプロシージャ
CREATE OR REPLACE PROCEDURE 関数名
IS ・・・

・ストアドファンクション
CREATE OR REPLACE FUNCTION 関数名
RETURN BOOLEAN 戻り値のデータ型
IS ・・・

1-4. 変数の指定

変数は処理をするデータを一時的に保管しておくための場所です。

基本的にはデフォルト値はNULLが入っており、値を入れる際の演算子は「:=」を使用します。

また、NULLがデフォルト値で入っていますが、NOT NULLオプションを使用することで変数にNULLが入ることを防ぐことができます。


・定義例
DECLARE code NUMBER(文字数) 数値型の変数を宣言
message VARCHAR2(文字数) := 文字列型の変数を宣言
BIGIN ・・・

1-5. 配列の指定

PL/SQLは配列のことをコレクションとも呼び、コレクションには連想配列、ネストした表、VARRAYの3種類があります。

◆連想配列

連想配列は配列の添え字のデータ型と要素のデータを宣言します。添え字には数値型だけでなく文字列も使用することができます。

また、添え字は連続した値を使用する必要がなく、配列サイズは自動的に拡張されていきます。


・連想配列の宣言例
DECLARE 数値を添え字に持つ連想配列を宣言
TYPE my_code IS TABLE OF VARCHAR2(文字数) INDEX BY BINARY_INTEGER;
BIGIN ・・・

◆ネスト

ネストした表に関しては添え字は数値型のみですが、上限がない一次元配列となっています。

ネストは連続した値である必要がなく、要素を順序付けすることがなく格納することができます。


・ネスト定義例
DECLARE ネストした表を宣言
TYPE my_nest IS TABLE OG VARCHAR2(10);
BIGIN ・・・

◆VARRAY 

VARRAYは可変長配列となっており、宣言時に要素数の指定が必要となっており、添え字は連続した値で配列のサイズは自動拡張されません。

・VARRAY定義例
DECLARE VARRAYを宣言
TYPE my_varray IS VARRAY OF VARCHAR(文字数);
BIGIN ・・・

◆カーソル

PL/SQLではテーブルからデータを取得し、それを元に処理を行うことができます。

また、テーブルからデータを取得し一時的に格納する変数にカーソルがあります。


・カーソル定義例
DECLARE カーソルを宣言
CURSOL cl IS SELECT EMPNO FROM EMPLOVEE;
BIGIN ・・・

1-6. PL/SQL処理部の記述方法

◆分岐

SL/SQLのIF分では一般的にはプログラミング言語と同じように分岐を記述することができます。

また、他のプログラミング言語では「ELSEIF」となるところが「ELSIF」となります。

・IF文の記述
BEGIN
IF (比較変数='値指定')THEN
message:="指定メッセージ";
ELSIF (比較変数='値指定')THEN
message:="指定メッセージ";
END IF;

◆FOR文

BEGIN
FOR i IN 条件 LOOP
条件
END LOOP;

◆例外処理

EXCEPTION
WHEN 例外 THEN
例外処理
END;

2. PL/SQLのメリット


Oracle Databaseを使用するシステム開発では、プログラミング言語としてPL/SQLを使用すると、その特徴によって様々なメリットがあります。

そのメリットについて以下まとめていきたいと思います。

2-1. パフォーマンスが優秀

Oracle Databaseを使用している環境でPL/SQLを使用すると、PL/SQLの手続き処理とSQL処理をOracle Database上で一緒に行うことができます。

それにより、他のプログラミング言語と比較して、プロセス間通信のオーバーヘッドやネットワークトラフィックを軽減できます。


PL/SQLはSQLを含めたプログラム全体をまとめてデータベースに送信して処理をします。

一方のPL/SQL以外のSQLでは、文単位で送信されるためまとめて送信するPL/SQLの方が効率が良く処理ができます。

2-2. SQLとの親和性が高い

PL/SQLはSQLを拡張したプログラミング言語となっているので、SQLとの親和性が高くなっています。

普通のSQLとは違いPL/SQLでは、SQLのすべての文や関数を使用することができます。


また、すべてのSQLのデータ型もサポートされているため、SQLとPL/SQL間でデータ型の変換作業も必要がありません。

2-3. プログラムをデータベースに格納して、必要な時に呼び出せる

PL/SQLプログラムは、「無名のPL/SQLプログラム」と「ストアド・サブプログラム」に分類することができます。

無名のPL/SQLプログラムとは、クライアント側からOracle Databaseにプログラムを送信し、実行するプログラムのことです。

こちらは手軽な半面、都度プログラムの送信やOracle Databaseでの解析、実行処理が発生します。


一方のストアド・サブプログラムは、プログラムに名前を付け、解析された(構文などのチェック済みの)状態でOracle Databaseに格納したプログラムのことです。

ストアド・サブプログラムは、そのプログラム名を指定するだけで実行できます。


また、ポイントは実行のたびにプログラムをOracle Databaseに送信する必要がないことと、解析に掛かるOracle Database側のオーバーヘッドを削減できることです。

その他に、ストアド・サブプログラムはデータベースに格納済みであることから、複数のユーザーで同じプログラムを共有できることもメリットです。

3. まとめ


総合的にまとめると

 ・パフォーマンスが優秀

 ・SQLとの親和性が高い

 ・プログラムをデータベースに格納して必要な時に呼び出せる

となります。


PL/SQLは覚えることにより、効率的にSQLを使用することができるので覚えられるなら覚えておくとよいかもしれません。