繁体   English   中英

Oracle WITH和MATERIALIZE提示充当函数的自主事务

[英]Oracle WITH and MATERIALIZE hint acts as autonomous transaction for functions

在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支持以确认这是您遇到的问题,但是看起来非常相似。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM