すべてのプロダクト
Search
ドキュメントセンター

PolarDB:DBMS_SQL

最終更新日:Jun 05, 2024

DBMS_SQLパッケージは、PolarDB for PostgreSQL (Oracle互換) の動的SQLクエリをサポートしています。 アプリケーションの実行時にクエリを作成できます。

PolarDB for PostgreSQL (Compatible with Oracle) は、動的SQLステートメントのネイティブサポートを提供し、Oracleデータベースと互換性のある動的SQLステートメントを使用する方法を提供します。

表1. DBMS_SQL関数とストアドプロシージャ
関数またはストアドプロシージャデータ型戻り値タイプ説明
BIND_VARIABLE(c, name, value [, out_value_size ])ストアドプロシージャN/A値を変数にバインドします。
BIND_VARIABLE_CHAR(c, name, value [, out_value_size ])ストアドプロシージャN/ACHAR 値を変数にバインドします。
BIND_VARIABLE_RAW(c, name, value [, out_value_size ])ストアドプロシージャN/ARAW 値を変数にバインドします。
CLOSE_CURSOR(c IN OUT)ストアドプロシージャN/Aカーソルを無効にします。
COLUMN_VALUE(c, position, value OUT [, column_error OUT [, actual_length OUT ]])ストアドプロシージャN/A列の値を変数に返します。
COLUMN_VALUE_CHAR(c, position, value OUT [, column_error OUT [, actual_length OUT ]])ストアドプロシージャN/ACHAR 列の値を変数に返します。
COLUMN_VALUE_RAW(c, position, value OUT [, column_error OUT [, actual_length OUT ]])ストアドプロシージャN/ARAW 列の値を変数に返します。
DEFINE_COLUMN(c, position, column [, column_size ])ストアドプロシージャN/ASELECT リストの列を定義します。
DEFINE_COLUMN_CHAR(c, position, column, column_size)ストアドプロシージャN/ASELECT リストの CHAR 列を定義します。
DEFINE_COLUMN_RAW(c, position, column, column_size)ストアドプロシージャN/ASELECT リストの RAW 列を定義します。
DEFINE_ARRAY(c、position、table_variable、cnt、lower_bnd)ストアドプロシージャN/A行を配列としてフェッチする列を定義します。
DESCRIBE_COLUMNSストアドプロシージャN/Aカーソル結果セットを保持する列を定義します。
EXECUTE(c)機能INTEGERカーソルを実行します。
EXECUTE_AND_FETCH(c [, exact ])機能INTEGERカーソルを実行し、単一の行をフェッチします。
FETCH_ROWS(c)機能INTEGERカーソルから行をフェッチします。
IS_OPEN(c)機能BOOLEANカーソルが有効かどうかを確認します。
LAST_ROW_COUNT機能INTEGERフェッチされた行の累積数を返します。
OPEN_CURSOR機能INTEGERカーソルを有効にするEnables a cursor
PARSE(c, statement, language_flag)ストアドプロシージャN/A文を解析します。

PolarDBのDBMS_SQLパッケージは、Oracle DBMS_SQLパッケージと比較して部分的に実装されています。 PolarDBは、前の表に示した関数とストアドプロシージャのみをサポートします。

次の表に、DBMS_SQL パッケージで使用できるパブリック変数を示します。

表2. DBMS_SQLパブリック変数
パブリック変数データ型説明
nativeINTEGER1Oracle構文との互換性のために使用されます。 詳細については、「DBMS_SQL.PARSE」をご参照ください。
V6INTEGER2Oracle構文との互換性のために使用されます。 詳細については、「DBMS_SQL.PARSE」をご参照ください。
V7INTEGER3Oracle構文との互換性のために使用されます。 詳細については、「DBMS_SQL.PARSE」をご参照ください。

BIND_VARIABLE

BIND_VARIABLEストアドプロシージャは、SQL文のINまたはIN OUTバインド変数に値をバインドするために使用されます。

BIND_VARIABLE(c INTEGER、名前VARCHAR2、
  value { BLOB | CLOB | DATE | FLOAT | INTEGER | NUMBER |
          TIMESTAMP | VARCHAR2 }
  [, out_value_size INTEGER ]) 

Parameters

パラメーター説明
cバインド変数を含むSQL文のカーソルのID。
nameSQL文のバインド変数の名前。
value割り当てる値。
out_value_sizenameがIN OUT変数の場合、このパラメーターは出力値の最大長を定義します。 このパラメーターを指定しない場合には、現在の値の長さはデフォルトで最大長になります。

次の匿名ブロックは、バインド変数を使用してempテーブルに行を挿入します。

DECLARE
    curid           INTEGER;
    v_sql           VARCHAR2(150) := 'INSERT INTO emp VALUES ' ||
                        '(:p_empno, :p_ename, :p_job, :p_mgr, ' ||
                        ':p_hiredate, :p_sal, :p_comm, :p_deptno)';
    v_empno         emp.empno%TYPE;
    v_ename         emp.ename%TYPE;
    v_job           emp.job%TYPE;
    v_mgr           emp.mgr%TYPE;
    v_hiredate      emp.hiredate%TYPE;
    v_sal           emp.sal%TYPE;
    v_comm          emp.comm%TYPE;
    v_deptno        emp.deptno%TYPE;
    v_status INTEGER;
開始
    curid := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE(curid,v_sql,DBMS_SQL.native);
    v_empno    := 9001;
    v_ename    := 'JONES';
    v_job      := 'SALESMAN';
    v_mgr      := 7369;
    v_hiredate := TO_DATE('13-DEC-07','DD-MON-YY');
    v_sal      := 8500.00;
    v_comm     := 1500.00;
    v_deptno   := 40;
    DBMS_SQL.BIND_VARIABLE(curid,':p_empno',v_empno);
    DBMS_SQL.BIND_VARIABLE(curid,':p_ename',v_ename);
    DBMS_SQL.BIND_VARIABLE(curid,':p_job',v_job);
    DBMS_SQL.BIND_VARIABLE(curid,':p_mgr',v_mgr);
    DBMS_SQL.BIND_VARIABLE(curid,':p_hiredate',v_hiredate);
    DBMS_SQL.BIND_VARIABLE(curid,':p_sal',v_sal);
    DBMS_SQL.BIND_VARIABLE(curid,':p_comm',v_comm);
    DBMS_SQL.BIND_VARIABLE(curid,':p_deptno',v_deptno);
    v_status := DBMS_SQL.EXECUTE(curid);
    DBMS_OUTPUT.PUT_LINE('Number of rows processed: ' || v_status);
    DBMS_SQL.CLOSE_CURSOR(curid);
END; 
同様の出力が表示されます:
処理された行の数: 1

BIND_VARIABLE_CHAR

BIND_VARIABLE_CHARストアドプロシージャは、CHAR値をSQLステートメントのINまたはIN OUTバインド変数にバインドするために使用されます。

BIND_VARIABLE_CHAR(c INTEGER、name VARCHAR2、value CHAR)
  [, out_value_size INTEGER ]) 

Parameters

パラメーター説明
cバインド変数を含むSQL文のカーソルのID。
nameSQL文のバインド変数の名前。
value割り当てる CHAR 型の値。
out_value_sizename が IN OUT 変数の場合、このパラメーターは出力値の最大長を定義します。 このパラメーターを指定しない場合、現在の値の長さはデフォルトで最大長になります。

BIND_VARIABLE_RAW

BIND_VARIABLE_RAWストアドプロシージャは、RAW値をSQLステートメントのINまたはIN OUTバインド変数にバインドするために使用されます。

BIND_VARIABLE_RAW(c INTEGER、name VARCHAR2、value RAW)
  [, out_value_size INTEGER ]) 

Parameters

パラメーター説明
cバインド変数を含むSQL文のカーソルのID。
nameSQL文のバインド変数の名前。
value割り当てる CHAR 型の値。
out_value_sizenameがIN OUT変数の場合、このパラメーターは出力値の最大長を定義します。 このパラメーターを指定しない場合には、現在の値の長さはデフォルトで最大長になります。

CLOSE_CURSOR

CLOSE_CURSORストアドプロシージャは、カーソルを無効にするために使用されます。 カーソルを無効にすると、カーソルに割り当てられたリソースが解放され、カーソルは使用できなくなります。

CLOSE_CURSOR(cインアウト)
            

Parameters

パラメーター説明
cカーソルの ID。

次の例は、カーソルを無効にする方法を示しています。
DECLARE
    curid INTEGER;
開始
    curid := DBMS_SQL.OPEN_CURSOR;
            .
            .
            .
    DBMS_SQL.CLOSE_CURSOR(curid);
エンド; 

COLUMN_VALUE

COLUMN_VALUEストアドプロシージャは、カーソルから値を受け取る変数を定義するために使用されます。

COLUMN_VALUE(c INTEGER, position INTEGER, value OUT { BLOB |
  CLOB | DATE | FLOAT | INTEGER | NUMBER | TIMESTAMP | VARCHAR2 }
  [, column_error OUT NUMBER [, actual_length OUT INTEGER ]]) 

Parameters

パラメーター説明
c定義されている変数にデータを返すカーソルの ID。
positionカーソル内の返されたデータの位置。 カーソルの最初の値は位置 1 です。
value以前のFETCH呼び出しによってカーソルで返されたデータを受け取る変数。
column_errorエラーが生じた場合、このパラメーターは列に関連付けられたエラーコードを示します。
actual_length切り捨て前のデータの実際の長さ。

次の例は、COLUMN_VALUEストアドプロシージャを使用してカーソルから値を受け取る匿名ブロックの部分を示しています。

DECLARE
    curid           INTEGER;
    v_empno         NUMBER(4);
    v_ename         VARCHAR2(10);
    v_hiredate      DATE;
    v_sal           NUMBER(7,2);
    v_comm          NUMBER(7,2);
    v_sql           VARCHAR2(50) := 'SELECT empno, ename, hiredate, sal, ' ||
                                    'comm FROM emp';
    v_status INTEGER;
開始
            .
            .
            .
    LOOP
        v_status := DBMS_SQL.FETCH_ROWS(curid);
        EXIT WHEN v_status = 0;
        DBMS_SQL.COLUMN_VALUE(curid,1,v_empno);
        DBMS_SQL.COLUMN_VALUE(curid,2,v_ename);
        DBMS_SQL.COLUMN_VALUE(curid,3,v_hiredate);
        DBMS_SQL.COLUMN_VALUE(curid,4,v_sal);
        DBMS_SQL.COLUMN_VALUE(curid,4,v_sal);
        DBMS_SQL.COLUMN_VALUE(curid,5,v_comm);
        DBMS_OUTPUT.PUT_LINE(v_empno || '   ' || RPAD(v_ename,10) || '  ' ||
            TO_CHAR(v_hiredate,'yyyy-mm-dd') || ' ' ||
            TO_CHAR(v_sal,'9,999.99') || ' ' ||
            TO_CHAR(NVL(v_comm,0),'9,999.99'));
    END LOOP;
    DBMS_SQL.CLOSE_CURSOR(curid);
エンド; 

COLUMN_VALUE_CHAR

COLUMN_VALUE_CHARストアドプロシージャは、カーソルからCHAR値を受け取る変数を定義するために使用されます。

COLUMN_VALUE_CHAR(c INTEGER, position INTEGER, value OUT CHAR)
  [, column_error OUT NUMBER [, actual_length OUT INTEGER ]]) 

Parameters

パラメーター説明
c定義されている変数にデータを返すカーソルの ID。
positionカーソル内の返されたデータの位置。 カーソルの最初の値は位置 1 です。
value前のFETCH呼び出しによってカーソルで返されたデータを受け取るデータ型CHARの変数。
column_errorエラーが生じた場合、このパラメーターは列に関連付けられたエラーコードを示します。
actual_length切り捨て前のデータの実際の長さ。

COLUMN_VALUE_RAW

COLUMN_VALUE_RAWストアドプロシージャは、カーソルからRAW値を受け取る変数を定義するために使用されます。

COLUMN_VALUE_RAW(c INTEGER、position INTEGER、value OUT RAW)
  [, column_error OUT NUMBER [, actual_length OUT INTEGER ]]) 

Parameters

パラメーター説明
c定義されている変数にデータを返すカーソルの ID。
positionカーソル内の返されたデータの位置。 カーソルの最初の値は位置 1 です。
value前のFETCH呼び出しによってカーソルで返されたデータを受け取るデータ型RAWの変数。
column_errorエラーが生じた場合、このパラメーターは列に関連付けられたエラーコードを示します。
actual_length切り捨て前のデータの実際の長さ。

DEFINE_COLUMN

DEFINE_COLUMNストアドプロシージャは、カーソルで返されフェッチされるSELECTリスト内の列または式を定義するために使用されます。

DEFINE_COLUMN(c INTEGER, position INTEGER, column { BLOB |
  CLOB | DATE | FLOAT | INTEGER | NUMBER | TIMESTAMP | VARCHAR2 }
  [, column_size INTEGER ]) 

Parameters

パラメーター説明
cSELECTステートメントに関連付けられているカーソルのID。
position定義されている SELECT リスト内の列または式の位置。
columnSELECT 結果セットの指定された位置にある列または式のデータ型と一致する変数。
column_size返りデータの最大長。 列のデータ型が VARCHAR2 の場合は、column_size パラメーターを指定する必要があります。 column_size を超える返りデータは、column_size パラメーターで指定された最大長に切り捨てられます。

次の例は、DEFINE_COLUMNストアドプロシージャを使用して、empテーブルのempnoenamehiredatesal、およびcomm列を定義する方法を示しています。

DECLARE
    curid           INTEGER;
    v_empno         NUMBER(4);
    v_ename         VARCHAR2(10);
    v_hiredate      DATE;
    v_sal           NUMBER(7,2);
    v_comm          NUMBER(7,2);
    v_sql           VARCHAR2(50) := 'SELECT empno, ename, hiredate, sal, ' ||
                                    'comm FROM emp';
    v_status INTEGER;
開始
    curid := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE(curid,v_sql,DBMS_SQL.native);
    DBMS_SQL.DEFINE_COLUMN(curid,1,v_empno);
    DBMS_SQL.DEFINE_COLUMN(curid,2,v_ename,10);
    DBMS_SQL.DEFINE_COLUMN(curid,3,v_hiredate);
    DBMS_SQL.DEFINE_COLUMN(curid,4,v_sal);
    DBMS_SQL.DEFINE_COLUMN(curid,5,v_comm);
            .
            .
            .
エンド; 

次の例は、まったく同じ結果を生成する前述の例の代替を示しています。 データ型の長さは無関係であることにご注意ください。 empnosal、およびcomm列は、v_numNUMBER(1) として定義されていても、NUMBER(4) およびNUMBER(7,2) と同等のデータを返します。 ename列は、DEFINE_column呼び出しのlengthパラメーターで定義されている長さが最大10文字のデータを返します。 v_varcharに対して宣言されたデータ型VARCHAR2(1) によって示される長さは無視されます。 返されるデータの実際のサイズは、DEFINE_COLUMNストアドプロシージャによって決定されます。

DECLARE
    curid           INTEGER;
    v_num           NUMBER(1);
    v_varchar       VARCHAR2(1);
    v_date          DATE;
    v_sql           VARCHAR2(50) := 'SELECT empno, ename, hiredate, sal, ' ||
                                    'comm FROM emp';
    v_status INTEGER;
開始
    curid := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE(curid,v_sql,DBMS_SQL.native);
    DBMS_SQL.DEFINE_COLUMN(curid,1,v_num);
    DBMS_SQL.DEFINE_COLUMN(curid,2,v_varchar,10);
    DBMS_SQL.DEFINE_COLUMN(curid,3,v_date);
    DBMS_SQL.DEFINE_COLUMN(curid,4,v_num);
    DBMS_SQL.DEFINE_COLUMN(curid,5,v_num);
            .
            .
            .
エンド; 

DEFINE_COLUMN_CHAR

DEFINE_COLUMN_CHARストアドプロシージャは、カーソルで返されフェッチされるSELECTリスト内のCHAR列または式を定義するために使用されます。

DEFINE_COLUMN_CHAR(c INTEGER, position INTEGER, column CHAR, column_size INTEGER)

Parameters

パラメーター説明
cSELECTステートメントに関連付けられているカーソルのID。
position定義されている SELECT リスト内の列または式の位置。
columnCHAR 変数。
column_size返りデータの最大長。 colume_sizeを超える返されたデータは、column_size文字に切り捨てられます。

DEFINE_COLUMN_RAW

DEFINE_COLUMN_RAWストアドプロシージャは、カーソルで返されフェッチされるSELECTリスト内のRAW列または式を定義するために使用されます。

DEFINE_COLUMN_RAW(c INTEGER, position INTEGER, column RAW,
  column_size INTEGER) 

Parameters

パラメーター説明
cSELECTステートメントに関連付けられているカーソルのID。
position定義されている SELECT リスト内の列または式の位置。
columnRAW 変数。
column_size返りデータの最大長。 colume_sizeを超える返されたデータは、column_size文字に切り捨てられます。

DEFINE_ARRAY

DEFINE_ARRAYストアドプロシージャは、行を配列としてフェッチする列を定義します。 構文:
DEFINE_ARRAY (
   cでインテガー、
   インテガーの位置、
   <table_variable> IN <datatype>,
   cntインインテガー,
   lower_bnd IN INTEGER); 
Parameters
パラメーター説明
c配列にバインドされるカーソルのID。
position配列内の列の相対位置。
table_variable<datatype> として宣言されている変数。 <datatype> の有効な値:
  • varchar2_table
  • clob_table
  • binary_float_table
  • binary_double_table
  • blob_table
  • date_table
  • number_table
  • timestamp_table
cntフェッチされた行の数。 0より大きい整数でなければなりません。
lower_bnd結果は、この下限インデックスから始めて配列にコピーされます。

次の匿名ブロックは、tという名前のテーブルを作成し、tテーブルから2行のデータを取得します。
、テーブルtをselect i as a、2 * i as b、3 * i as c from generate_series(1,3) i;

DECLARE
  c INTEGER;
  dの数;
  n_tab dbms_sql.varchar2_Table;
  n_tab1 dbms_sql.varchar2_Table;
開始
  c := dbms_sql.open_cursor;
  dbms_sql.parse(c、
                 'select * from t',
                 dbms_sql.native);
  dbms_sql.define_array(c,1,n_tab,2,1);
  d := dbms_sql.execute(c);
  d := dbms_sql.fetch_rows(c);
  dbms_output.put_line('fetch rows is '| | d);
  dbms_sql.column_value(c、
                          1,
                          n_tab1);
    FOR i IN 1 .. dループ
      dbms_output.put_line(n_tab1(i));
    END LOOP;
  dbms_sql.close_cursor(c);
END; 
同様の出力が表示されます。
フェッチ行は2です
1
2 

DESCRIBE_COLUMNS

DESCRIBE_COLUMNSストアドプロシージャは、カーソルによって返される列を記述するために使用されます。

DESCRIBE_COLUMNS(c INTEGER、col_cnt OUT INTEGER、desc_t OUT)
  DESC_TAB); 

Parameters

パラメーター説明
cカーソルの ID。
col_cntカーソル結果セットの列数。
desc_tabカーソルによって返される各列の説明を含むテーブル。 記述はタイプDESC_RECであり、次の表の値が含まれています。
列名データ型
col_typeINTEGER
col_max_lenINTEGER
col_nameVARCHAR2(128)
col_name_lenINTEGER
col_schema_nameVARCHAR2(128)
col_schema_name_lenINTEGER
col_precisionINTEGER
col_scaleINTEGER
col_charsetidINTEGER
col_charsetformINTEGER
col_null_okBOOLEAN

EXECUTE

EXECUTE関数は、解析されたSQL文またはSPLブロックを実行するために使用されます。

ステータスINTEGER EXECUTE(c INTEGER)
            

Parameters

パラメーター説明
c解析されたSQL文またはSPLブロックのカーソルID。
statusSQL文がDELETEINSERT、またはUPDATEの場合、このパラメーターは処理されたレコードの数を示します。 このパラメータは他のステートメントには意味がありません。

次の匿名ブロックは、deptテーブルに行を挿入します。

DECLARE
    curid           INTEGER;
    v_sql           VARCHAR2(50);
    v_status INTEGER;
開始
    curid := DBMS_SQL.OPEN_CURSOR;
    v_sql := 'INSERT INTO dept VALUES (50, ''HR'', ''LOS ANGELES'')';
    DBMS_SQL.PARSE(curid, v_sql, DBMS_SQL.native);
    v_status := DBMS_SQL.EXECUTE(curid);
    DBMS_OUTPUT.PUT_LINE('Number of rows processed: ' || v_status);
    DBMS_SQL.CLOSE_CURSOR(curid);
エンド; 

EXECUTE_AND_FETCH

EXECUTE_AND_FETCH関数は、解析されたSELECTステートメントを実行し、1行をフェッチするために使用されます。

ステータスINTEGER EXECUTE_AND_FETCH(c INTEGER)
  [, 正確なブーリアン]) 

Parameters

パラメーター説明
cSELECTステートメントのカーソルのID。
exact
  • このパラメーターが FALSE に設定されている場合、例外は生じません。 デフォルト値は FALSE です。
  • このパラメーターがTRUEに設定され、結果セットの行数が1に等しくない場合、例外が発生します。
  • このパラメーターが TRUE に設定され、結果セットにレコードが含まれていない場合、NO_DATE_FOUND 例外が生じます。
  • このパラメーターが TRUE に設定されていて、結果セットに複数のレコードが含まれている場合、TOO_MANY_ROWS 例外が生じます。
status
  • 行がフェッチされると、1が返されます。
  • フェッチされた行がない場合、0が返されます。
  • 例外が生じた場合には、値は返されません。

次のストアドプロシージャでは、EXECUTE_AND_FETCH関数を使用して、従業員の名前を使用して1人の従業員を取得します。 従業員が見つからない場合、または同じ名前の従業員が複数見つかった場合は、例外が生じます。

CREATE OR REPLACE PROCEDURE select_by_name ()
    p_ename emp.ename % TYPE
)
IS
    curid           INTEGER;
    v_empno         emp.empno%TYPE;
    v_hiredate      emp.hiredate%TYPE;
    v_sal           emp.sal%TYPE;
    v_comm          emp.comm%TYPE;
    v_dname         dept.dname%TYPE;
    v_disp_date     VARCHAR2(10);
    v_sql           VARCHAR2(120) := 'SELECT empno, hiredate, sal, ' ||
                                     'NVL(comm, 0), dname ' ||
                                     'FROM emp e, dept d ' ||
                                     'WHERE ename = :p_ename ' ||
                                     'AND e.deptno = d.deptno';
    v_status INTEGER;
開始
    curid := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE(curid,v_sql,DBMS_SQL.native);
    DBMS_SQL.BIND_VARIABLE(curid,':p_ename',UPPER(p_ename));
    DBMS_SQL.DEFINE_COLUMN(curid,1,v_empno);
    DBMS_SQL.DEFINE_COLUMN(curid,2,v_hiredate);
    DBMS_SQL.DEFINE_COLUMN(curid,3,v_sal);
    DBMS_SQL.DEFINE_COLUMN(curid,4,v_comm);
    DBMS_SQL.DEFINE_COLUMN(curid,5,v_dname,14);
    v_status := DBMS_SQL.EXECUTE_AND_FETCH(curid,TRUE);
    DBMS_SQL.COLUMN_VALUE(curid,1,v_empno);
    DBMS_SQL.COLUMN_VALUE(curid,2,v_hiredate);
    DBMS_SQL.COLUMN_VALUE(curid,3,v_sal);
    DBMS_SQL.COLUMN_VALUE(curid,4,v_comm);
    DBMS_SQL.COLUMN_VALUE(curid,5,v_dname);
    v_disp_date := TO_CHAR(v_hiredate, 'MM/DD/YYYY');
    DBMS_OUTPUT.PUT_LINE('Number    : ' || v_empno);
    DBMS_OUTPUT.PUT_LINE('Name      : ' || UPPER(p_ename));
    DBMS_OUTPUT.PUT_LINE('Hire Date : ' || v_disp_date);
    DBMS_OUTPUT.PUT_LINE('Salary    : ' || v_sal);
    DBMS_OUTPUT.PUT_LINE('Commission: ' || v_comm);
    DBMS_OUTPUT.PUT_LINE('Department: ' || v_dname);
    DBMS_SQL.CLOSE_CURSOR(curid);
例外
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('Employee ' || p_ename || ' not found');
        DBMS_SQL.CLOSE_CURSOR(curid);
    WHEN TOO_MANY_ROWS THEN
        DBMS_OUTPUT.PUT_LINE('Too many employees named, ' ||
            p_ename || ', found');
        DBMS_SQL.CLOSE_CURSOR(curid);
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('The following is SQLERRM:');
        DBMS_OUTPUT.PUT_LINE(SQLERRM);
        DBMS_OUTPUT.PUT_LINE('The following is SQLCODE:');
        DBMS_OUTPUT.PUT_LINE(SQLCODE);
        DBMS_SQL.CLOSE_CURSOR(curid);
エンド;
            
同様の出力が表示されます:
EXEC select_by_name('MARTIN')

番号: 7654
名前: マーティン
レンタル日: 09/28/1981
給与: 1250
委員会: 1400
部門: 販売 

FETCH_ROWS

FETCH_ROWS関数は、カーソルから行をフェッチするために使用されます。

ステータスINTEGER FETCH_ROWS(c INTEGER)

Parameters

パラメーター説明
c行のフェッチに使用されるカーソルの ID。
status行がフェッチされると、1が返されます。 フェッチされた行がない場合、0が返されます。

次の例では、empテーブルから行を取得し、結果を表示します。

DECLARE
    curid           INTEGER;
    v_empno         NUMBER(4);
    v_ename         VARCHAR2(10);
    v_hiredate      DATE;
    v_sal           NUMBER(7,2);
    v_comm          NUMBER(7,2);
    v_sql           VARCHAR2(50) := 'SELECT empno, ename, hiredate, sal, ' ||
                                    'comm FROM emp';
    v_status INTEGER;
開始
    curid := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE(curid,v_sql,DBMS_SQL.native);
    DBMS_SQL.DEFINE_COLUMN(curid,1,v_empno);
    DBMS_SQL.DEFINE_COLUMN(curid,2,v_ename,10);
    DBMS_SQL.DEFINE_COLUMN(curid,3,v_hiredate);
    DBMS_SQL.DEFINE_COLUMN(curid,4,v_sal);
    DBMS_SQL.DEFINE_COLUMN(curid,5,v_comm);

    v_status := DBMS_SQL.EXECUTE(curid);
    DBMS_OUTPUT.PUT_LINE('EMPNO  ENAME       HIREDATE    SAL       COMM');
    DBMS_OUTPUT.PUT_LINE('-----  ----------  ----------  --------  ' ||
        '--------');
    LOOP
        v_status := DBMS_SQL.FETCH_ROWS(curid);
        EXIT WHEN v_status = 0;
        DBMS_SQL.COLUMN_VALUE(curid,1,v_empno);
        DBMS_SQL.COLUMN_VALUE(curid,2,v_ename);
        DBMS_SQL.COLUMN_VALUE(curid,3,v_hiredate);
        DBMS_SQL.COLUMN_VALUE(curid,4,v_sal);
        DBMS_SQL.COLUMN_VALUE(curid,4,v_sal);
        DBMS_SQL.COLUMN_VALUE(curid,5,v_comm);
        DBMS_OUTPUT.PUT_LINE(v_empno || '   ' || RPAD(v_ename,10) || '  ' ||
            TO_CHAR(v_hiredate,'yyyy-mm-dd') || ' ' ||
            TO_CHAR(v_sal,'9,999.99') || ' ' ||
            TO_CHAR(NVL(v_comm,0),'9,999.99'));
    END LOOP;
    DBMS_SQL.CLOSE_CURSOR(curid);
END; 
同様の出力が表示されます:
EMPNO ENAME HIREDATE SAL COMM
---- --------- -------------------------------------
7369スミス1980-12-17 800.00 .00
7499アレン1981-02-20 1,600.00 300.00
7521ワード1981-02-22 1,250.00 500.00
7566ジョーンズ1981-04-02 2,975.00 .00
7654 MARTIN 1981-09-28 1,250.00 1,400.00
7698 BLAKE 1981-05-01 2,850.00 .00
7782 CLARK 1981-06-09 2,450.00 .00
7788 SCOTT 1987-04-19 3,000.00 .00
7839キング1981-11-17 5,000.00 .00
7844ターナー1981-09-08 1,500.00 .00
7876 ADAMS 1987-05-23 1,100.00 .00
7900ジェームズ1981-12-03 950.00 .00
7902フォード1981-12-03 3,000.00 .00
7934ミラー1982-01-23 1,300.00 .00 

IS_OPEN

IS_OPEN関数は、指定されたカーソルが有効かどうかを確認するために使用されます。

ステータスBOOLEAN IS_OPEN(c INTEGER)
            

Parameters

パラメーター説明
cチェックするカーソルの ID。
statusカーソルが有効になっている場合、このパラメーターはTRUEに設定されます。 カーソルが無効の場合、このパラメーターはFALSEに設定されます。

最後の行のカウント

LAST_ROW_COUNT関数は、フェッチされた行の総数を返すために使用されます。

rowcntインテガーLAST_ROW_COUNT
            

Parameters

パラメーター説明
rowcnt返されたレコードの総数

次の例では、LAST_ROW_COUNT関数を使用して、クエリでフェッチされた行の総数を表示します。

DECLARE
    curid           INTEGER;
    v_empno         NUMBER(4);
    v_ename         VARCHAR2(10);
    v_hiredate      DATE;
    v_sal           NUMBER(7,2);
    v_comm          NUMBER(7,2);
    v_sql           VARCHAR2(50) := 'SELECT empno, ename, hiredate, sal, ' ||
                                    'comm FROM emp';
    v_status INTEGER;
開始
    curid := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE(curid,v_sql,DBMS_SQL.native);
    DBMS_SQL.DEFINE_COLUMN(curid,1,v_empno);
    DBMS_SQL.DEFINE_COLUMN(curid,2,v_ename,10);
    DBMS_SQL.DEFINE_COLUMN(curid,3,v_hiredate);
    DBMS_SQL.DEFINE_COLUMN(curid,4,v_sal);
    DBMS_SQL.DEFINE_COLUMN(curid,5,v_comm);

    v_status := DBMS_SQL.EXECUTE(curid);
    DBMS_OUTPUT.PUT_LINE('EMPNO  ENAME       HIREDATE    SAL       COMM');
    DBMS_OUTPUT.PUT_LINE('-----  ----------  ----------  --------  ' ||
        '--------');
    LOOP
        v_status := DBMS_SQL.FETCH_ROWS(curid);
        EXIT WHEN v_status = 0;
        DBMS_SQL.COLUMN_VALUE(curid,1,v_empno);
        DBMS_SQL.COLUMN_VALUE(curid,2,v_ename);
        DBMS_SQL.COLUMN_VALUE(curid,3,v_hiredate);
        DBMS_SQL.COLUMN_VALUE(curid,4,v_sal);
        DBMS_SQL.COLUMN_VALUE(curid,4,v_sal);
        DBMS_SQL.COLUMN_VALUE(curid,5,v_comm);
        DBMS_OUTPUT.PUT_LINE(v_empno || '   ' || RPAD(v_ename,10) || '  ' ||
            TO_CHAR(v_hiredate,'yyyy-mm-dd') || ' ' ||
            TO_CHAR(v_sal,'9,999.99') || ' ' ||
            TO_CHAR(NVL(v_comm,0),'9,999.99'));
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('Number of rows: ' || DBMS_SQL.LAST_ROW_COUNT);
    DBMS_SQL.CLOSE_CURSOR(curid);
END; 
同様の出力が表示されます:
EMPNO ENAME HIREDATE SAL COMM
---- --------- -------------------------------------
7369スミス1980-12-17 800.00 .00
7499アレン1981-02-20 1,600.00 300.00
7521ワード1981-02-22 1,250.00 500.00
7566ジョーンズ1981-04-02 2,975.00 .00
7654 MARTIN 1981-09-28 1,250.00 1,400.00
7698 BLAKE 1981-05-01 2,850.00 .00
7782 CLARK 1981-06-09 2,450.00 .00
7788 SCOTT 1987-04-19 3,000.00 .00
7839キング1981-11-17 5,000.00 .00
7844ターナー1981-09-08 1,500.00 .00
7876 ADAMS 1987-05-23 1,100.00 .00
7900ジェームズ1981-12-03 950.00 .00
7902フォード1981-12-03 3,000.00 .00
7934ミラー1982-01-23 1,300.00 .00
行の数: 14 

OPEN_CURSOR

OPEN_CURSOR関数は、カーソルを作成するために使用されます。 動的 SQL 文を解析して実行するには、カーソルを使用する必要があります。 有効にすると、同じまたは異なるSQL文でカーソルを再使用できます。 カーソルを再び無効にして有効にする必要はありません。

c INTEGER OPEN_CURSOR
            

Parameters

パラメーター説明
c新しく作成されるクラスターの名前

次の例はジョブ出力を定義する方法です。

DECLARE
    curid INTEGER;
開始
    curid := DBMS_SQL.OPEN_CURSOR;
            .
            .
            .
エンド; 

PARSE

PARSEストアドプロシージャは、SQL文またはSPLブロックを解析するために使用されます。 DDLステートメントの場合、すぐに実行され、EXECUTE関数を呼び出す必要はありません。

PARSE(c INTEGER、ステートメントVARCHAR2、language_flag INTEGER)
            

Parameters

パラメーター説明
c有効なカーソルのID。
解析するSQL文またはSPLブロック。 SQL文はセミコロン (;) で終わることはできません。 SPL ブロックはセミコロン (;) で終了する必要があります。
language_flagOracle構文との互換性のために使用されます。 有効な値: DBMS_SQL.V6、DBMS_SQL.V7、およびDBMS_SQL.native このフラグは無視され、すべての構文はPolarDB for PostgreSQL (Compatible with Oracle) 形式です。

次の匿名ブロックは、jobという名前のテーブルを作成します。 DDLステートメントはPARSEストアドプロシージャによって直ちに実行され、EXECUTE関数を呼び出す必要はありません。

DECLARE
    curid INTEGER;
開始
    curid := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE(curid, 'CREATE TABLE job (jobno NUMBER(3), ' ||
        'jname VARCHAR2(9))',DBMS_SQL.native);
    DBMS_SQL.CLOSE_CURSOR(curid);
エンド; 

次のコードスニペットは、jobテーブルに2行を挿入します。

DECLARE
    curid           INTEGER;
    v_sql           VARCHAR2(50);
    v_status INTEGER;
開始
    curid := DBMS_SQL.OPEN_CURSOR;
    v_sql := 'INSERT INTO job VALUES (100, ''ANALYST'')';
    DBMS_SQL.PARSE(curid, v_sql, DBMS_SQL.native);
    v_status := DBMS_SQL.EXECUTE(curid);
    DBMS_OUTPUT.PUT_LINE('Number of rows processed: ' || v_status);
    v_sql := 'INSERT INTO job VALUES (200, ''CLERK'')';
    DBMS_SQL.PARSE(curid, v_sql, DBMS_SQL.native);
    v_status := DBMS_SQL.EXECUTE(curid);
    DBMS_OUTPUT.PUT_LINE('Number of rows processed: ' || v_status);
    DBMS_SQL.CLOSE_CURSOR(curid);
エンド;
            
同様の出力が表示されます:
処理された行の数: 1
処理される行の数: 1 

次の匿名ブロックは、DBMS_SQL パッケージを使用して、2 つの INSERT 文を含むブロックを実行します。 ブロックの末尾には終了セミコロン (;) が含まれていますが、OPEN_CURSORの例では、個々のINSERTステートメントに終了セミコロン (;) がありません。

DECLARE
    curid           INTEGER;
    v_sql           VARCHAR2(100);
    v_status INTEGER;
開始
    curid := DBMS_SQL.OPEN_CURSOR;
    v_sql := 'BEGIN ' ||
               'INSERT INTO job VALUES (300, ''MANAGER''); '  ||
               'INSERT INTO job VALUES (400, ''SALESMAN''); ' ||
             'END;';
    DBMS_SQL.PARSE(curid, v_sql, DBMS_SQL.native);
    v_status := DBMS_SQL.EXECUTE(curid);
    DBMS_SQL.CLOSE_CURSOR(curid);
エンド;