create or replace trigger dule_query_trig
  after update ON dule_query for each row
DECLARE
  tablename  varchar2(30);
  idname varchar2(30);
BEGIN
  SELECT tablename,idname into tablename,idname FROM business_process where pro_definition_id = ':new.prodefinition_id';
    if(:new.ACTIVITY_STATUE = '4')
    then
    update tablename set flow_status = '6' where idname = :new.ACTIVITY_ID;
    end if;
END;update tablename set flow_status = '6' where idname = :new.ACTIVITY_ID;这行报错,说表名称不存在,这个地方tablename是一个变量,怎么会报错了?

解决方案 »

  1.   

    不能用变量来代替表名和字段名的,这种情况用:execute immediate语句execute immediate 'update ' || tablename ' set flow_status = \'6\' where ' || idname || ' = ' || new.ACTIVITY_ID;
      

  2.   

    有两个地方需要修改下:create or replace trigger dule_query_trig 
      after update ON dule_query for each row 
    DECLARE 
      v_tablename  varchar2(30); 
      v_idname varchar2(30); 
    BEGIN 
      SELECT tablename,idname into tablename,idname FROM business_process where pro_definition_id = :new.prodefinition_id; 
        if(:new.ACTIVITY_STATUE = '4') 
        then 
          execute immediate 'update '||v_tablename||' set flow_status = ''6'' where '||v_idname||' = '||:new.ACTIVITY_ID; 
        end if; 
    END;
      

  3.   

    一个sql语句的静态部分 表名,命令名, 字段名 这些部分是不能用变量的,只有动态部分,也就是值的部分才能用变量,否则的话,只能通过 动态语句来执行。execute immediate sqlstr;
      

  4.   

    表名或字段名是动态的话,必须使用动态sql语句。
      

  5.   

    where语句里的new 和old 引用时不能加“:”
      

  6.   

    lz的触发器是在oracle库中吗?oracle里应该不支持select into
      

  7.   


    execute immediate 
    不支持 select into ????