SQLステートメントから呼び出される関数は、特定のルールに従わなければなりません。
適用対象
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionではMySQLモードのみが提供されています。
定義により、自律プロセスはデータベース状態を読み取ったり書き込んだりしません。つまり、データベーステーブルのクエリも変更も行われません。
次の例では、パッケージ関数oblog_msgは自律です。したがって、この関数をクエリで呼び出すと、データベーステーブルobdebug_outputにメッセージが挿入され、データベーステーブルの変更ルールに違反することはありません。
obclient> CREATE TABLE emp(
empno NUMBER(4,0),
empname VARCHAR(10),
job VARCHAR(10),
deptno NUMBER(2,0)
);
Query OK, 0 rows affected
obclient> INSERT INTO emp VALUES (200,'Jennifer','AD_ASST',1);
Query OK, 1 row affected
obclient> CREATE TABLE obdebug_output (msg VARCHAR2(200));
Query OK, 0 rows affected
obclient> CREATE OR REPLACE PACKAGE obdebugging AUTHID DEFINER AS
FUNCTION oblog_msg (message VARCHAR2) RETURN VARCHAR2;
END obdebugging;
/
Query OK, 0 rows affected
obclient> CREATE OR REPLACE PACKAGE BODY obdebugging AS
FUNCTION oblog_msg (message VARCHAR2) RETURN VARCHAR2 IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO obdebug_output (msg) VALUES (message);
COMMIT;
RETURN message;
END;
END obdebugging;
/
Query OK, 0 rows affected
-- パッケージ関数を呼び出す
obclient>DECLARE
my_id NUMBER(6);
my_name VARCHAR2(25);
my_count NUMBER;
BEGIN
my_id := 200;
SELECT obdebugging.oblog_msg(empname)
INTO my_name
FROM emp
WHERE empno = my_id;
ROLLBACK;
END;
/
Query OK, 0 rows affected