1,在触发器调用的存储过程中能否动态创建表。
2,我在一个表pp_data的insert after上建了触发器以向历史表中备份数据,如果当前历史表不存在,则动态创建,如pp_data200408,在向里面插入数据,大约1分钟500条记录。
是插入速度太快,建表来不急的原因吗?

解决方案 »

  1.   

    报不能创建表。昨天0:00分报的错。我在客户现场遇到的问题,当时我手工建了pp_data200409的表,一切算顺利过去。
      

  2.   

    可以动态创建表
    你应当在触发器中加上例外处理,把错误信息保存下来(sqlcode,sqlerrm)
    看看到底是什么错误
      

  3.   

    你的问题是trigger中不能有commit语句。建表的语句是ddl语句,ddl语句是隐含commit也就是说它是自动提交的。当trigger中有commit语句时oracle就会报错。所以是你的程序建表没有成功。要想在trigger中使用ddl语句,在trigger中加入
    PRAGMA AUTONOMOUS_TRANSACTION;
    就可以了。注意这时是自治事务。
      

  4.   

    支出  dejkstro(立刻死臭) ,不过要看看你的user权限,还有你的oracle版本。
      

  5.   

    In the following example, you  a packaged function as autonomous: CREATE PACKAGE banking AS
       ...
       FUNCTION balance (acct_id INTEGER) RETURN REAL;
    END banking;CREATE PACKAGE BODY banking AS
       ...
       FUNCTION balance (acct_id INTEGER) RETURN REAL IS
          PRAGMA AUTONOMOUS_TRANSACTION;
          my_bal REAL;
       BEGIN
          ...
       END;
    END banking;In the example below, you  a database trigger as autonomous. Unlike regular triggers, autonomous triggers can contain transaction control statements. CREATE TRIGGER parts_trigger
    BEFORE INSERT ON parts FOR EACH ROW
    DECLARE
       PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
       INSERT INTO parts_log VALUES(:new.pnum, :new.pname);
       COMMIT;  -- allowed only in autonomous triggers
    END;