当前位置: 首页 > 知识库问答 >
问题:

具有动态SQL的PL/SQL触发器

轩辕阳焱
2023-03-14

我想创建ddl触发器(在创建),这将创建一个dml触发器,但我有错误:

ORA-06512:8 00604. 00000-"错误发生在递归SQL级别%s"*原因:错误发生在处理递归SQL语句(适用于内部字典表的语句)。*操作:如果可以纠正堆栈上下一个错误中描述的情况,请这样做;否则请联系Oracle支持。

CREATE OR REPLACE TRIGGER test_ddl
after CREATE ON SCHEMA
DECLARE 
    user_col VARCHAR(5) := 'user_';
    time_col VARCHAR(5) := 'time_';
BEGIN
IF ora_dict_obj_type = 'TABLE'
THEN 
    EXECUTE IMMEDIATE 'alter table ' || ora_dict_obj_name || ' add(' || user_col || ' varchar(20), '|| time_col ||' timestamp)'||'';
    EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER add_user_time BEFORE INSERT OR UPDATE ON test_tab FOR EACH ROW BEGIN ' || ':' || 'new.time_ := sysdate; END';
END IF;
END;                               
/
DROP TABLE test_tab PURGE;
/
CREATE TABLE test_tab(ID NUMBER);

共有2个答案

井嘉胜
2023-03-14

END后面缺少一个分号。

替换这个

EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER add_user_time BEFORE INSERT OR UPDATE ON test_tab FOR EACH ROW BEGIN ' || ':' || 'new.time_ := sysdate; END';

有了这个

EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER add_user_time BEFORE INSERT OR UPDATE ON test_tab FOR EACH ROW BEGIN ' || ':' || 'new.time_ := sysdate; END;';

完整的错误消息包括:

ORA-00604: error occurred at recursive SQL level 1
ORA-24344: success with compilation error
ORA-06512: at line 8

重要部分是:

ORA-24344: success with compilation error

源代码应为:

CREATE OR REPLACE TRIGGER test_ddl
after CREATE ON SCHEMA
DECLARE 
    user_col VARCHAR(5) := 'user_';
    time_col VARCHAR(5) := 'time_';
BEGIN
IF ora_dict_obj_type = 'TABLE'
THEN 
    EXECUTE IMMEDIATE 'alter table ' || ora_dict_obj_name || ' add(' || user_col || ' varchar(20), '|| time_col ||' timestamp)'||'';
    EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER add_user_time BEFORE INSERT OR UPDATE ON test_tab FOR EACH ROW BEGIN ' || ':' || 'new.time_ := sysdate; END;';
END IF;
END;                               
/
DROP TABLE test_tab PURGE;
/
CREATE TABLE test_tab(ID NUMBER);

只是作为一个解释:我已经放了一些日志消息,看看它到底失败在哪里。然后,您可以看到触发器是递归调用CREATE OR REPLACE TRIGGER,但使用ora_dict_obj_type=TRIGGER

谷彦君
2023-03-14

至少,我希望您希望new.time.成为:new.time.

 类似资料:
  • 主要内容:创建触发器,示例在本章中,我们将讨论和学习PL/SQL中的触发器。 触发器是存储的程序,在发生某些事件时会自动执行或触发。事实上,触发器是为了响应以下任何事件而被执行的 - 数据库操作(DML)语句(,或) 数据库定义(DDL)语句(,或)。 数据库操作(,,,或)。 可以在事件关联的表,视图,模式或数据库上定义触发器。 使用触发器的好处 触发器可以用于以下目的 - 自动生成一些派生列值 强化参照完整性 事件记录

  • 问题内容: 我正在尝试编写一个触发器来填充一个包含有关雇员的最新工资信息的表。我有一个问题,我现在无法完全绕开我的头。 这是要填充的表: 这是我的触发器: 触发器编译没有问题,但是当我尝试运行此更新时,Oracle告诉我触发器无效。是什么原因造成的? 问题答案: 您已按块显示了代码。但似乎您正在运行一起显示为脚本的内容,最初没有进行更新: 在SQL Developer中作为脚本运行时,脚本输出窗口

  • 问题内容: 我有一些代码需要调试帮助,但我认为,如果我能运行其中之一,我将可以得到其余的代码(哦,我希望如此)。 我正在尝试通过sqlplus在我学校的服务器上运行的表上执行此操作,如果有帮助的话。 问题答案: 遇到错误时,指定什么错误总是有帮助的。触发器中的调用中存在语法错误。该过程需要两个参数,一个数字和一个字符串。您传入的是一个长字符串的单个参数。 假设您的表格中有一列,则该值应有效。

  • 问题内容: 是否可以实时获取PL / SQL的输出?我有一个相当大的程序包,可以运行一个多小时,我想看看该程序包在特定时间的位置。 无论如何,我目前使用一个日志表来执行此操作,该表每次运行都充满了数百个日志描述,我很好奇这是否可行。 谢谢! 问题答案: 我不知道这是否正是您想要的,但是我使用dbms_application_info.set_module来查看我的包在哪里。 出现查询将向您显示该过

  • 问题内容: 我已经徒劳地搜索了很长时间,不得不承认失败并寻求帮助,我正在尝试修改数据透视查询,以从具有以下数据的表中生成结果的动态查询: 为了显示这样的内容,其中页码列取决于用户访问的页面数: 我已经通过对列中的硬编码进行了管理,但是显然我不想继续更改脚本以容纳越来越多的页面。 到目前为止,我有一些类似的东西: 任何帮助或正确方向的指点将不胜感激! 提前致谢! 问题答案: 我所看到的关于动态枢轴的

  • 我试图使用Application Express以编程方式在Oracle12c中查找PL/SQL触发器中JSON数组的长度。这将允许我循环遍历每个元素,并将数据插入到另一个表中。现在,JSON作为CLOB存储在列中,我正在将其转换为VARCHAR2。代码如下: 我在运行此触发器时得到以下错误: SQL错误消息:ORA-06502:PL/SQL:数值或值错误 ORA-06512:at“apex_05