问题在下面代码的红字部分
如果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;
如果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;
系统不会去检测
你把insert那句也放在EXECUTE IMMEDIATE 后执行就可以了
这句话报错,不知道为什么 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
';
在动态SQL语句中,原来的单引号使用''来替代,就是两个单引号,注意不是双引号,再尝试一下,估计就可以了