3

我有一个名为 backup 的模式和一个名为 test 的表。如果表中不存在名为 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

您不能在过程中执行动态查询。使用立即执行。

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 回答