簡體   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