我在使用Java中的以下查询创建表时尝试插入一组行,如下所示:
DECLARE tbl_exist PLS_INTEGER;
BEGIN
select count(*) into tbl_exist from user_tables where table_name = 'REPRO_PRINTING_JOB_STATE';
if tbl_exist = 0 then
execute immediate 'create table REPRO_PRINTING_JOB_STATE (
ID varchar2(2) not null primary key,
NAME varchar(255) not null )';
execute immediate 'insert into REPRO_PRINTING_JOB_STATE (ID, NAME) values ('QU','IN THE QUEUE')';
execute immediate 'insert into REPRO_PRINTING_JOB_STATE (ID, NAME) values ('IN','INCIDENT')';
execute immediate 'insert into REPRO_PRINTING_JOB_STATE (ID, NAME) values ('CM','COMPLETED')';
execute immediate 'insert into REPRO_PRINTING_JOB_STATE (ID, NAME) values ('PR','PROCESSING')';
execute immediate 'insert into REPRO_PRINTING_JOB_STATE (ID, NAME) values ('CN','CANCELLED')';
end if;
END;
失败了。这是因为使用“立即执行”声明吗?
答案 0 :(得分:2)
根据您对问题的第一次迭代,它可能会失败,因为您的第一次插入是完全不同的表:
execute immediate 'insert into PRINTING_JOB_STATE (ID, NAME) values ... '
execute immediate 'insert into REPRO_PRINTING_JOB_STATE (ID, NAME) values .... '
换句话说,您使用PRINTING_JOB_STATE
代替REPRO_PRINTING_JOB_STATE
。
但是,既然您已经确认这只是一个简单的拼写错误,那么您需要检查插入语句中单引号的使用。您的动态字符串被'
字符包围的事实意味着在字符串中使用 '
(在QU
之类的内容)将会出现问题。
您可能需要使用重复的引号来转义引号,例如:
execute immediate 'insert into XYZZY (ID, NAME) values (''QU'', ''QUEUED'')';
QU
和QUEUED
两侧的两个单引号,而不是双引号。