在DB2中创建表的语法:如果不存在则创建。

3
我希望能够编写一个SQL脚本,在创建表/序列之前检查表/序列是否存在。
我尝试使用Google并找到了一些解决方法,但它们对其他人有效,对我无效:
方法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

请指教。


DB2的版本和平台是什么? - data_henrik
版本是 DB2 v10.1.0.0,如何检查平台? - Panadol Chong
3个回答

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.

实际上我仍然遇到了 42719 错误。开始 声明 continue handler for sqlstate '42710' begin end DB21034E 该命令被处理为 SQL 语句,因为它不是有效的命令行处理器命令。在 SQL 处理期间,它返回: SQL0104N 意外的标记“end”在“lstate '42710' begin”之后被发现。预期的标记可能包括:“<psm_semicolon>”。行号=2。 SQLSTATE=42601 - Panadol Chong
我晚了几年,但是@panadol-chong无论你在哪里运行你的SQL语句,都没有将这些行作为单个语句执行。 - Dave Bower

0
您可以使用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;

如果序列怎么样? - Panadol Chong
你可以使用 SYSIBM.SYSSEQUENCES 相同的方法。链接 - Praveen
更新了带有序列情况的答案。 - Praveen

-6

2
问题是针对DB2而不是MySQL。 - AngocA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接