带有返回表(udtf)和游标的DB2 sql函数将无法编译(错误:子句是互斥的)

带有返回表(udtf)和游标的DB2 sql函数将无法编译(错误:子句是互斥的),sql,function,db2,Sql,Function,Db2,我在这个网站上找到了很多帮助来解决我的问题,但是在搜索了几个小时的各种网站之后,这次我完全陷入了困境,或者只是用了错误的术语来搜索 我在db2 9.7函数中遇到以下问题,该函数应返回tableudtf: 我想创建一个函数来计算一些具有不同依赖性的分数。由于交叉依赖性,它必须在多行上执行此操作,因此我希望它以表的形式返回结果。作为中间步骤,我使用另一个临时表保存结果以供以后使用 我创建了下表以保存一些分数 创建表TEMP_分数 ID整数不为NULL始终作为标识生成, var1整数不为空, var2

我在这个网站上找到了很多帮助来解决我的问题,但是在搜索了几个小时的各种网站之后,这次我完全陷入了困境,或者只是用了错误的术语来搜索

我在db2 9.7函数中遇到以下问题,该函数应返回tableudtf:

我想创建一个函数来计算一些具有不同依赖性的分数。由于交叉依赖性,它必须在多行上执行此操作,因此我希望它以表的形式返回结果。作为中间步骤,我使用另一个临时表保存结果以供以后使用

我创建了下表以保存一些分数

创建表TEMP_分数 ID整数不为NULL始终作为标识生成, var1整数不为空, var2整数不为空, 分数整数不为空默认值为0, 最大分数不为空默认值0

现在我尝试使用以下函数:

CREATE OR REPLACE FUNCTION doSomething(IDvalue INTEGER) 
RETURNS TABLE ( ID      INTEGER,
            var1 INTEGER,
            var2 INTEGER,
            score INTEGER,
            max_score INTEGER)
LANGUAGE SQL
SPECIFIC doSomething
MODIFIES SQL DATA
BEGIN 
    DECLARE reached_score INTEGER DEFAULT 0;
    DECLARE calculated_max_score INTEGER DEFAULT 0;
    DECLARE currentID INTEGER DEFAULT NULL;

DECLARE someCursor WITH HOLD FOR
SELECT --- someDATA ---
FROM --- a lot of JOINS, SELECTS and INNER JOINS (statement collect the correct data) ---

OPEN someCursor;
FETCH someCursor INTO currentID, reached_score, calculated_max_score;

WHILE SQLSTATE != '02000' DO
    ... some SQL Code (set, select, some more calculation on variables of the cursor) ...

    INSERT INTO TEMP_SCORE(
          var1, var2, score, max_score
          ) values (
          IDvalue, currentID, reached_score, calculated_max_score
          );

    FETCH someCursor INTO currentID, reached_score, other_max_score;
END WHILE;

RETURN (SELECT ID, var1, var2, score, max_score
       FROM TEMP_SCORE 
       WHERE var1 = IDvalue
       ORDER BY var1 DESC, var2 ASC);
END
现在我正在尝试保存/编译这个函数,但它说子句是互斥的,我希望这是使用SQLSTATE 42613、SQLCODE-628 SQL0628N的正确翻译

我希望任何人都能帮助我,因为我看不出我犯了什么错误,或者至少不能为我指明正确的方向。
非常感谢。

返回表与MODIFIES SQL数据冲突-这仅在中允许,而这又有其自身的限制,例如,它们不允许使用游标。我想你需要重新思考你想做什么的方法。一种选择可能是将函数重写为返回结果集的过程。

您似乎通过读取然后插入每一行来对事情进行RBARing。不可能在一份声明中完成所有工作吗?非常感谢您的回答。我想在Java/myBatis中使用它从结果表中创建一些score bean。但是,由于分数计算中的依赖关系变得更加复杂,我将函数放入存储过程中,并使用我的Testable作为将来分数计算的存储。再次感谢!返回与修改SQL数据冲突的表-是否为DB29.7编写了文档?在示例4中同时显示了它们,但我没有看到该限制。@user2338816-请参见您发布的链接中的注释5。@mustaccio-Ah。详细信息与原始代码的匹配非常好,尽管仍不清楚注释的子句如何与给定错误引用的子句相匹配。