DBMS_SQLの各機能について説明します。
BIND_VARIABLEは、SQL文内のホスト変数に値を設定します。
カーソル番号(cursor)は処理対象のカーソル番号です。
ホスト変数名(varName)はSQL文内のホスト変数の名前を文字列で指定します。
値式(val)はホスト変数に設定する値です。ホスト変数は、値式のデータ型になります。そして、SQL文中の指定場所に応じて暗黙的に型変換されます。暗黙の型変換については、“A.3 暗黙の型変換”を参照してください。
文字列長(len)は値式が文字列型の場合の文字数です。文字列長の指定がない場合は、文字列全体の長さとなります。
SQL文のホスト変数は、ホスト変数を識別するために先頭にコロンを付ける必要があります。BIND_VARIABLEで指定するホスト変数名はコロンを付加してもしなくても構いません。以下にSQL文で指定するホスト変数名とBIND_VARIABLEで指定するホスト変数名の例を示します。
PERFORM DBMS_SQL.PARSE(cursor, 'SELECT emp_name FROM emp WHERE sal > :x', 1);
この例では、BIND_VARIABLEは次のようになります。
PERFORM DBMS_SQL.BIND_VARIABLE(cursor, ':x', 3500);
または、
PERFORM DBMS_SQL.BIND_VARIABLE(cursor, 'x', 3500);
ホスト変数名の長さは、30バイト以下(コロンを除く)である必要があります。
設定する値のデータ型が文字列の場合、第4引数として列値の有効サイズを指定します。
例
設定する値のデータ型が文字列以外の場合
PERFORM DBMS_SQL.BIND_VARIABLE(cursor, ':NO', 1);
設定する値のデータ型が文字列の場合
PERFORM DBMS_SQL.BIND_VARIABLE(cursor, ':NAME', h_memid, 5);
CLOSE_CURSORは、カーソルをクローズします。
カーソル番号(cursor)は処理対象のカーソル番号です。
戻り値はNULL値です。
例
cursor := DBMS_SQL.CLOSE_CURSOR(cursor);
COLUMN_VALUEは、FETCH_ROWSを実行して取り出した選択リストの列の値を取得します。
カーソル番号(cursor)は処理対象のカーソル番号です。
列位置(colPos)はSELECT文の選択リストの列の位置です。最初の列の位置は1です。
変数名(varName)は、格納先の変数名を指定します。
取り出した情報は、SELECT文でvalue, column_error, actual_lengthの列の値として取得します。
valueは列位置で指定した列の値を返却します。変数名のデータ型は列のデータ型に合わせてください。PARSEに指定したSELECT文の選択リストの列がDBMS_SQLに対応していないデータ型の場合、CASTを使って対応するデータ型に型変換してください。
column_errorはNUMERIC型です。列の値が、valueに正しく設定できなかった場合に、0以外の値を返却します。
22001 : 取り出した文字列が切り捨てられている
22002 : 取り出した値の内容がNULL値
actual_lengthはINTEGER型です。取り出した値が文字列型の場合は、文字数を返却します。切り捨てられている場合、切り捨てられる前の文字数を返却します。文字列型でない場合は、バイト数を返却します。
例
列の値、エラーコード、列値の実際の長さを取得する場合
SELECT value, column_error, actual_length INTO v_memid, v_col_err, v_act_len FROM DBMS_SQL.COLUMN_VALUE(cursor, 1, v_memid);
列の値だけを取得する場合
SELECT value INTO v_memid FROM DBMS_SQL.COLUMN_VALUE(cursor, 1, v_memid);
DEFINE_COLUMNは、値を取り出す列と格納先を定義します。
カーソル番号(cursor)は処理対象のカーソル番号です。
列位置(colPos)はSELECT文の選択リストの列の位置です。最初の列の位置は1です。
変数名(varName)は、格納先を指定します。格納先のデータ型は、値を取り出す列のデータ型に合わせてください。PARSEに指定したSELECT文の選択リストの列がDBMS_SQLに対応していないデータ型の場合、CASTを使って対応するデータ型に型変換してください。
文字列長(len)は文字列型の列に対する列値の最大の文字数です。
列値のデータ型が文字列の場合、第4引数として列値の有効サイズを指定します。
例
列値のデータ型が文字列以外の場合
PERFORM DBMS_SQL.DEFINE_COLUMN(cursor, 1, v_memid);
列値のデータ型が文字列の場合
PERFORM DBMS_SQL.DEFINE_COLUMN(cursor, 1, v_memid, 10);
EXECUTEは、SQL文を実行します。
カーソル番号(cursor)は処理対象のカーソル番号です。
戻り値は、INTEGER型で、INSERT文、UPDATE文、DELETE文の場合のみ有効で、処理した行数です。それ以外の場合は無効です。
例
ret := DBMS_SQL.EXECUTE(cursor);
FETCH_ROWSは、次の行に位置付け、行から値を取り出します。
カーソル番号(cursor)は処理対象のカーソル番号です。
戻り値は、INTEGER型で、取り出した行数です。すべて取り出した場合は0を返却します。
取り出した情報はCOLUMN_VALUEで取得します。
例
LOOP IF DBMS_SQL.FETCH_ROWS(cursor) = 0 THEN EXIT; END IF; ・ ・ ・ END LOOP;
OPEN_CURSORは、新規のカーソルをオープンします。
パラメータ1(parm1)はOracleデータベースとの互換のためのパラメータであり、Fujitsu Enterprise Postgresでは目的を持たないパラメータです。INTEGER型が指定可能で、指定値は無視されます。指定値に意味はありませんが、指定する場合は1を指定してください。なお、Oracleデータベースから移行する場合、指定値を変更する必要はありません。
不要になったカーソルはCLOSE_CURSORを実行してクローズしてください。
戻り値は、INTEGER型で、カーソル番号です。
例
cursor := DBMS_SQL.OPEN_CURSOR();
PARSEは、動的SQL文の解析を行います。
カーソル番号(cursor)は処理対象のカーソル番号です。
SQL文(sqlStmt)は解析するSQL文です。
パラメータ1(parm1)、パラメータ2(parm2)、パラメータ3(parm3)およびパラメータ4(parm4)は、Oracleデータベースとの互換のためのパラメータであり、Fujitsu Enterprise Postgresでは目的を持たないパラメータです。指定値は無視されます。指定値に意味はありませんが、指定する場合は以下の値を指定してください。
- パラメータ1はINTEGER型で、1を指定してください。
- パラメータ2およびパラメータ3はTEXT型で、指定する場合はNULLを指定してください。
- パラメータ4はBOOLEAN型で、指定する場合はTRUEを指定してください。
なお、Oracleデータベースから移行する場合、パラメータ2、パラメータ3およびパラメータ4は、指定値を変更する必要はありません。
SQL文のホスト変数は、先頭にコロンを付けます。
DDL文はPARSEを発行した時点で実行されます。DDL文のEXECUTEは不要です。
オープンしているカーソルに対して再度PARSEを呼び出した場合は、カーソル内のデータ領域の内容をリセットし、新たにSQL文の解析を行います。
例
PERFORM DBMS_SQL.PARSE(cursor, 'SELECT memid, memnm FROM member WHERE memid = :NO', 1);