我尝试将这个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)。
感谢您的帮助!
1条答案
按热度按时间xesrikrc1#
请查看CREATE FUNCTION语句描述中关于
MODIFIES SQL DATA
的注解:4仅对编译的标量函数定义和内联表函数定义有效。
但是不能在内联函数中使用
PIPE
。因此,您需要使用不同的功能,而这些功能不能一起使用。
您在文档中发现的不一致与您的问题无关。