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,说:
- SQL table 函数不能包含已编译的复合语句。
而 RETURN statement 中的规则则相反,并与 PIPE 示例代码相匹配:
- 在使用复合 SQL(已编译)语句的 SQL table 函数中,无法指定表达式、NULL 或全查询。使用 PIPE 语句从函数中 return 编辑行,并且需要 RETURN 语句作为函数退出时要执行的最后一个语句 (SQLSTATE 2F005)。
感谢任何帮助!
查看CREATE FUNCTION语句描述中关于MODIFIES SQL DATA
的注释:
4 Valid only for compiled scalar function definition and an inlined
table function definition.
但是你不能在内联函数中使用PIPE
。
所以,你想使用不同的功能,不能一起使用。
您在文档中发现的不一致与您的问题无关。
我正在尝试将此 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,说:
- SQL table 函数不能包含已编译的复合语句。
而 RETURN statement 中的规则则相反,并与 PIPE 示例代码相匹配:
- 在使用复合 SQL(已编译)语句的 SQL table 函数中,无法指定表达式、NULL 或全查询。使用 PIPE 语句从函数中 return 编辑行,并且需要 RETURN 语句作为函数退出时要执行的最后一个语句 (SQLSTATE 2F005)。
感谢任何帮助!
查看CREATE FUNCTION语句描述中关于MODIFIES SQL DATA
的注释:
4 Valid only for compiled scalar function definition and an inlined table function definition.
但是你不能在内联函数中使用PIPE
。
所以,你想使用不同的功能,不能一起使用。
您在文档中发现的不一致与您的问题无关。