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

时间:2014-12-02 14:35:04

标签: sql function db2

我已经在这个网站上找到了很多关于我的问题的帮助,但是经过几个小时的搜索后,我这次完全停留了(或者只是使用了错误的术语来搜索)。

我在db2(9.7)函数上遇到以下问题,该函数应该返回一个表(udtf):

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

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

CREATE TABLE TEMP_SCORE ( ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY, var1 INTEGER NOT NULL, var2 INTEGER NOT NULL, score INTEGER NOT NULL DEFAULT 0, max_score NOT NULL DEFAULT 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)。

我希望有人可以帮助我,因为我无法看到我犯的错误,或者至少指出了我正确的方向。 非常感谢提前。

1 个答案:

答案 0 :(得分:0)

RETURNS TABLEMODIFIES SQL DATA冲突 - 这只能在inlined SQL functions中允许,而后者又有自己的限制,例如,他们不允许使用游标。我想你需要重新思考一下你想要做的事情。一种选择可能是将函数重写为返回结果集的过程。