Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DB2:如果不存在,则添加列_Db2 - Fatal编程技术网

DB2:如果不存在,则添加列

DB2:如果不存在,则添加列,db2,Db2,我有一个名为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 I

我有一个名为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 
[错误]脚本行:1-8--------------------------
DB2SQL错误:SQLCODE=-104,SQLSTATE=42601,SQLERRMC=ALTERTABLETEST\U TABLE ADD TEST;E='TEST2'))
然后
;, 驱动器=3.50.152
消息:在“E='TEST2')之后发现意外标记“ALTER TABLE TEST_TABLE ADD TEST”)
然后
“。预期的代币可能包括:”。。SQLCODE=-104,SQLSTATE=42601,DRIVER=3.50.152
线路:5
谢谢,
-Mike

您不能在过程内部执行动态查询。用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

SP内不能有DDL,因为--

如果例程解析正确,引擎必须在系统目录中存储一个包并填充无数个表,包括例程和其他数据库对象之间的依赖关系。如果SP的主体包含对尚不存在的对象的引用,或对具有变量名的对象的引用,或对将要更改的对象的引用,或对依赖于SP内部早期创建、删除或更改的对象的引用,则无法执行此操作


如果将相同的内容放入PREP&EXECUTE中,那么它将成为一个动态语句,并在编译时被忽略。

这篇博客文章可能会对您有所帮助-