关于自治事务解决触发器导致"ORA-04091:触发器/函数不能读它"不可行的验证。
cuug每周五晚8点都有免费网络课程,详情可点击http://www.cuug.com.cn
经常会有人提出这样的问题:“有一个这样的问题,有一个表A有 a,b,c,d四个字段,修改一条记录d的值为2的倍数,希望把该记录插入相同结构的表B中。并删除A表的这条记录。”
相关SQL:
--一张表
create table FOO
(
A NUMBER(10),
B NUMBER(10),
C NUMBER(10),
D NUMBER(10)
)
;
--基于这张表的触发器
CREATE OR REPLACE TRIGGER tri_foo
AFTER INSERT OR UPDATE ON foo
FOR EACH ROW
DECLARE
N_NUM NUMBER(5);
BEGIN
IF MOD(TRUNC(:NEW.D),2) =0 THEN
DELETE FROM FOO WHERE FOO.D = :NEW.D;
END IF;
END;
这个函数在执行的时候会报告这样的错误:“ORA-04091:表SCOTT.FOO 发生了变化,触发器/函数不能读它”。网上有很多关于该错误的解决方案,其中,有很大一部分是增加PRAGMA AUTONOMOUS_TRANSACTION语句,设置该触发器为自治事务,然后避免该错误。增加之后确实不报错了,而且貌似可以执行了,但是事真的如此么?修改之后的触发器如下:
CREATE OR REPLACE TRIGGER tri_foo
AFTER INSERT OR UPDATE ON foo
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
N_NUM NUMBER(5);
BEGIN
IF MOD(TRUNC(:NEW.D),2) =0 THEN
DELETE FROM FOO WHERE FOO.D = :NEW.D;
END IF;
COMMIT;
END;
分享到:
相关推荐
`Ora 10G SQL Reference.chm`是Oracle 10g的SQL参考手册,其中包含了详细的SQL语法、函数、操作符和数据库管理命令。当遇到权限问题时,可以查阅此手册获取关于`GRANT`、`REVOKE`、`ALTER USER`和`SET ROLE`等命令...
出现原因,是因为在更新的的表和读取的表是同一个表。 CREATE or replace TRIGGER T_userupdateT BEFORE update ON T_user REFERENCING OLD AS old NEW AS N_ROW FOR EACH ROW DECLARE U_xtfidemp1 varchar(36);...
PL/SQL作为Oracle的过程语言,能够在Oracle数据库中执行存储过程、函数和触发器等。然而,在Linux环境下,PL/SQL可能无法连接到Oracle数据库,出现ORA-12514错误。本文档旨在解决这个问题,提供了详细的解决方案。 ...
4. 使用存储过程和触发器提高数据库操作的效率和安全性。 总结,Oracle SQL和PL/SQL是Oracle数据库管理员和开发人员的核心技能。熟练掌握这些语言和特性,可以有效地管理数据库,构建高效稳定的应用程序。通过持续...
此外,PL/SQL还支持块的概念,如匿名块,这使得在不创建独立的存储过程或函数的情况下,也能进行临时性的数据库操作。匿名块的语法结构如下: ```sql DECLARE -- 声明部分 BEGIN -- 执行部分 EXCEPTION -- 异常...
9. **触发器和约束**:ORA-02091(触发器执行时出错)和ORA-02291(违反外键约束)等错误,可能与数据库的完整性约束有关。 10. **性能优化**:错误如ORA-01555(快照过旧)可能暗示需要优化查询或调整缓存设置以...
迁移过程中,可能会因为数据格式、存储结构的差异以及软件层面的不兼容,导致各种预料之外的错误,其中就包括了本案例中提及的ORA3113错误。 案例中指出,此错误发生在迁移完成后的一次查询操作中。Oracle数据库的...
创建触发器、过程和函数后的某些功能不起作用,例如添加新客户或出售份额 11/13/2014 - 调试说明 测试插入及其各自的错误输出。 代码:INSERT INTO customer values('eliz', 'Elizabeth', ' ', '1st street', 'pwd'...
2. **ORA-01400:不能插入NULL到非NULL列**:这表示尝试插入的行包含NULL值,而目标列不允许NULL。确保提供所有必要值,或者调整表结构允许NULL值。 3. **ORA-00920:无效的谓词**:可能是因为使用了错误的比较...
另一类是PL/SQL错误,主要涉及存储过程、函数、触发器等PL/SQL组件。 2. **错误处理**:当Oracle遇到错误时,它会返回一个错误码和一个错误消息,帮助开发者定位问题。例如,错误码ORA-00922表示“缺少或无效的选项...
2. **数据库对象管理**:工具允许用户直观地查看和管理数据库中的各种对象,如表、视图、存储过程、函数、触发器、包等。用户可以直接在界面中创建、修改或删除这些对象,无需记住复杂的SQL命令。 3. **数据浏览与...
- **存储过程、函数和触发器**: - 存储过程:预编译的过程化代码,可以在数据库中存储和重用。 - 函数:返回值的过程化代码块。 - 触发器:当特定事件发生时自动执行的代码块。 #### 五、示例操作 - **使用OEM...
系统级触发器不同于传统的DML触发器,它们不与特定的DML事件(如INSERT、UPDATE或DELETE)关联,而是与数据库级别的事件相关联。这些触发器可以在以下情况下被激活: - **数据库启动/关闭触发器**:在数据库启动或...
- PL/SQL:Oracle的编程语言,用于编写存储过程、函数、触发器。 2. **Oracle架构**: - 实例与数据库的区别:实例是内存结构,数据库是物理存储。 - SGA(System Global Area):包括数据缓冲区、重做日志缓冲...
- 过程和函数是可重用的代码模块,过程不返回值,而函数返回一个值。 - 示例: ```plsql -- 过程 CREATE OR REPLACE PROCEDURE my_procedure (p_param IN NUMBER) IS BEGIN -- 执行代码 END my_procedure; ...
触发器调用存储过程的过程中可能会出现的问题是,insert语句不是自动提交的,因此当insert语句没有提交时,update语句可能会报“表/视图发生了变化,程序不能读它”的错误。这个问题可以通过使用Oracle自治事务来...
3. **开发和调试PL/SQL代码**:使用PL/SQL Developer的内置编辑器、调试器和代码完成功能,可以方便地编写和调试PL/SQL存储过程、函数和触发器。 4. **性能监控**:虽然Oracle Instant Client本身并不提供复杂的...
这个中文帮助手册为学习和使用 Oracle 11i 提供了详尽的指南,无论你是初学者还是经验丰富的 DBA,都能从中受益匪浅。通过深入阅读和实践,你将能够熟练掌握 Oracle 11i 的各项功能,并有效地管理你的数据库系统。
- PL/SQL块:DECLARE、BEGIN、END结构,编写过程、函数、触发器。 - 控制流语句:IF、CASE、FOR、WHILE,实现流程控制。 - 异常处理:使用EXCEPTION关键字捕获并处理错误。 6. 高级特性: - 视图:虚拟表,提供...
- PL/SQL是Oracle的编程语言,结合了SQL与过程编程特性,用于创建存储过程、函数、触发器等。 - 控制结构:包括IF-THEN-ELSE、CASE、FOR循环等,用于编写复杂的业务逻辑。 - 异常处理:通过EXCEPTION关键字处理...