Triggers 编写IBM DB2 9.7内联或编译sql语句不起作用

Triggers 编写IBM DB2 9.7内联或编译sql语句不起作用,triggers,db2,procedures,Triggers,Db2,Procedures,我希望在DB29.7中编写“过程”,而不定义“CREATEPROCEDURE”-语句。显然,这是一个被称为“编译”的sql语句。但是,我在获取有效语法方面遇到了问题。例如,下面的语法似乎不起作用: BEGIN DECLARE V_SQL VARCHAR(1024); SET V_SQL = 'BEGIN IF EXISTS(SELECT NAME FROM SYSIBM.SYSTRIGGERS WHERE NAME = ''TRIGGER_EMPLOYEE_FOR_DEL

我希望在DB29.7中编写“过程”,而不定义“CREATEPROCEDURE”-语句。显然,这是一个被称为“编译”的sql语句。但是,我在获取有效语法方面遇到了问题。例如,下面的语法似乎不起作用:

BEGIN
    DECLARE V_SQL VARCHAR(1024);
    SET V_SQL = 'BEGIN
    IF EXISTS(SELECT NAME FROM SYSIBM.SYSTRIGGERS WHERE NAME = ''TRIGGER_EMPLOYEE_FOR_DELETES'') THEN
    DROP TRIGGER TRIGGER_EMPLOYEE_FOR_DELETES;
    END IF;
    END;';

    PREPARE S1 FROM V_SQL;
    EXECUTE S1;
END

我已尝试添加/删除“;”和语句符号“!”,但仍然无法使其工作。

在复合SQL语句中不能有
DROP TRIGGER
语句。看

如果能够将
If
语句移动到
V_SQL
之外,则可以执行以下操作:

BEGIN
    DECLARE V_SQL VARCHAR(1024);
    IF EXISTS(SELECT NAME FROM SYSIBM.SYSTRIGGERS 
                  WHERE NAME = 'TRIGGER_EMPLOYEE_FOR_DELETES'
    ) THEN
        SET V_SQL = 'DROP TRIGGER TRIGGER_EMPLOYEE_FOR_DELETES;';
        PREPARE S1 FROM V_SQL;
        EXECUTE S1;
    END IF;
END

当然,如果您需要动态设置您的条件,这将不起作用。

类似于您的示例适用于我。几点思考:(1)是
在SQL编辑器中设置为语句分隔符?如果是这样,它将尝试分解您的命令并将其作为块发送。(2) 您是否确保V_SQL的内容在作为常规命令运行时正常工作?(3) 请发布您得到的确切错误消息。错误是:“DB2SQL错误:SQLCODE=-104,SQLSTATE=42601,SQLERRMC=DROP TRIGGER;FOR_INSERTS'),然后;,DRIVER=3.63.108“我的语句终止符是”!”,不确定分隔符是什么?!对于语句终止符来说是很好的。我相信我已经找到了答案——见下文。您知道,在DB29.7中,您可以执行
创建或替换触发器…
,对吗?啊,我应该更加关注文档语法。这将是一个棘手的问题,因为条件确实是动态设置的,并放置在一个循环中,在一个表列表中循环:)DB2有一些奇怪的语法限制,我不理解。使用SQLServer2008,您只需使用完整的语法编写该死的过程,然后继续使用它……:)我相信上面的代码可以满足您的需要,因为您可以根据上面示例中的变量检查名称,而不会出现问题。i、 e.将
中的NAME='TRIGGER\u EMPLOYEE\u FOR\u DELETES'
替换为
中的NAME=
。但是,如果您确实需要动态地执行更多操作,则可以创建一个丢弃触发器的包装过程,然后在动态SQL中调用此过程(包装过程还必须使用动态SQL)。我同意你的看法:DB2有令人困惑的局限性。是的,显然我可以做到这一点。但是,我(在BEGIN语句之前)声明了一个全局临时表和一个while循环,该循环遍历数据库中的所有表。临时表存储这些表。显然,我不允许在已编译的sql语句中声明全局临时表。。。有没有办法在不声明临时表的情况下循环模式表?好的,我解决了最后一部分。无法声明全局临时表,因此我创建了一个for循环,该循环遍历所有表。谢谢你的帮助!