Sql 如何在oracle中创建触发器?

Sql 如何在oracle中创建触发器?,sql,oracle,plsql,triggers,Sql,Oracle,Plsql,Triggers,我有oracle database 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;

我有oracle database 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:在预期以下情况时遇到符号“创建”: (如果循环模式为null,则开始案例为goto声明结束退出 pragma raise return选择使用时更新
触发器是一段独立的代码,通常被认为是定义对象元数据的语言
DDL

您不能在PL/SQL块中嵌入一个触发器声明。如果您需要立即创建一些PL/SQL代码——不是一个好主意——考虑<代码> DbsSydDD.CeraTyPyBuffers/Cudio>程序。您似乎也有<代码>执行即时< /代码>。如果是这样,请阅读以下内容:()


换句话说,在运行PL/SQL之前,您应该定义触发器。创建两个脚本。

触发器是一段独立的代码,通常被认为是定义对象元数据的语言
DDL

您不能在PL/SQL块中嵌入一个触发器声明。如果您需要立即创建一些PL/SQL代码——不是一个好主意——考虑<代码> DbsSydDD.CeraTyPyBuffers/Cudio>程序。您似乎也有<代码>执行即时< /代码>。如果是这样,请阅读以下内容:()


换句话说,您应该在运行PL/SQL之前定义触发器。编写两个脚本。

我想保存数据库中的所有更改。我有3个表:表、列、行操作。在表中,保存所有表的名称,在列中,使用tableid保存所有列的名称。我想在插入之前和之后保存旧值和新值rowaction中的表。所以我应该用过程自动为数据库中的所有表创建触发器。我有一个想法,我有疑问地解释了它,你们有吗?这是一个完整的项目!我们在这里为参数化表做的,这是一段精彩的代码。但我不会给出它,因为我自己没有做过。只是我的经验,我没有在循环中执行触发器,但是当我以编程方式创建类似的触发器时(没有使用包装器),我必须运行
CREATE或REPLACE trigger x
,直到
END;
行,然后在一个单独的命令中运行
ALTER trigger x ENABLE;
以编程方式应用触发器,但仍然得到了这个结果在中间的“Enter Binds”(输入绑定)窗口中单击(这可能是您不能直接进入下一个命令的原因?)。不必使用
EXECUTE IMMEDIATE
,在我尝试这种方法时出现错误。是的,为了运行任何DDL语句(包括但不限于
CREATE TRIGGER
)在plsql块中,您必须使用
executeimmediate
我想保存数据库中的所有更改。我有3个表:表、列、行操作。在表中,保存所有表的名称,在列中,保存所有列的名称和tableid。我想在rowaction中插入表之前和之后保存旧值和新值。所以我应该使用过程自动为数据库中的所有表执行ate触发器。我有一个想法,我正在对此进行解释,你们有什么想法吗?这是一个完整的项目!我们在这里为参数化表执行了此操作,这是一段非常出色的代码。但我不会给出此操作,因为我自己没有执行此操作。这只是我的经验,我没有在循环中执行触发器,但是当我以编程方式创建了一个类似的触发器(不使用包装器)时,我必须运行
CREATE或REPLACE TRIGGER x
END;
行,然后在一个单独的命令中运行
ALTER TRIGGER x ENABLE;
以编程方式应用触发器,并且仍然可以在其间点击这个“Enter Binds”窗口(这可能就是为什么您不能直接转到下一个命令?)。不必使用
executeimmediate
,并且在我尝试这种方法时出错。是的,为了运行任何DDL语句(包括但不限于
CREATE TRIGGER
)在plsql块中,您必须使用注释中的
EXECUTE IMMEDIATE
,saeed.sh要求一个过程为数据库的每个表构建触发器,在数据更改时保存数据。这是一个大的解决方案。在注释中,saeed.sh要求一个过程为数据库的每个表构建触发器,在数据更改时保存数据e、 这是一个大问题。