Fujitsu Enterprise Postgres 16 SPz以前に提供されていたDBMS_SQLパッケージを説明します。
ここで説明するインタフェースは、Fujitsu Enterprise Postgres 16 SPz以前のアプリケーションに対する互換用のインタフェースです。将来的にサポート対象外となるため、アプリケーションの互換以外の目的では使用しないでください。
機能 | 説明 |
---|---|
BIND_VARIABLE | SQL文内のホスト変数に値を設定します。 |
CLOSE_CURSOR | カーソルをクローズします。 |
COLUMN_VALUE | FETCH_ROWSを実行して取り出した選択リストの列の値を取得します。 |
DEFINE_COLUMN | 値を取り出す列と格納先を定義します。 |
EXECUTE | SQL文を実行します。 |
FETCH_ROWS | 指定したカーソルの次の行に位置付け、行から値を取り出します。 |
OPEN_CURSOR | 新規カーソルをオープンします。 |
PARSE | SQL文を解析します。 |
注意
DBMS_SQLでは、利用者が動的SQLを実行する上でデータ型を意識する必要があり、使えるデータ型が限られます。以下のデータ型をサポートします。
INTEGER
DECIMAL
NUMERIC
REAL
DOUBLE PRECISION
CHAR(注1)
VARCHAR(注1)
NCHAR(注1)
NCHAR VARYING(注1)
TEXT
DATE
TIMESTAMP WITHOUT TIME ZONE
TIMESTAMP WITH TIME ZONE
INTERVAL(注2)
SMALLINT
BIGINT
注1)
CHAR型、VARCHAR型、NCHAR型、NCHAR VARYING型のホスト変数は、文字列関数の引数や戻り値と合わせるためにTEXT型として扱います。文字列関数の詳細については、“PostgreSQL Documentation”の“The SQL Language”の“String Functions and Operators”を参照してください。
Oracleデータベース互換機能のNVLおよびDECODEの引数に指定する場合は、引数間のデータ型が同じになるように、ホスト変数に対してCASTによりデータ型を変換してください。
例
探索条件にNVLを指定し、NVLの引数としてNCHAR型のホスト変数を期待する場合。
col1:NCHAR型の列
h1:NCHAR型のホスト変数
PERFORM DBMS_SQL.PARSE(cursor, 'SELECT col2 FROM t3 WHERE NVL(col1,CAST(:h1 AS NCHAR(3))) = N''あいう''', 1); PERFORM DBMS_SQL.BIND_VARIABLE(cursor, ':h1', N'あいう');
注2)
選択リストに指定したINTERVAL型の値をCOLUMN_VALUEで取得する場合、選択リストの時間隔修飾子と同じか時間隔修飾子を指定しないなど範囲の広いINTERVAL型の変数を指定してください。狭い範囲の時間隔修飾子の変数を指定すると、その時間隔修飾子の範囲の値を取得しますが、範囲外の値が切り捨てられたというエラーは発生しません。
例
選択リストにINTERVAL値を返す値式を設定し、その結果をCOLUMN_VALUEで受け取る場合。なお、例に記載したSQL文の演算結果はINTERVAL DAY TO SECONDの範囲の値を返します。
[悪い例]
変数(v_interval)がINTERVAL DAY TO HOURのため、MINUTE以降の値が切り捨てられます。
v_interval INTERVAL DAY TO HOUR;
・・・
PERFORM DBMS_SQL.PARSE(cursor, 'SELECT CURRENT_TIMESTAMP - ''2010-01-01'' FROM DUAL', 1);
・・・
SELECT value INTO v_interval FROM DBMS_SQL.COLUMN_VALUE(cursor, 1, v_interval);
結果:1324 days 09:00:00
[良い例]
変数(v_interval)をINTERVALとすることで、値を正しく受け取ります。
v_interval INTERVAL;
・・・
PERFORM DBMS_SQL.PARSE(cursor, 'SELECT CURRENT_TIMESTAMP - ''2010-01-01'' FROM DUAL', 1);
・・・
SELECT value INTO v_interval FROM DBMS_SQL.COLUMN_VALUE(cursor, 1, v_interval);
結果:1324 days 09:04:37.530623
{ BIND_VARIABLE(cursor, varName, val [, len ]) | CLOSE_CURSOR(cursor) | COLUMN_VALUE(cursor, colPos, varName) | DEFINE_COLUMN(cursor, colPos, varName [, len ]) | EXECUTE(cursor) | FETCH_ROWS(cursor) | OPEN_CURSOR([parm1 ]) | PARSE(cursor, sqlStmt, parm1 [, parm2, parm3, parm4 ]) }