SELECT TO_CHAR(MAX(CREATE_TIME),'YYYYMMDDHH24MISS') INTO LV_DATE  FROM TH_CEP_59_HIS ;
       
    P_DROP_TABLE_NEW('FJTLCTEST','TM_VOUCHER_EMP');
       
    LV_SQL :='CREATE TABLE  TM_VOUCHER_EMP  NOLOGGING
      AS
         SELECT A.*,B.CHANGE_PARAM
         FROM  TF_CHANGE_VOUCHER A ,TF_CHANGE_DETAIL B
         WHERE TO_CHAR(A.CREATE_TIME," YYYYMMDDHH24MISS ")>'''||LV_DATE||'''
         AND A.EXTSYSTEMID = "CEP"
         AND A.VOUCHER_STATE = 1
         AND A.VOUCHER_SEQ = B.VOUCHER_SEQ ';
       EXECUTE IMMEDIATE LV_SQL;
这是DDL语句写的过程中的一段代码,为什么一直不通过?编译是成功的,单独提出来,也是可以执行的,但放在过程中就抛异常。

解决方案 »

  1.   

    写到存储过程中执行应该调用没有问题吧,建议在程序中尽量避免执行DDL操作,如果只是为了得到查询条件结果数据前台展现,可考虑其它方式实现。可考虑对表TM_VOUCHER_EMP 进行先delete 后insert操作。
      

  2.   

    具体报错内容呢,
    把你的完整的SQL贴出来
      

  3.   

    是我自定义的异常:others.还有没明白的是,ddl语句什么的提交commit一般在什么时候?
      

  4.   

     P_DROP_TABLE_NEW('FJTLCTEST','TM_VOUCHER_EMP'),先已经drop掉了,在建动态表的时候用DDL语句吧!?
      

  5.   

    如果是先drop表然后再重建表 为什么不先delete表数据 然后在insert 那样的语句块执行应该是没有问题的吧 ;如果在程序里面调用函数执行SQL  调用函数会自动提交 。
    例如可以写成
    V_SQL='begin
    delete from TM_VOUCHER_EMP;
    insert into TM_VOUCHER_EMP;
    SELECT A.*,B.CHANGE_PARAM
      FROM TF_CHANGE_VOUCHER A ,TF_CHANGE_DETAIL B
      WHERE TO_CHAR(A.CREATE_TIME,"YYYYMMDDHH24MISS")>(SELECT TO_CHAR(MAX(CREATE_TIME),'YYYYMMDDHH24MISS') FROM TH_CEP_59_HIS) 
      AND A.EXTSYSTEMID = CEP"
      AND A.VOUCHER_STATE = 1
      AND A.VOUCHER_SEQ = B.VOUCHER_SEQ; END;';