我有一个名为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
谢谢, -Mike
答案 0 :(得分:2)
您无法在程序内执行动态查询。用EXECUTE IMMEDIATE做。
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
答案 1 :(得分:0)
你不能在SP中使用DDL,因为 -
如果例程正确解析,则引擎必须存储包并在系统目录中填充无数表,包括例程与其他数据库对象之间的依赖关系。如果SP的主体包含对尚不存在的对象的引用,或者具有可变名称或将被更改或依赖于先前在SP内创建,丢弃或更改的对象,则它根本无法执行此操作。
如果你把相同的东西放在PREP&amp; EXECUTE然后它变成一个动态语句并在编译期间被忽略。