在 Oracle 12c 中,如果我在查询中调用在 WITH..AS 部分中使用 MATERIALIZE 提示的函数,则该函数调用的行为类似于自治事务:
DROP TABLE my_table;
CREATE TABLE my_table (
my_column NUMBER
);
-- Returns number of records in table
CREATE OR REPLACE FUNCTION my_function
RETURN INTEGER
IS
i INTEGER;
BEGIN
SELECT COUNT(1) INTO i FROM my_table;
RETURN i;
END;
/
-- Inserts one record to table
INSERT INTO my_table (my_column) VALUES (9);
-- Returns number of records in table. This works correctly, returns 1
SELECT COUNT(1) AS "use simple select" FROM my_table;
-- Returns number of records in table. This works correctly, returns 1
WITH x AS (
SELECT /*+ MATERIALIZE */ COUNT(1) AS "use WITH, MATERIALIZE" FROM my_table
)
SELECT * FROM x;
-- Returns number of records in table. This works correctly, returns 1
SELECT my_function AS "use FUNCTION" FROM dual;
-- Returns number of records in table. This works INCORRECTLY, returns 0.
-- Function is called in autonomous transaction?
WITH x AS (
SELECT /*+ MATERIALIZE */ my_function "use WITH,MATERIALIZE,FUNCTION" FROM dual
)
SELECT * FROM x;
ROLLBACK;
有谁知道这是什么原因?这是 Oracle 的错误还是它本来就是这样工作的? (为什么?)
为什么只有当WITH与MATERIALIZED提示和FUNCTION调用结合使用时才会这样?
这看起来像错误 15889476,“游标持续时间临时表和在活动事务上运行的函数产生错误结果”;和 13253977“在活动事务上运行的游标持续时间临时表和 PLSQL 函数出现错误结果或错误”。
我可以在 11.2.0.3 上重现,但不能在 11.2.0.4 上重现;从 Husqvik 的评论来看,它似乎没有在 12.1.0.2 上重现。这与错误文档中受影响的版本和修复首先包含的信息一致。
有关详细信息,请参阅 MOS 文档 15889476.8 和 13253977.8。您可能需要联系 Oracle 支持来确认这就是您遇到的问题,但它看起来非常相似。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)