3

その中にバックアップと呼ばれるスキーマとテストと呼ばれるテーブルがあります。Test1という列がテーブルに存在しない場合は、テーブルに追加する必要があります。やり方を教えていただけますか?

次のクエリはエラーを返します。

BEGIN ATOMIC
IF (NOT EXISTS(
SELECT 1 FROM SYSCAT.COLUMNS WHERE TABNAME ='TEST_TABLE' AND COLNAME = 'TEST2'))
THEN 
     ALTER TABLE TEST_TABLE ADD TEST2 varchar(255);
END IF;
END
GO

私が受け取っているエラーはこれです:

[Error] Script lines: 1-8 --------------------------
 DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=ALTER TABLE TEST_TABLE ADD TEST;E = 'TEST2'))
THEN 
;<compound_return>, DRIVER=3.50.152
 Message: An unexpected token "ALTER TABLE TEST_TABLE ADD TEST" was found following "E = 'TEST2'))
THEN 
".  Expected tokens may include:  "<compound_return>".. SQLCODE=-104, SQLSTATE=42601, DRIVER=3.50.152
 Line: 5 

ありがとう、-マイク

4

2 に答える 2

2

プロシージャ内で動的クエリを実行することはできません。EXECUTEIMMEDIATEで実行します。

CREATE PROCEDURE ASP.CHECKTEST
     DYNAMIC RESULT SETS 0
     MODIFIES SQL DATA
     LANGUAGE SQL
BEGIN
IF (NOT EXISTS(
SELECT 1 FROM SYSCAT.COLUMNS WHERE TABNAME ='TEST_TABLE' AND COLNAME = 'TEST2'))
THEN
    EXECUTE IMMEDIATE 'ALTER TABLE ASP.TEST_TABLE ADD COLUMN TEST2 varchar(255)';
END IF; 
END
于 2013-03-11T18:00:46.780 に答える
0

SP内にDDLを含めることはできません。理由は次のとおりです。

ルーチンが正しく解析される場合、エンジンはパッケージを格納し、ルーチンと他のデータベースオブジェクト間の依存関係を含め、システムカタログに多数のテーブルを設定する必要があります。SPの本体に、まだ存在しないオブジェクト、変数名を持つオブジェクト、変更されるオブジェクト、またはSP内での以前の作成、削除、変更に依存するオブジェクトへの参照が含まれている場合、それは単純にできません。

PREP&EXECUTE内に同じものを入れると、それは動的ステートメントになり、コンパイル時に無視されます。

于 2013-03-15T05:25:42.027 に答える