Oracle WITH und MATERIALIZE Hinweis fungiert als autonome Transaktion für Funktionen

In Oracle 12c verhält sich der Funktionsaufruf wie eine autonome Transaktion, wenn ich eine Funktion in einer Abfrage aufrufe, die den MATERIALIZE-Hinweis in einem WITH..AS-Abschnitt verwendet:

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;

Weiß jemand woran das liegt? Ist es ein Oracle-Fehler oder soll es so funktionieren? (Warum?) Warum funktioniert das nur, wenn WITH mit MATERIALIZED-Hinweis und FUNCTION-Aufruf kombiniert ist?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage