Доброго времени суток!
Имеется следующий кусок кода:
CREATE GLOBAL TEMPORARY TABLE GTT
(
testid NUMBER(10),
testval VARCHAR2(10)
)
ON COMMIT DELETE ROWS
/
CREATE TYPE test_type AS OBJECT
(
testid NUMBER(10),
testval VARCHAR2(10)
)
/
CREATE TYPE test_type_set AS TABLE OF test_type
/
CREATE OR REPLACE FUNCTION Test_Func RETURN test_type_set PIPELINED
IS
PRAGMA AUTONOMOUS_TRANSACTION;
lX test_type := test_type(NULL,NULL);
CURSOR CUR_A IS
SELECT 1 TestID,
'One' TestVal
FROM Dual
UNION
SELECT 2 TestID,
'Two' TestVal
FROM Dual
UNION
SELECT 3 TestID,
'Three' TestVal
FROM Dual
UNION
SELECT 4 TestID,
'Four' TestVal
FROM Dual
UNION
SELECT 5 TestID,
'Five' TestVal
FROM Dual;
TYPE T_GTT IS TABLE OF GTT%ROWTYPE;
lA T_GTT := T_GTT();
lGTT T_GTT := T_GTT();
lB T_GTT := T_GTT();
CURSOR CUR_B IS
SELECT *
FROM GTT;
BEGIN
OPEN CUR_A;
<<loop1>>
LOOP
FETCH CUR_A BULK COLLECT INTO lA LIMIT 1;
IF lA.COUNT > 0 THEN
lGTT.EXTEND(lA.COUNT);
FOR x IN lA.FIRST..lA.LAST
LOOP
lGTT(x).TestID := lA(x).TestID;
lGTT(x).TestVal := lA(x).TestVal;
END LOOP;
IF lGTT.COUNT > 0 THEN
FORALL x IN lGTT.FIRST..lGTT.LAST
INSERT INTO GTT
VALUES lGTT(x);
END IF;
lGTT.DELETE;
END IF;
EXIT loop1 WHEN CUR_A%NOTFOUND;
END LOOP;
CLOSE CUR_A;
OPEN CUR_B;
FETCH CUR_B BULK COLLECT INTO lB;
FOR x IN lB.FIRST..lB.LAST
LOOP
lX.TestID := lB(x).TestID;
lX.TestVal := lB(x).TestVal;
PIPE ROW( lX );
END LOOP;
CLOSE CUR_B;
COMMIT;
RETURN;
END;
/
а также два сервера - на одном 9.2.0.1, на другом - 9.2.0.7. На обоих серверах Windows 2003.
Функция прекрасно отрабатывает на 9.2.0.1, на 9.2.0.7 вываливается с ORA-06519 на строке с PIPE ROW.
ORA-06519: active autonomous transaction detected and rolled back
ORA-06512: at "test.test_func", line 66
Почему такое может быть?
Спасибо.
С уважением, Максим.