0

RazorSQL ツールを使用して DB2 を操作しています。if table not exist ステートメントを含むプロシージャを作成しようとしています。

私が抱えている問題は、テーブルが存在しない場合、プロシージャが create table ステートメントを実行する必要があることです。プロシージャを共同作成しようとすると、エラー (構文エラー) が返されます。たとえば、テーブル ステートメントを作成するだけでは実行できません。

例:

 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

テーブルの変更が問題を引き起こしています。コメントするとうまくいきます。

  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

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 に答える