在创建下面的触发器时,我收到了这个错误。触发脚本 -
CREATE OR REPLACE TRIGGER myuser.tt_tab BEFORE DELETE ON dbo.tab
REFERENCING
OLD AS old
NEW AS new
FOR EACH ROW
DECLARE
err_code error_log.err_code%TYPE;
err_msg error_log.err_msg%TYPE;
CURSOR c_old IS
SELECT cd, office_id
FROM dbo.tab_def def
WHERE :old.tab_id = def.tab_id AND :old.VALID_DATE_RANGE_FLAG = 'Y';
BEGIN
FOR r_old IN c_old LOOP
-- Write delete to log table
INSERT INTO myuser.trig_log
(
seq_nbr,
id,
cd,
office_id,
seq,
address,
dml_action,
creation_date
) VALUES (
myuser.trig_log_seq.NEXTVAL,
:old.id,
r_old.cd,
r_old.office_id,
null,
:old.address,
'DEL',
sysdate
);
END LOOP;
EXCEPTION
--capture any exceptions
WHEN OTHERS THEN
err_code := sqlcode;
err_msg := substr(sqlerrm, 1, 254);
INSERT INTO myuser.error_log VALUES (
error_log_seq.NEXTVAL,
'tab',
'tab',
err_code,
err_msg,
sysdate
);
END;
触发日志表定义 -
DESCRIBE myuser.trig_log;
SEQ_NBR NUMBER
ID NUMBER
cd VARCHAR2(3)
OFFICE_ID NUMBER
SEQ NUMBER
ADDRESS NUMBER
DML_ACTION VARCHAR2(4)
CREATION_DATE TIMESTAMP(6)
错误 -
Error(11,5): PL/SQL: SQL Statement ignored
Error(16,9): PL/SQL: ORA-00942: table or view does not exist
Error(27,9): PL/SQL: SQL Statement ignored
Error(40,13): PLS-00364: loop index variable 'R_OLD' use is invalid
Error(40,26): PL/SQL: ORA-00984: column not allowed here
我确保的事情,myuser 在选项卡 tab_def 上具有选择访问权限。我可以在我拥有所有对象的另一个环境中创建类似的触发器。
我观察到,如果我从代码中删除光标部分,触发器编译成功。我还删除了 joins :old.tab_id = def.tab_id
,在光标中添加了 tab 和 tab_def 的 join ,但它们可以正常工作。请指导我 - 我做错了什么。