问题在下面代码的红字部分
如果P0100表存在的话,这段存储过程是正确运行的。
但是如果P0100表本来不存在,这段存储过程就会报错“该表不存在”,不明白为什么它不是先运行我前面创建表的部分,而是先检验代码有效性。
请问各位大哥,如何改进代码可以解决这个问题,非常感谢!create or replace procedure P001 is
begin  IF GET_OBJECT_CNT('P0100','TABLE')=0 --如果该表不存在
  THEN 
     ---建立一张新表P0100
     EXECUTE IMMEDIATE
     '
     CREATE TABLE P0100
     (
     PARENTL   NVARCHAR2(60) not null,
     ENTITYL   NVARCHAR2(60) not null,
     C2L       NVARCHAR2(60) not null,
     ACCOUNTL  NVARCHAR2(60) not null,
     VALUEL    NVARCHAR2(60) not null,
     DDATA    FLOAT
     )
     tablespace EPM
     pctfree 10
     initrans 1
     maxtrans 255
     storage
     (
     initial 64K
     minextents 1
     maxextents unlimited
     )
     ';
     -- Create Index
     EXECUTE IMMEDIATE
     '
     CREATE INDEX P0100ind00 ON P0100 (PARENTL,EntityL,C2L,ACCOUNTL,VALUEL)
     ';
  ELSIF GET_OBJECT_CNT('P0100','TABLE')=1 --如果该表存在
  THEN
     EXECUTE IMMEDIATE
     '
       Truncate TABLE P0100
     ';
  END IF;
  
  --Insert Records
  INSERT INTO P0100
  SELECT  PARENTID,EntityID,Custom2ID,ACCOUNTID,VALUEID,DDATA
    FROM P01_fact;
  COMMIT;

  
end P001;

解决方案 »

  1.   

    exectue immediate 'insert into p0100 select .....';
      

  2.   

    因为你创建表的语句是用EXECUTE IMMEDIATE 实行的
    系统不会去检测
    你把insert那句也放在EXECUTE IMMEDIATE 后执行就可以了
      

  3.   

    新问题:
    这句话报错,不知道为什么  EXECUTE IMMEDIATE
      '
      Insert into P0101
      SELECT CONCAT(CONCAT(Parentl,'-'),entityl) entityl,C2L,AccountL,'Elimination' ValueL,SUM(DECODE(Valuel,'[Contribution Total]',DDATA,'[Parent]',-DDATA)) ddata    FROM P0100
        GROUP BY ParentL,EntityL,C2L,AccountL
      ';
      

  4.   


    在动态SQL语句中,原来的单引号使用''来替代,就是两个单引号,注意不是双引号,再尝试一下,估计就可以了