OceanBaseデータベースは、変更や削除などのDMLステートメントの操作に対して、自動的にカーソルを設定し、そのワークエリアを作成します。システムが暗黙的に作成するこれらのカーソルをインプリシットカーソルと呼び、その名前はSQLであり、OceanBaseシステムによって定義されています。
機能の適用範囲
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
インプリシットカーソルの操作、例えば定義、開放、値の取得、閉鎖などは、すべてOceanBaseシステムが自動的に行い、ユーザーが処理を行う必要はありません。ユーザーはインプリシットカーソルの関連属性を通じて、対応する操作を実行することしかできません。インプリシットカーソルのワークエリアに格納されるデータは、ユーザーが定義した明示的なカーソルとは無関係であり、最後に処理されたSQLステートメントに含まれるデータです。
インプリシットカーソルの属性は以下のとおりです:
SQL%FOUNDブール型属性。直近のレコード読み取りが成功した場合、値はTRUEになります。SQL%NOTFOUNDブール型属性。%FOUNDの反対です。SQL%ROWCOUNT数字型属性。カーソルから読み取ったレコード数を返します。SQL%ISOPENブール型属性。値は常にFALSEです。SQLコマンドの実行完了と同時にインプリシットカーソルは閉じられます。
以下の例では、emp テーブルの特定の部門のすべての従業員を削除します。その部門に従業員がいない場合は、dept テーブルからその部門を削除します。
obclient> CREATE TABLE dept(
deptno NUMBER(2,0),
dname VARCHAR(15),
location VARCHAR(20),
CONSTRAINT pk_dept PRIMARY KEY(deptno)
);
Query OK, 0 rows affected
obclient> CREATE TABLE emp(
empno NUMBER(4,0),
empname VARCHAR(10),
job VARCHAR(10),
mgr NUMBER(4,0),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(2,0),
CONSTRAINT PK_emp PRIMARY KEY (empno)
);
Query OK, 0 rows affected
obclient> INSERT INTO dept VALUES (10,'ACCOUNTING','Los Angeles');
Query OK, 1 row affected
obclient> INSERT INTO emp VALUES (1839,'KING','PRESIDENT',null, '1981-11-17',5000,null,10);
Query OK, 1 row affected
obclient> DECLARE
v_dept_id emp.deptno%TYPE := 10;
BEGIN
DELETE FROM emp WHERE deptno=v_dept_id;
IF SQL%NOTFOUND THEN
DELETE FROM dept WHERE deptno=v_dept_id;
END IF;
END;
/
Query OK, 0 rows affected