0

我正在使用 RazorSQL 工具来处理 DB2。我尝试创建包含 if table not exist 语句的过程。

我遇到的问题是,如果表不存在,则程序必须执行创建表语句。尝试共同创建一个过程返回错误(语法错误),就像它不能执行更多然后只能创建表语句。

例子:

 CREATE PROCEDURE KLEMENTEST.create_table 
()
LANGUAGE SQL
MODIFIES SQL DATA
--READS SQL DATA
--CONTAINS SQL
begin atomic
 if (not exists(select 'A' from syscat.tables where tabschema = 'KLEMENTEST' and       tabname='bendeldoba')) then
 create table klementest.bendeldoba (
    bdd_id_bdd           INTEGER                not null,
    bdd_naziv            VARCHAR(128)           not null,
    bdd_mesecev          INTEGER                not null default 0,
    bdd_prispevki        INTEGER,
    bdd_procent          numeric,
    bdd_racuni           INTEGER,
    bdd_datvpisa         DATE                   not null,
    bdd_vpisal_uporabnik INTEGER                not null default 0
 );
 alter table klementest.bendeldoba add constraint P_Key_1 primary key (bdd_id_bdd);
 end if;
 end

alter table 导致问题。如果我评论它有效,也尝试共同执行 smth like

  CREATE PROCEDURE KLEMENTEST.create_table 
    ()
    LANGUAGE SQL
    MODIFIES SQL DATA
    --READS SQL DATA
    --CONTAINS SQL
    begin atomic
 if (not exists(select 'A' from syscat.tables where tabschema = 'KLEMENTEST' and tabname='bendeldoba')) then
 crete view def_schema.view1 as select * from sometable;
 crete view def_schema.view2 as select * from someothertable;
 end if;
 end

有用

我的第一个创建过程查询的“语法错误”问题在哪里?

谢谢你

4

2 回答 2

1

在 DB2 中,SQL 存储过程静态绑定在数据库中。这意味着当您创建存储过程时,将检查和编译任何静态 SQL 语句(即您不使用PREPARE/EXECUTE或执行的那些)。EXECUTE IMMEDIATE

因此,发生错误是因为当 DB2 检查ALTER TABLE语句的有效性时,KLEMENTEST.BENDELDOBA 还不存在。

解决此问题的最佳方法是使ALTER TABLE语句成为动态语句:

declare vSQL varchar(1024);

-- portion of procedure that creates the table... 

set vSQL = 'alter table ...';
execute immediate vSQL;
于 2013-07-15T19:22:13.023 回答
0

我必须添加一些额外的“设置器”,以声明原子过程的开始和结束位置现在代码看起来像这样

 CREATE PROCEDURE KLEMENTEST.create_table 
()
LANGUAGE SQL
ap: begin  atomic
declare vsql varchar(1024) ;
set vSQL = 'alter table KLEMENTEST.avtvrsteplacilapod add constraint P_Key_1 primary key (avp_id_avp)';

 if (not exists(select 'A' from syscat.tables where tabschema = 'KLEMENTEST' and tabname='AVTVRSTEPLACILAPOD')) then

 create table KLEMENTEST.avtvrsteplacilapod (
   avp_id_avp           INTEGER                not null,
  avp_vrsteplacila     INTEGER                not null,
avp_naziv            VARCHAR(64)            not null,
avp_skupinevrpl      INTEGER                not null ,
avp_avtvrplmestovprog INTEGER               ,
avp_postrm           SMALLINT               not null,
avp_upostzap         SMALLINT               not null

);

 execute immediate vsql;
 end if ;
 end ap
于 2013-07-18T07:56:05.470 回答