|
||||||||||||||||||||||||||||
| 前のページ 1 2 | ||||||||||||||||||||||||||||
| ストアドプロシージャの移行 | ||||||||||||||||||||||||||||
|
Oracle、PostgreSQLともに複数の言語でストアドプロシージャを作成することができます。OracleではPL/SQLまたはJava、PostgreSQLではPL/pgSQL、Perl、Tcl、Python、さらに最近ではJavaでもストアドプロシージャを作成することができます。 ここではOracleのPL/SQLと、PostgreSQLのPL/pgSQLを使った移行方法を説明します。一見すると、PL/SQLとPL/pgSQLはよく似ています。しかし、細かいところで重要な違いがいくつかありますので注意が必要です。 |
||||||||||||||||||||||||||||
| ファンクションとプロシージャ | ||||||||||||||||||||||||||||
|
OracleのPL/SQLでは、簡単に言うと返す値の数によって、ストアドファンクションとストアドプロシージャが区別されます。ストアドファンクションは1つの値を返しますが、ストアドプロシージャはOUT系パラメータ【注4】を使用して複数の値を返すことができます。
※注4:
OUT系パラメータについては後述します。
一方PostgreSQLでは、ストアドファンクションとストアドプロシージャの区別はありません。PostgreSQLのストアドプロシージャは常に1つの値しか返せないので、Oracleの用語で厳密に言えばストアドファンクションになります。 ただし、PostgreSQLのストアドプロシージャは、複合型を戻り値とすることで擬似的に複数の値を返すことが可能です。この方法についても後述します。 |
||||||||||||||||||||||||||||
| 宣言方法の違い | ||||||||||||||||||||||||||||
|
まず、PL/SQL(リスト11リスト12)とPL/pgSQL(リスト13)における宣言方法の違いを見てみましょう。パッと見てわかるとおりとてもよく似ています。 |
||||||||||||||||||||||||||||
CREATE FUNCTION ファンクション名( 引数)
|
||||||||||||||||||||||||||||
|
リスト11:Oracleのストアドファンクションの例 |
||||||||||||||||||||||||||||
CREATE PROCEDURE プロシージャ名( 引数) IS
|
||||||||||||||||||||||||||||
|
リスト12:Oracleのストアドプロシージャの例 |
||||||||||||||||||||||||||||
CREATE FUNCTION ファンクション名( 引数)
|
||||||||||||||||||||||||||||
|
リスト13:PostgreSQLのストアドプロシージャの例 |
||||||||||||||||||||||||||||
| PL/SQLのストアドファンクションにおけるRETURN句は、PostgreSQLではRETURNS句になることに注意してください。また、PostgreSQLではストアドプロシージャの本体部分が1つの文字列として扱われていることにも注意してください。LANGUAGE句には、ストアドプロシージャの記述言語を指定します。plperlと指定すれば、Perl言語でストアドプロシージャを書くことも可能です。 |
||||||||||||||||||||||||||||
| 無名ブロック | ||||||||||||||||||||||||||||
|
Oracleには、下の例のように宣言を省略して直接実行できる「無名ブロック」の機能がありますが、PostgreSQLにはありません。 |
||||||||||||||||||||||||||||
BEGIN
|
||||||||||||||||||||||||||||
| このためPostgreSQLでは、どんな小さなものでも必ず宣言してから呼び出す、という手順を踏む必要があります。 |
||||||||||||||||||||||||||||
|
前のページ 1 2 |
||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||

