如何控制基于DB2s结构的SQL语句的执行?
我们希望运行一个简单的SQL语句,删除并创建索引,但前提是旧索引尚未删除。查找的语法后,我得出以下结论:如何控制基于DB2s结构的SQL语句的执行?,sql,if-statement,db2,db2-luw,Sql,If Statement,Db2,Db2 Luw,我们希望运行一个简单的SQL语句,删除并创建索引,但前提是旧索引尚未删除。查找的语法后,我得出以下结论: IF EXISTS (SELECT indname FROM SYSCAT.INDEXES WHERE INDNAME = 'TEST_CREATE_INDEX_OLD') THEN DROP INDEX TEST_CREATE_INDEX_OLD; create index TEST_CREATE_INDEX_NEW on example_table (
IF EXISTS (SELECT indname FROM SYSCAT.INDEXES WHERE INDNAME = 'TEST_CREATE_INDEX_OLD')
THEN
DROP INDEX TEST_CREATE_INDEX_OLD;
create index TEST_CREATE_INDEX_NEW on example_table
(
id,
another_field
);
END IF;
当使用SQuirrel已设置为使用db2运行或通过命令行运行时,此脚本会导致错误:
如果存在意外标记,请从SYSCAT中选择indname。索引为
找到以下开始语句。预期代币可能包括:
.. SQLCODE=-104,SQLSTATE=42601,DRIVER=4.23.42 SQL代码:
-104,SQL状态:42601
那么,我做错了什么?我是否遗漏了什么,或者是否有其他方法来实现对数据库中$thing的目标检查,执行到目前为止我还没有遇到的适当查询?如果If语句仅在复合SQL块中有效,即在存储过程/例程/函数/匿名块中有效
正如您的问题所示,它不是有效的,这就是Db2抛出-104错误的原因
您可以通过在下面的免费在线Db2知识中心中查找SQL0104N来查找sqlcode-104的解释
为了能够在Squirrel SQL工具中使用复合SQL,您需要将Squirrel配置为使用替代语句终止符。谷歌。在下面的示例中,我展示了一个@语句终止符来分隔块
这里有两种不同的方法来处理DB2Linux/Unix/Windows,每种方法都使用一个匿名块。其他方法也是可能的
在此示例中,只有当前架构中存在索引名称时,才会运行drop索引:
开始
声明v_索引_存在整数默认值为0;
选择1到v_索引_存在
来自syscat.index
其中indname='TEST_CREATE_INDEX_OLD';
如果v_索引_存在=1
然后
立即执行“drop index TEST_CREATE_index_OLD”命令;
立即执行“在示例_表id,另一个_字段上创建_索引测试_创建_索引_新建”;
如果结束;
结束@
在本例中,drop索引将始终运行,但如果索引不存在,则块不会中止,即它将继续运行,并且不会抛出任何错误
开始
声明v_no_这样的索引整数默认为0;
声明sqlstate“42704”的条件不存在;
声明not_exists的continue处理程序集合v_no_,这样的_索引=1;
立即执行“drop index TEST_CREATE_index_OLD”命令;
立即执行“在示例_表id,另一个_字段上创建_索引测试_创建_索引_新建”;
结束@
如果要使用db2复合语句,必须使用另一个语句分隔符。 在Squirrel中:Session->sessionproperties->SQL->Statement Separator=@。 Db2中的索引由两个SYSCAT.index列完全限定:INDSCHEMA和INDNAME。因此,建议在SYSCAT.INDEXEX上的SELECT语句中使用这两个字段,如示例所示。 不能在复合语句中使用静态DDL语句。改为使用EXECUTE IMMEDIATE语句。 下面是一个示例,它模拟会话中当前模式特殊注册表集的模式中的索引的更新索引
BEGIN
IF EXISTS (SELECT indname FROM SYSCAT.INDEXES WHERE INDSCHEMA = CURRENT SCHEMA AND INDNAME = 'TEST_CREATE_INDEX_OLD')
THEN
EXECUTE IMMEDIATE 'DROP INDEX TEST_CREATE_INDEX_OLD';
EXECUTE IMMEDIATE'
create index TEST_CREATE_INDEX_NEW on example_table
(
id,
another_field
)
';
END IF;
END
@
您的Db2版本和平台是什么?DB2V11.1.2020,Win7