db2 SQL0628N在创建表函数时使用MODIFIES SQL DATA

mzaanser  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(237)

我尝试将这个sample code here的功能封装在一个表函数中。
我可以独自运行样本,没有任何问题。
但是,当我创建一个表函数时,只要调用一次OPEN_CURSOR,就会收到SQL 0577 N

CREATE FUNCTION ROW_CHECKSUM
    ( IN sSchema      VARCHAR(128) ,
    IN sTable         VARCHAR(128) ,
    IN sColumnList    VARCHAR(1024) ,
    IN sWhere         VARCHAR(1023),
    IN iRows          INTEGER
    )
    RETURNS TABLE (ROW_PK_VALUES VARCHAR(3000), CHECKSUM INTEGER  )
    LANGUAGE SQL
    SPECIFIC ROW_CHECKSUM
    --NO EXTERNAL ACTION
    --MODIFIES SQL DATA
    --NOT DETERMINISTIC

BEGIN
    DECLARE iCheckSum INTEGER ;
    DECLARE sKyes     VARCHAR(1024) ;

    DECLARE iCursor INTEGER;
    DECLARE sQuery  VARCHAR(32000) ;

    SET sQuery = 'SELECT ' || sColumnList || ' FROM "' || sSchema || '"."' || sTable || '" WHERE ' || sWhere || ' FETCH FIRST ' || TO_CHAR(iRows) || ' ONLY' ;

    CALL DBMS_SQL.OPEN_CURSOR(iCursor);
    --CALL DBMS_SQL.PARSE(iCursor, sQuery, DBMS_SQL.native) ;
    --PIPE (sKeys, iCheckSum) ;
    --PIPE ('abcd', 1234) ;

    RETURN ;
END

----
SQL0577N  User defined routine "DB2ADMIN.ROW_CHECKSUM" (specific name "")
attempted to modify data but was not defined as MODIFIES SQL DATA.  LINE
NUMBER=33.  SQLSTATE=38002

看起来,OPEN_CURSOR要求指定MODIFY SQL DATA..好的..我们开始吧!但是,当我指定它时,却得到了以下错误:

SQL0628N  Multiple or conflicting keywords involving the "MODIFIES SQL DATA"
clause are present.  LINE NUMBER=33.  SQLSTATE=42613

-628错误的错误详细信息太一般化,无法帮助我确定这里到底发生了什么。
我需要使用DBMS_SQL模块执行动态SQL查询,并使用PIPE返回结果集,如other sample here所示。
我一整天都在阅读传播文件,到目前为止还不能确定我到底违反了什么规则。
另外,在文档中发现了一些不一致的地方,我不明白:这page,表示:

  • SQL表函数不能包含已编译的复合语句。

RETURN statement中的规则则相反,并与PIPE示例代码相匹配:

  • 在使用复合SQL(已编译)语句的SQL表函数中,不能指定表达式、NULL或fullselect。使用PIPE语句从函数返回行,并且需要RETURN语句作为函数退出时要执行的最后一个语句(SQLSTATE 2F 005)。

感谢您的帮助!

xesrikrc

xesrikrc1#

请查看CREATE FUNCTION语句描述中关于MODIFIES SQL DATA的注解:
4仅对编译的标量函数定义和内联表函数定义有效。
但是不能在内联函数中使用PIPE
因此,您需要使用不同的功能,而这些功能不能一起使用。
您在文档中发现的不一致与您的问题无关。

相关问题