如何控制基于DB2s结构的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 (

我们希望运行一个简单的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
    (
        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