SQL0628N 在创建 table 函数时修改 SQL 数据

SQL0628N with MODIFIES SQL DATA when creating a table function

我正在尝试将此 sample code here 的功能封装在 Table-Function 中。

我可以 运行 单独使用样本没有任何问题。

但是当我创建一个 table 函数时,只需调用一次 OPEN_CURSOR ,我就会收到 SQL0577N

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 需要指定修改 SQL 数据.. 好的.. 让我们开始吧! 但是,当我指定它时,我会收到以下错误:

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

-628 错误的详细信息过于笼统,无法帮助我确定这里到底发生了什么。

我需要使用 DBMS_SQL 模块执行动态 SQL 查询,并使用 PIPE return 结果集,例如 other sample here.

我一整天都在阅读传播文件.. 到目前为止还无法确定我到底违反了什么规则。

另外,在文档中发现了一些不一致的地方,我不明白: 这个 page,说:

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

感谢任何帮助!

查看CREATE FUNCTION语句描述中关于MODIFIES SQL DATA的注释:

4 Valid only for compiled scalar function definition and an inlined table function definition.

但是你不能在内联函数中使用PIPE
所以,你想使用不同的功能,不能一起使用。
您在文档中发现的不一致与您的问题无关。