我正在使用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
它有效
我的第一个创建过程查询的“语法错误”问题在哪里?
谢谢
答案 0 :(得分: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;
答案 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