我希望编写一个SQL脚本,在创建表/序列之前检查表/序列是否存在。
我尝试了谷歌并获得了一些适用于其他人的解决方案但不适合我:
方法1:
SELECT *
FROM tableA
WHERE EXISTS
(SELECT * from tableB);
这适用于select
语句。然后我尝试使用create table语句:
CREATE TABLE "SMEADM"."JXTEST" (
"ACCOUNTSENTRYID" BIGINT NOT NULL )
IN "DATATBSP"
WHERE EXISTS
(SELECT * from tableB);
这会遇到错误42601
。
方法2:
CREATE TABLE IF NOT EXISTS "SMEADM"."JXTEST" (
"ACCOUNTSENTRYID" BIGINT NOT NULL )
IN "DATATBSP" ;
这也让我犯了错误42601
。
方法3:
begin
declare continue handler for sqlstate '42710' begin end;
execute immediate 'CREATE TABLE "SMEADM"."JXTEST" (
"ACCOUNTSENTRYID" BIGINT NOT NULL )
IN "DATATBSP"';
end
这也让我误以为42601
。
请告知。
答案 0 :(得分:1)
正确的方法是你的第三个选择,但是你必须正确地写它。如果您阅读输出消息,则表明存在无效字符(42601 SQL状态)。这是由于字符串没有和结束字符。您不能拥有多行字符串,而是必须创建多行并将它们连接起来。
当我跑步时:
begin
declare continue handler for sqlstate '42710' begin end;
execute immediate 'CREATE TABLE "SMEADM"."JXTEST" ('
|| ' "ACCOUNTSENTRYID" BIGINT NOT NULL ) '
|| 'IN "DATATBSP"';
end
我得到了:
begin
declare continue handler for sqlstate '42710' begin end;
execute immediate 'CREATE TABLE "SMEADM"."JXTEST" ('
db2 (cont.) => db2 (cont.) => db2 (cont.) => || ' "ACCOUNTSENTRYID" BIGINT NOT NULL ) ' ;
db2 (cont.) => end@
DB20000I The SQL command completed successfully.
答案 1 :(得分:0)
您可以检查table exist or not
是否使用sysibm.systables
,
对于sequence
,您可以使用SYSIBM.SYSSEQUENCES
。
DECLARE
v_tbl_cnt NUMBER(1,0);
v_seq_cnt NUMBER(1,0);
BEGIN
select count(1) into v_tbl_cnt
from sysibm.systables
where owner = 'your_schema'
and type = 'T'
and name = 'your_table';
IF (v_tbl_cnt = 0) THEN --table not exists
execute immediate 'create table ...'; --create table
END IF;
select count(1) into v_seq_cnt
from SYSIBM.SYSSEQUENCES
where owner = 'your_schema'
and name = 'your_sequence';
IF (v_seq_cnt = 0) THEN --sequence not exists
execute immediate 'create sequence ...'; --create sequence
END IF;
END;
答案 2 :(得分:-5)
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name {LIKE old_tbl_name | (LIKE old_tbl_name)}
检查以下链接我不确定它是否会起作用请试试看。 http://dev.mysql.com/doc/refman/5.1/en/create-table.html