创建表后立即插入行 - Oracle

时间:2012-03-05 08:09:26

标签: java oracle

我在使用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;

失败了。这是因为使用“立即执行”声明吗?

1 个答案:

答案 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'')';

QUQUEUED两侧的两个引号,而不是双引号。