oracle中,用pl/sql创建触发器报触发器无效且未通过重新验证
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中,用pl/sql创建触发器报触发器无效且未通过重新验证相关的知识,希望对你有一定的参考价值。
create or replace trigger trig_del_department
after delete on dept
for each row
begin
if deleting then
delete from emp where deptno=:old.deptno;
end if;
end;
/
总是报触发器无效且未通过重新验证,但是在dos下面的sqlplus中却提示创建成功,能运行,这是为什么,注:pl/sql应该是已经连接上数据库的,因为在里面运行select * from emp是可以的
一般情况就是触发器的语法不正确。
触发器的一般语法如下:
BEFORE | AFTER
INSERT | DELETE | UPDATE [OF column [, column …]]
[OR INSERT | DELETE | UPDATE [OF column [, column …]]...]
ON [schema.]table_name | [schema.]view_name
[REFERENCING OLD [AS] old | NEW [AS] new| PARENT as parent]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name; 参考技术A
首先检查下你登录的user和数据库是否一样。如果是一样的话,再检验该用户对dept的操作权限。最后你试着注释一些代码在运行看看,例如下面的代码:
create or replace trigger trig_del_departmentafter delete on dept
for each row
begin
if deleting then
--delete from emp where deptno=:old.deptno;
null;
end if;
end;
慢慢的排查错误。
本回答被提问者采纳为啥在 PL/SQL Oracle 中尝试创建 INSTEAD OF 触发器时出现“错误的绑定变量”错误?
【中文标题】为啥在 PL/SQL Oracle 中尝试创建 INSTEAD OF 触发器时出现“错误的绑定变量”错误?【英文标题】:Why do I get the "bad bind variable" error when trying to create an INSTEAD OF trigger in PL/SQL Oracle?为什么在 PL/SQL Oracle 中尝试创建 INSTEAD OF 触发器时出现“错误的绑定变量”错误? 【发布时间】:2019-12-01 18:20:20 【问题描述】:我有这 4 张桌子:
Suppliers( id_sup, name, city)
Products (id_prod, name, city)
Companies (id_co, name, city)
Deliveries (id_sup, id_prod, id_co)
我为 Deliveries 创建了一个名为“v_deliveries”的视图,并且我想创建一个代替触发器,以便如果有人尝试在视图中插入数据,它实际上会将其添加到 Deliveries 表中。这是我尝试过的:
CREATE OR REPLACE TRIGGER new_deliv_trigg
INSTEAD OF INSERT ON v_deliveries FOR EACH ROW
BEGIN
INSERT INTO Deliveries (id_sup, id_prod, id_co)
VALUES (:NEW.id_sup, :NEW.id_prod, :NEW.id_co);
End;
【问题讨论】:
【参考方案1】:您真正使用哪个数据库?因为,对于 Oracle,它可以正常工作:
SQL> create table deliveries (id_sup number, id_prod number, id_co number);
Table created.
SQL> create or replace view v_deliveries as select * From deliveries;
View created.
SQL>
SQL> CREATE OR REPLACE TRIGGER new_deliv_trigg
2 INSTEAD OF INSERT ON v_deliveries FOR EACH ROW
3 BEGIN
4 INSERT INTO Deliveries (id_sup, id_prod, id_co)
5 VALUES (:NEW.id_sup, :NEW.id_prod, :NEW.id_co);
6 End;
7 /
Trigger created.
SQL>
【讨论】:
谢谢!我发现我的错误在哪里。我的视图有不同的列名以上是关于oracle中,用pl/sql创建触发器报触发器无效且未通过重新验证的主要内容,如果未能解决你的问题,请参考以下文章
一个存储过程,报错如下 13 PL/SQL:ORA-00922:缺少或无效选项 13 PL/SQL:SQL Statement ignored
pl/sql 连接数据库报错。initialization error oracle client not properly installed
使用pl/sql的导入表工具导入dmp文件时,导入报错:遇到ORACLE错误 12546,请问怎么解决阿
window 7 系统下 ,PL/SQL 连接Oracle11g 失败。