[英]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.