| ||||||||||||||||||||||||||||
| 前のページ 1 2 | ||||||||||||||||||||||||||||
| フェッチ | ||||||||||||||||||||||||||||
上述したカーソル属性同様、PostgreSQLではFETCH文の振る舞いも異なります。まずはOracleの例を見てください(リスト23) | ||||||||||||||||||||||||||||
DECLARE | ||||||||||||||||||||||||||||
リスト23:OracleのFETCH文の例 | ||||||||||||||||||||||||||||
| Oracleでは最後の行に達した後も、FETCH文のターゲット変数がNULLになりません。実行結果を見てみましょう(図16)。 | ||||||||||||||||||||||||||||
顧客名= (株)ワイキキソフト | ||||||||||||||||||||||||||||
図16:リスト23の実行結果 | ||||||||||||||||||||||||||||
| それに比べて、PostgreSQLでは最後の行に達した後は、FETCH文のターゲット変数にNULLが代入されます(リスト24)。 | ||||||||||||||||||||||||||||
CREATE OR REPLACE FUNCTION TEST_FETCH() | ||||||||||||||||||||||||||||
リスト24:PostgreSQLのFETCH文の例 | ||||||||||||||||||||||||||||
| さきほどのOracleの実行結果(図16)と図17を比べてください。 | ||||||||||||||||||||||||||||
INFO: 顧客名= (株)ワイキキソフト | ||||||||||||||||||||||||||||
図17:リスト24の実行結果 | ||||||||||||||||||||||||||||
この微妙な振る舞いの違いがあるため、PostgreSQLではリスト25にあるような、Oracleでよく使われるループの書き方ができません。 | ||||||||||||||||||||||||||||
DECLARE | ||||||||||||||||||||||||||||
リスト25:Oracleでのループ例 | ||||||||||||||||||||||||||||
| リスト25の実行結果は次のようになります。 | ||||||||||||||||||||||||||||
顧客IDが一番大きい顧客 = (株)ランヌ | ||||||||||||||||||||||||||||
| このため、PostgreSQLではリスト26のようにフェッチ結果の変数への代入を2段階に分ける必要があります。 | ||||||||||||||||||||||||||||
CREATE OR REPLACE FUNCTION TEST_FETCH2() | ||||||||||||||||||||||||||||
リスト26:PostgreSQLでのフェッチ結果の代入例 | ||||||||||||||||||||||||||||
| これは、PostgreSQLでは次のように単純に変換してしまうと、ループを抜けた後のNAME変数の中身が最後のフェッチ内容ではなくNULLになってしまうためです。 | ||||||||||||||||||||||||||||
LOOP | ||||||||||||||||||||||||||||
| 前のページ 1 2 | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||

