ORA-06519 и временные таблицы

maksim2020
Дата: 05.06.2006 16:31:23
Доброго времени суток!

Имеется следующий кусок кода:

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

Почему такое может быть?

Спасибо.

С уважением, Максим.
Vadim_Maximov
Дата: 05.06.2006 16:35:25

1. Global Temporary Table
2. Type as Object
3. Pipelined Function
4. Autonomous Transaction
5. Bulk collect
Дальше смотреть и вникать в суть не стал. Еще дблинков не хватает только...
mcureenab
Дата: 05.06.2006 16:37:12
Что то вызова функии не наблюдаю. Откуда тогда ошибка?
andrey_anonymous
Дата: 05.06.2006 16:41:45
"А теперь со всей этой фигней на борту мы попытаемся взлететь..." (с) анекдот.

Особенно умилил fetch bulk collect limit 1 :)

Кроме того, смутно представляю себе назначение autonomous transaction в pipelined функции.

ИМХО автор просто над нами издевается.
maksim2020
Дата: 05.06.2006 16:42:41
andrey_anonymous
"А теперь со всей этой фигней на борту мы попытаемся взлететь..." (с) анекдот.

Особенно умилил fetch bulk collect limit 1 :)

Кроме того, смутно представляю себе назначение autonomous transaction в pipelined функции.

ИМХО автор просто над нами издевается.

Ничего, что название функции TEST_func?
mcureenab
Дата: 05.06.2006 16:42:58
Vadim_Maximov

Дальше смотреть и вникать в суть не стал. Еще дблинков не хватает только...


Почему не хватает? Функция в 9.2.0.7 из 9.2.0.1 не иначе как через DB LINK вызывается. :o)))
maksim2020
Дата: 05.06.2006 16:43:38
mcureenab
Что то вызова функии не наблюдаю. Откуда тогда ошибка?

SELECT *
  FROM TABLE(test_func())
maksim2020
Дата: 05.06.2006 16:45:24
mcureenab
Vadim_Maximov

Дальше смотреть и вникать в суть не стал. Еще дблинков не хватает только...


Почему не хватает? Функция в 9.2.0.7 из 9.2.0.1 не иначе как через DB LINK вызывается. :o)))

Вы не совсем поняли суть. Функция вызывается на обоих серверах, на каждом. 9.2.0.1 - тестовый, 9.2.0.7 - production.
Vadim_Maximov
Дата: 05.06.2006 16:45:53
Ну значит попал пальцем в небо
mcureenab
Дата: 05.06.2006 16:48:36
andrey_anonymous
Особенно умилил fetch bulk collect limit 1 :)


Так это и хорошо! А то бы в добавок к BULK операциям ещё бы и скалярные операции добавились. Похоже, издержки copy/paste.

andrey_anonymous

Кроме того, смутно представляю себе назначение autonomous transaction в pipelined функции.


ON COMMIT DELETE ROWS