PL/SQLとは
システム開発でデータベースを利用する際、SQL文でデータを参照・更新することは欠かせない作業です。 しかし、SQLには単純なデータ操作以外の処理を行う機能が備わっていないため、SQLだけでは複雑な処理を行うことができません。
そこで役立つのが、Oracle Databaseにおいてデータベース言語SQLを拡張したプログラミング言語である「PL/SQL」です。
PL/SQLはSQL文に変数の利用や条件分岐、反復処理などのプログラミング機能を加えた手続き型言語で、データベース内に保存されたデータに対して、より高度な処理を実装することができます。
PL/SQLの概要
PL/SQLとはどのようなものでしょうか。PL/SQLはOracleDatabaseの手続き型言語で、ブロック構造を持つことが特徴として挙げられます。似た言語であるpostgresqlのPL/pgSQLとの違いも確認しましょう。
OracleDatabaseの手続き型言語
PL/SQLとは、OracleDatabaseにおいて、さまざまな手続き処理を行うために用いられるプログラミング言語です。読み方は「ピーエルエスキューエル」です。
PL/SQLは、非手続き型言語であるSQLを手続き型言語として拡張したもので、SQL単体では行えない一連の処理(手続き処理)を実行できます。
例えば、取得したデータに基づいて条件分岐を行い、レコードの更新や削除を判断したり、ループ処理を利用して、同一のSQLを複数回実行したりすることが可能です。
また、PL/SQLでは、SQLの宣言的なデータ操作と手続き型プログラミングの機能の両方を使用可能です。データベース操作がSQLで実現可能な場合は、PL/SQLプログラム内からSQLを直接実行することもできます。
既存のSQLスキルを活かしながら、条件分岐やループなどの便利な制御構造を利用できるのがPL/SQLの特徴です。
ブロック構造
PL/SQLは宣言部、実行部、例外処理部のブロック構造で構成されており、各ブロックはDECLARE、BEGIN、EXCEPTION、ENDのキーワードで分けられます。
PL/SQLブロックはこの構造に従って記述され、データベースに送信されて実行されるため、この基本的な構造を理解することが重要です。
PostgreSQLのPL/pgSQLとの違い
PL/SQLに似た存在として、PostgreSQLのPL/pgSQLがあります。PostgreSQLはOracleDatabaseと同じくリレーショナルデータベース(RDBMS)の1つです。
PL/pgSQLはPL/SQLを参考に実装されており、文法など似ている部分もありますが、RDBMSに依存する部分があるため、完全な互換性はありません。
PL/SQLのメリット
PL/SQLを使うことで、どのようなメリットがあるのでしょうか。SQLとの連携が緊密であること、パフォーマンスが高いこと、生産性・移植性が高いことが挙げられます。
SQLとの連携が緊密
PL/SQLのメリットとして、まずSQLと密に連携していることがあります。PL/SQLプログラム内では、データ操作やトランザクション制御のSQL文、SQL関数、演算子、擬似列といった機能を利用することが可能です。
また、全てのSQLデータ型もサポートされているため、SQLとPL/SQL間でデータ型の変換作業も必要ありません。
例えば、SQL文で取得したNUMBER型の列の値を、PL/SQLで宣言した同じNUMBER型の変数に直接割り当てることが可能です。これにより、SQLとPL/SQLの間でデータを効率的にやり取りすることができます。
また、PL/SQLではプログラム内に直接SQLステートメントを記述する静的SQLと、実行時にSQL文を動的に構築する動的SQLの両方を柔軟に使い分けることができます。
パフォーマンスが高い
PL/SQLはOracleDatabase上で、PL/SQLによる手続き処理とSQLによるデータ処理を組み合わせて実行できるため、高いパフォーマンスを発揮できます。
PL/SQL以外のプログラムを使う場合にはSQLが文単位で送信されますが、PL/SQLでは、SQLを含むプログラム全体をまとめてOracleDatabaseに送信して処理できるため、全体の通信量を低減させ、効率化することが可能です。
また、PL/SQLコンパイラには、コードのパフォーマンスが向上するようにコードを再調整するオプティマイザがあり、より効率的なプログラムを作成できます。
生産性、移植性が高い
PL/SQLで作成されたアプリケーションは、OracleDatabaseが動作する環境であれば、コードそのものを変更することなく、どの環境でも動作させることができます。
そのため、OSやプラットフォームの違いを意識せずアプリケーションの開発やメンテナンスを行えるため、生産性が向上します。
また、PL/SQLアプリケーションはプログラミング環境の違いを気にすることがないため、移植性も高いと言えます。さらに、JavaやVBなどの他の言語からもPL/SQLを呼び出せるため、言語に依存しにくいのも特徴です。
PL/SQLの基本構造
PL/SQLプログラムは、PL/SQLブロックで構成されます。ブロックは、宣言部(DECLARE)、実行部(BEGIN)、例外処理部(EXCEPTION)の3つの部分から構成されています。最後にENDキーワードでブロックの終了を宣言します。
処理部は必ず存在する必要がありますが、宣言部と例外処理部は、オブジェクトの定義や例外処理の必要がない場合には省略が可能です。
宣言部
PL/SQLの宣言部では、変数、カーソル、コレクションなどのオブジェクトを定義します。
変数とは一時的にデータを格納する場所で、宣言時には初期値としてNULLが設定されています。しかし、NOT NULLオプションを付与することで、NULLの格納を許可しない変数とすることもできます。その場合は初期値を明示的に指定する必要があります。
カーソルは、テーブルからデータを取得し、メモリ上に一時的に格納する変数です。これにより、取得したデータに対する処理を行うことができます。
コレクションはPL/SQLにおける配列の概念で、結合配列(連想配列)、ネストした表、可変配列(VARRAY)の3種類があります。
このように、宣言部では様々なオブジェクトを適切に定義し、実行部で使用できるよう準備をします。
実行部
実行部は、宣言部で定義した変数やカーソルなどを使用してSQL文や制御構造を記述し、実際にプログラムが実行されます。
具体的には、SQL文を記述してデータベースの操作を行ったり、分岐文(IF文)や繰り返し文(LOOP文)を使用して処理の流れを制御したりします。
IF文は、他のプログラミング言語と同様に条件による分岐処理を行うものです。
また、FOR...LOOP文、WHILE...LOOP文、LOOP文などを用いて繰り返し処理を実装します。これらの構文を使うことで、所定の条件が満たされる間、あるいは指定された回数分だけ処理を繰り返し実行することができます。
例外処理部
PL/SQLにおける例外処理は、プログラムの実行中に発生するエラーを適切に処理するための仕組みです。内部例外やユーザが定義した例外、未定義の例外に対する処理方法を記述することができます。
プログラムの実行中にエラーが発生した場合でも、例外処理を活用してプログラムを継続させることが可能で、予期せぬエラーにも柔軟に対応することができます。
ストアドプログラムとは
PL/SQLのプログラムには、一時的に利用できるプログラムだけでなく、データベース内に格納して呼び出して使用できるストアドプログラムがあります。
プログラムをデータベースに格納できる
PL/SQLで記述できるプログラムには、無名のPL/SQLプログラム(無名ブロック)と、ストアドプログラムがあります。
無名のPL/SQLプログラムは一時的なもので、実行後に消去されます。一方、ストアドプログラムはPL/SQLコードに名前を付与してデータベース内に登録することで、後から呼び出し可能です。
ストアドプログラムを活用することで、プログラムを再利用・メンテナンスできる利点があります。
また、ストアドプログラムは事前にコンパイルされているため、無名のPL/SQLプログラムに比べて実行時のパフォーマンスが優れています。
ただし、参照するテーブルの構成を変更した場合には、再コンパイルが必要なことに注意が必要です。
ストアドプロシージャ
ストアドプロシージャは、戻り値を持たず、単に処理を実行するストアドプログラムです。データの挿入、更新、削除などの操作を含むバッチ処理などの一連のデータベース操作処理手続きを実装する際に主に使用されます。
また、例外処理の仕組みを備えており、エラーが発生した場合にトランザクションをロールバックすることが可能です。
ストアドファンクション
ストアドファンクションは、ストアドプロシージャと違い、戻り値を返すストアドプログラムです。
一般的には、ストアドファンクションではINSERT、UPDATE、DELETEなどのデータ変更操作は行わず、パラメータとして渡された値の判定や変換処理、値の抽出などを行い、処理結果として戻り値を返します。
エラーが発生した場合は例外を捕捉しますが例外処理は行わず、エラーが発生したことを示す値を返すことが一般的です。
ストアドファンクションは1度定義しておけば、後で何度でも使用することができるため、活用することで処理効率を向上させることができます。
PL/SQLを習得してデータベース開発を効率化しよう
OracleDatabaseにおけるデータベース開発において、PL/SQLを活用すれば変数の利用や制御構造などのプログラミング機能によって、より高度なデータベース処理を実装できることが分かりました。
ストアドプロシージャ・ストアドファンクションを活用してデータベースにプログラムを格納することで再利用性が高まり、実行時のパフォーマンスを向上させることもできます。
データベースシステム開発においては、PL/SQLを利用する機会も多いでしょう。この機会に習得して、データベース操作の効率化に役立ててみてください。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから