カーソルプロパティは、関連するカーソル情報を提供します。
適用対象
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
カーソルプロパティ値を取得する構文はcursor_name%attributeであり、例えば:c1%NOTFOUNDです。カーソルプロパティのタイプは以下のとおりです:
%FOUNDブール型プロパティ。最後の読み取りカーソルがレコードを返した場合、値はTRUEとなります。%NOTFOUNDブール型プロパティ。%FOUNDとは逆です。%ISOPENブール型プロパティ。カーソルが開いている場合、TRUEを返します。%ROWCOUNT数値型プロパティ。カーソルから読み取られたレコード数を返します。
よく使われるカーソルのプロパティとその戻り値
| プロパティ名 | 宣言型カーソルの値 | 暗黙型カーソルの値 |
|---|---|---|
%FOUND |
カーソルが開いている状態であっても、FETCH 操作がない場合は NULL を返します。直近の FETCH 操作で1行のレコードが返された場合は TRUE を返します。直近の FETCH 操作でレコードが返されなかった場合は FALSE を返します。 |
DMLまたは SELECT INTO ステートメントが実行されていない場合は NULL を返します。直近に実行されたDMLまたは SELECT INTO ステートメントで1行のレコードが返された場合は TRUE を返します。直近に実行されたDMLまたは SELECT INTO ステートメントでレコードが返されなかった場合は FALSE を返します。 |
%NOTFOUND |
カーソルが開いている状態であっても、FETCH 操作がない場合は NULL を返します。直近の FETCH 操作で1行のレコードが返された場合は FALSE を返します。直近の FETCH 操作でレコードが返されなかった場合は TRUE を返します。 |
DMLまたは SELECT INTO ステートメントが実行されていない場合は NULL を返します。直近に実行されたDMLまたは SELECT INTO ステートメントで1行のレコードが返された場合は FALSE を返します。直近に実行されたDMLまたは SELECT INTO ステートメントでレコードが返されなかった場合は TRUE を返します。 |
%ROWCOUNT |
カーソルが開いている状態であれば、0以上の数値を返します。 | DMLまたは SELECT INTO ステートメントが実行されていない場合は NULL を返します。それ以外の場合は、0以上の数値を返します。 |
%ISOPEN |
カーソルが開いている状態であれば TRUE を返します。それ以外の場合は FALSE を返します。 |
常に FALSE を返します。 |
例
例:シンプルカーソルによるデータ取得。
obclient> CREATE TABLE employees (
employee_id INT,
first_name VARCHAR(50),
last_name VARCHAR(50),
manager_id INT,
salary NUMERIC
);
Query OK, 0 rows affected
obclient> INSERT INTO employees VALUES(111, 'DEL', 'FA BEN', 1, 1500);
Query OK, 1 rows affected
obclient> INSERT INTO employees VALUES(112, 'AXEL', 'BELL', 1, 1000);
Query OK, 1 rows affected
obclient> INSERT INTO employees VALUES(113, 'CRIS', 'RACHAR', 1, 1000);
Query OK, 1 rows affected
obclient> DECLARE
CURSOR c_emp IS SELECT first_name, salary
FROM employees where rownum<5;
v_ename employees.first_name%TYPE;
v_sal employees.salary%TYPE;
BEGIN
OPEN c_emp;
FETCH c_emp INTO v_ename, v_sal;
WHILE c_emp%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(v_ename||'''s salary is '||to_char(v_sal) );
FETCH c_emp INTO v_ename, v_sal;
END LOOP;
CLOSE c_emp;
END;
/
Query OK, 0 rows affected
DEL's salary is 1500
AXEL's salary is 1000
CRIS's salary is 1000
例:パラメータ渡しを使用する。
obclient> DECLARE
CURSOR c_emp (in_job_id varchar default 'AC_MGR' ) IS
SELECT first_name, salary
FROM employees where job_id = in_job_id;
v_jobid employees.job_id%TYPE;
v_emp_name employees.first_name%TYPE;
v_sal employees.salary%TYPE;
BEGIN
v_jobid := 'IT_PROG';
OPEN c_emp(in_job_id => v_jobid);
LOOP
FETCH c_emp INTO v_emp_name, v_sal;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('DEPT '||v_jobid||': '||v_emp_name||'''s salary is '||to_char(v_sal) );
END LOOP;
CLOSE c_emp;
END;
/
Query OK, 0 rows affected
DEPT IT_PROG: Alexander's salary is 9000
DEPT IT_PROG: Bruce's salary is 6000
DEPT IT_PROG: David's salary is 4800
DEPT IT_PROG: Valli's salary is 4800
DEPT IT_PROG: Diana's salary is 4200
NO_DATA_FOUNDと%NOTFOUNDの違い
NO_DATA_FOUND と %NOTFOUND の違いは以下の表に示されています。
| 違い | NO_DATA_FOUND | %NOTFOUND |
|---|---|---|
| 定義が異なる | NO_DATA_FOUND は例外を定義します。 |
%NOTFOUND はカーソルのプロパティです。 |
| 発生条件が異なる | SELECT ... INTO ステートメントは NO_DATA_FOUND をトリガーします。 |
|