DBMS_SQLパッケージは、PolarDB for PostgreSQL (Oracle互換) の動的SQLクエリをサポートしています。 アプリケーションの実行時にクエリを作成できます。
PolarDB for PostgreSQL (Compatible with Oracle) は、動的SQLステートメントのネイティブサポートを提供し、Oracleデータベースと互換性のある動的SQLステートメントを使用する方法を提供します。
関数またはストアドプロシージャ | データ型 | 戻り値タイプ | 説明 |
BIND_VARIABLE(c, name, value [, out_value_size ]) | ストアドプロシージャ | N/A | 値を変数にバインドします。 |
BIND_VARIABLE_CHAR(c, name, value [, out_value_size ]) | ストアドプロシージャ | N/A | CHAR 値を変数にバインドします。 |
BIND_VARIABLE_RAW(c, name, value [, out_value_size ]) | ストアドプロシージャ | N/A | RAW 値を変数にバインドします。 |
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/A | CHAR 列の値を変数に返します。 |
COLUMN_VALUE_RAW(c, position, value OUT [, column_error OUT [, actual_length OUT ]]) | ストアドプロシージャ | N/A | RAW 列の値を変数に返します。 |
DEFINE_COLUMN(c, position, column [, column_size ]) | ストアドプロシージャ | N/A | SELECT リストの列を定義します。 |
DEFINE_COLUMN_CHAR(c, position, column, column_size) | ストアドプロシージャ | N/A | SELECT リストの CHAR 列を定義します。 |
DEFINE_COLUMN_RAW(c, position, column, column_size) | ストアドプロシージャ | N/A | SELECT リストの 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 パッケージで使用できるパブリック変数を示します。
パブリック変数 | データ型 | 値 | 説明 |
native | INTEGER | 1 | Oracle構文との互換性のために使用されます。 詳細については、「DBMS_SQL.PARSE」をご参照ください。 |
V6 | INTEGER | 2 | Oracle構文との互換性のために使用されます。 詳細については、「DBMS_SQL.PARSE」をご参照ください。 |
V7 | INTEGER | 3 | Oracle構文との互換性のために使用されます。 詳細については、「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。 |
name | SQL文のバインド変数の名前。 |
value | 割り当てる値。 |
out_value_size | name が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。 |
name | SQL文のバインド変数の名前。 |
value | 割り当てる CHAR 型の値。 |
out_value_size | name が 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。 |
name | SQL文のバインド変数の名前。 |
value | 割り当てる CHAR 型の値。 |
out_value_size | name が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
パラメーター | 説明 |
c | SELECTステートメントに関連付けられているカーソルのID。 |
position | 定義されている SELECT リスト内の列または式の位置。 |
column | SELECT 結果セットの指定された位置にある列または式のデータ型と一致する変数。 |
column_size | 返りデータの最大長。 列のデータ型が VARCHAR2 の場合は、column_size パラメーターを指定する必要があります。 column_size を超える返りデータは、column_size パラメーターで指定された最大長に切り捨てられます。 |
例
次の例は、DEFINE_COLUMN
ストアドプロシージャを使用して、emp
テーブルのempno
、ename
、hiredate
、sal
、および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);
.
.
.
エンド;
次の例は、まったく同じ結果を生成する前述の例の代替を示しています。 データ型の長さは無関係であることにご注意ください。 empno
、sal
、およびcomm
列は、v_num
がNUMBER(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
パラメーター | 説明 |
c | SELECTステートメントに関連付けられているカーソルのID。 |
position | 定義されている SELECT リスト内の列または式の位置。 |
column | CHAR 変数。 |
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
パラメーター | 説明 |
c | SELECTステートメントに関連付けられているカーソルのID。 |
position | 定義されている SELECT リスト内の列または式の位置。 |
column | RAW 変数。 |
column_size | 返りデータの最大長。 colume_sizeを超える返されたデータは、column_size文字に切り捨てられます。 |
DEFINE_ARRAY
DEFINE_ARRAY
ストアドプロシージャは、行を配列としてフェッチする列を定義します。 構文: DEFINE_ARRAY (
cでインテガー、
インテガーの位置、
<table_variable> IN <datatype>,
cntインインテガー,
lower_bnd IN INTEGER);
パラメーター | 説明 |
c | 配列にバインドされるカーソルのID。 |
position | 配列内の列の相対位置。 |
table_variable | <datatype> として宣言されている変数。 <datatype> の有効な値:
|
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_type | INTEGER |
col_max_len | INTEGER |
col_name | VARCHAR2(128) |
col_name_len | INTEGER |
col_schema_name | VARCHAR2(128) |
col_schema_name_len | INTEGER |
col_precision | INTEGER |
col_scale | INTEGER |
col_charsetid | INTEGER |
col_charsetform | INTEGER |
col_null_ok | BOOLEAN |
EXECUTE
EXECUTE
関数は、解析されたSQL文またはSPLブロックを実行するために使用されます。
ステータスINTEGER EXECUTE(c INTEGER)
Parameters
パラメーター | 説明 |
c | 解析されたSQL文またはSPLブロックのカーソルID。 |
status | SQL文がDELETE、INSERT、または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
パラメーター | 説明 |
c | SELECTステートメントのカーソルのID。 |
exact |
|
status |
|
例
次のストアドプロシージャでは、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_flag | Oracle構文との互換性のために使用されます。 有効な値: 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);
エンド;