我已经在这个网站上找到了很多关于我的问题的帮助,但是经过几个小时的搜索后,我这次完全停留了(或者只是使用了错误的术语来搜索)。
我在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)。
我希望有人可以帮助我,因为我无法看到我犯的错误,或者至少指出了我正确的方向。 非常感谢提前。
答案 0 :(得分:0)
RETURNS TABLE
与MODIFIES SQL DATA
冲突 - 这只能在inlined SQL functions中允许,而后者又有自己的限制,例如,他们不允许使用游标。我想你需要重新思考一下你想要做的事情。一种选择可能是将函数重写为返回结果集的过程。