gpt4 book ai didi

sql - 引用游标在 XMLType.createxml 中丢失

转载 作者:行者123 更新时间:2023-12-02 22:09:59 25 4
gpt4 key购买 nike

我正在调用一个返回引用游标的函数,我正在使用 XMLType.createxml 将结果转换为 XML,例如

select XMLType.createxml(package_name.storedProcName('PARAM1', 'PARAM2', 'PARAM3')) as sresult from dual;

但是,我发现这有一个不受欢迎的副作用。似乎用于检索 XMLType 数据的游标从未关闭。使用此技术多次调用该函数后,我总是遇到以下错误:

ORA-01000: maximum open cursors exceeded

我没有光标句柄,因此我无法手动关闭它。此外,我们使用的是连接池,因此没有可以自动释放这些游标的连接重置。对此可以做些什么?


这是我的 Oracle 版本(从 v$version 返回):

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE 10.2.0.5.0 Production
TNS for HPUX: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production

(对于那些感兴趣的人,here is a link 我之前与 XMLType 相关的问题。)

最佳答案

似乎存在错误,您应该向 Oracle 支持人员提出服务请求。我将发布一个测试用例来重现您在 9i 和 11.2.0.3 中的发现:

SQL> SHOW parameter open_cursors

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 600

SQL> CREATE OR REPLACE FUNCTION ret_cursor RETURN SYS_REFCURSOR IS
2 l SYS_REFCURSOR;
3 BEGIN
4 OPEN l FOR
5 SELECT * FROM dual;
6 RETURN l;
7 END;
8 /

Function created

当使用上述函数调用时,XMLType 不会正确关闭游标,但它适用于静态 SQL:

SQL> /* Works as expected with static cursor */
2 DECLARE
3 l XMLTYPE;
4 BEGIN
5 FOR i IN 1 .. 1e4 LOOP
6 SELECT xmltype.createXML(CURSOR(SELECT * FROM DUAL)) INTO l FROM dual;
7 END LOOP;
8 END;
9 /

PL/SQL procedure successfully completed

SQL> /* Fails with call to dynamic cursor */
SQL> DECLARE
2 l XMLTYPE;
3 BEGIN
4 FOR i IN 1 .. 1e4 LOOP
5 SELECT xmltype.createXML(ret_cursor) INTO l FROM dual;
6 END LOOP;
7 END;
8 /
DECLARE
*
ERROR at line 1:
ORA-01000: maximum open cursors exceeded
ORA-06512: at "APPS.RET_CURSOR", line 4
ORA-06512: at line 5

您应该能够使用包装函数来防止 ORA-01000 发生(在 9iR2、11gR2 上测试):

SQL> CREATE OR REPLACE FUNCTION wrap_xml(p SYS_REFCURSOR) RETURN XMLTYPE IS
2 l XMLTYPE;
3 BEGIN
4 l := xmltype.CreateXML(p);
5 IF p%ISOPEN THEN
6 CLOSE p;
7 END IF;
8 RETURN l;
9 END;
10 /

Function created

SQL> DECLARE
2 l XMLTYPE;
3 BEGIN
4 FOR i IN 1 .. 1e4 LOOP
5 l := wrap_xml(ret_cursor); -- a SELECT FROM dual will still fail here
6 -- on 9i but not on 11g
7 END LOOP;
8 END;
9 /

PL/SQL procedure successfully completed

关于sql - 引用游标在 XMLType.createxml 中丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15479135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com