ページの先頭行へ戻る
Enterprise Postgres 17 SP1 アプリケーション開発ガイド

G.3 Fujitsu Enterprise Postgres 16 SPz以前のDBMS_SQLパッケージ

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 ]) 
}