我有oracle数据库11gR2,我想用块自动创建一些触发器。 当我想在下面运行查询时,我有一个错误。
我的阻止是:
declare
tablesid number ;
tablenames varchar2(4000);
cursor c1 is
select id , title from hr.tables;
begin
open c1;
loop
fetch c1 into tablesid , tablenames;
CREATE OR REPLACE TRIGGER tablenames||'_before_insert'
before insert
on hr.tablenames
DECLARE
columnid number ;
columnval number ;
columntitle varchar(4000);
cursor c2 is
select id from hr.columns where tableid = tablesid ;
BEGIN
-- open c2 ;
for rec in c2 loop
select title into columntitle from hr.columns where id = rec.id
insert into hr.rowaction(columnid,newvalue,oldvalue,actiondate)
(
select id ,:new.columntitle,:old.columntitle,sysdate
from hr.tabletiltes
where id = rec.id
)
select title into columntitle from hr.columns where id = rec.id;
dbms_output.put_line(columntitle);
end loop;
end;
end loop ;close c1; end;
ORA-06550:第11行第6栏: PLS-00103:遇到以下其中一项时遇到符号“CREATE”: (如果循环mod为null,则开始为goto声明结束退出 用pragma提高返回选择更新 << 继续关闭当前删除获取锁定插入打开回滚 savepoint set sql execute commit forall merge pipe purge 06550. 00000 - “行%s,列%s:\ n%s” *原因:通常是PL / SQL编译错误。 *行动: 绑定变量“new”未声明 匿名块完成 绑定变量“new”未声明 匿名区块已完成
由于
答案 0 :(得分:4)
触发器是一个独立的独立代码片段,通常被视为DDL
,这是定义对象元数据的语言。
您不能在PL / SQL块中嵌入触发器声明。如果你需要动态创建一些PL / SQL代码 - 不是一个好主意 - 考虑DMBS_DDL.CREATE_WRAPPED
过程。您似乎也考虑过EXECUTE IMMEDIATE
。如果是这样,请阅读:{http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_ddl.htm)
您应该在运行PL / SQL之前定义触发器。制作两个剧本。