db2使用razor创建过程

时间:2013-07-15 09:19:31

标签: db2 procedure

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

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

示例:

 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像

  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

它有效

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

谢谢

2 个答案:

答案 0 :(得分:1)

在DB2中,SQL存储过程在数据库中静态绑定。这意味着在创建存储过程时,将检查并编译任何静态SQL语句(即不使用PREPARE / EXECUTEEXECUTE 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;

答案 1 :(得分:0)

我不得不添加一些额外的“setter”来声明原子过程开始和结束的位置 代码现在看起来像这样

 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