2015-05-14 6 views
2

Запрос в листинге 1 объединяет два подзапроса, оба из которых вычисляются из двух именованных подзапросов (ANIMAL и SEA_CREATURE). Результат должен содержать список животных, которые не живут в море, и перечислять животных, которые живут в море.Внутренняя ошибка подзапроса Oracle

При запуске в окне консоли (SQL Navigator 5.5), сервер возвращает ошибку:

15:21:30 ORA-00600: internal error code, arguments: [evapls1], [], [], [], [], [], [], [] 

Почему? И как обойти это?

Интересно отметить, что я могу запустить тот же запрос в программе, написанной в Delphi XE7 (используя компонент TSQLQuery), и работает нормально. Но это не проблема с SQL Navigator. Если я создаю представление, содержащее выражение в листинге 1, выбор из представления не выводит ошибку. Проблема в сервере oracle.

Если я делаю подзапрос ANIMAL очень простым, как в листинге 2, он работает. но все остальное, даже просто выбрав из таблицы, приводит к этой внутренней ошибке.

Листинг 1: (ошибка выходов)

with ANIMAL as (
    select ANIMAL_NAME 
    from xmltable('t/e' passing xmltype('<t><e>Tuna</e><e>Cat</e><e>Dolphin</e><e>Swallow</e></t>') 
        columns 
        ANIMAL_NAME varchar2(100) path 'text()')), 

SEA_CREATURE as (
    select   'Tuna' as CREATURE_NAME from dual 
    union all select 'Shark' from dual 
    union all select 'Dolphin' from dual 
    union all select 'Plankton' from dual) 

select NONSEA_ANIMALS, SEA_ANIMALS 
    from (

    select stringagg(ANIMAL_NAME) as NONSEA_ANIMALS 
    from (  (select * from ANIMAL) 
      minus (select CREATURE_NAME as ANIMAL_NAME from SEA_CREATURE))), 

    (select stringagg(ANIMAL_NAME) as SEA_ANIMALS 
    from ANIMAL 
    where ANIMAL_NAME in 
     (select CREATURE_NAME as ANIMAL_NAME from SEA_CREATURE)) 

Листинг 2: (Это работает)

with ANIMAL as (
    select   'Tuna' as ANIMAL_NAME from dual 
    union all select 'Cat'  from dual 
    union all select 'Dolphin' from dual 
    union all select 'Swallow' from dual), 

SEA_CREATURE as (
    select   'Tuna' as CREATURE_NAME from dual 
    union all select 'Shark' from dual 
    union all select 'Dolphin' from dual 
    union all select 'Plankton' from dual) 

select NONSEA_ANIMALS, SEA_ANIMALS 
    from (

    select stringagg(ANIMAL_NAME) as NONSEA_ANIMALS 
    from (  (select * from ANIMAL) 
      minus (select CREATURE_NAME as ANIMAL_NAME from SEA_CREATURE))), 

    (select stringagg(ANIMAL_NAME) as SEA_ANIMALS 
    from ANIMAL 
    where ANIMAL_NAME in 
     (select CREATURE_NAME as ANIMAL_NAME from SEA_CREATURE)); 

Листинг 3: Ожидаемый результат для выражений в обоих листингах 1 & 2:

NONSEA_ANIMALS SEA_ANIMALS 
------------------------------- 
'Cat,Swallow' 'Tuna,Dolphin' 

Баннер Oracle показан в листинге 4.

Листинг 4: выберите * из V $ версии

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi 
PL/SQL Release 10.2.0.4.0 - Production 
CORE 10.2.0.4.0 Production 
TNS for IBM/AIX RISC System/6000: Version 10.2.0.4.0 - Productio 
NLSRTL Version 10.2.0.4.0 - Production 

Как объясняется это сумасшествие?


Update

Вот план объяснить ...

PLAN_TABLE_OUTPUT

---------------------------------------------------------------------------- 
| Id | Operation       | Name      | 
---------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT      |        | 
| 1 | TEMP TABLE TRANSFORMATION   |        | 
| 2 | LOAD AS SELECT      |        | 
| 3 | VIEW        |        | 
| 4 |  COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE  | 
| 5 | LOAD AS SELECT      |        | 
| 6 | UNION-ALL       |        | 
| 7 |  FAST DUAL      |        | 
| 8 |  FAST DUAL      |        | 
| 9 |  FAST DUAL      |        | 
| 10 |  FAST DUAL      |        | 
| 11 | NESTED LOOPS      |        | 
| 12 | VIEW        |        | 
| 13 |  SORT AGGREGATE     |        | 
| 14 |  VIEW       |        | 
| 15 |  MINUS       |        | 
| 16 |  SORT UNIQUE     |        | 
| 17 |   VIEW       |        | 
| 18 |   TABLE ACCESS FULL   | SYS_TEMP_0FD9D6666_765BCCBD | 
| 19 |  SORT UNIQUE     |        | 
| 20 |   VIEW       |        | 
| 21 |   TABLE ACCESS FULL   | SYS_TEMP_0FD9D6667_765BCCBD | 
| 22 | VIEW        |        | 
| 23 |  SORT AGGREGATE     |        | 
| 24 |  HASH JOIN RIGHT SEMI   |        | 
| 25 |  VIEW       | VW_NSO_1     | 
| 26 |  VIEW       |        | 
| 27 |   TABLE ACCESS FULL   | SYS_TEMP_0FD9D6667_765BCCBD | 
| 28 |  VIEW       |        | 
| 29 |  TABLE ACCESS FULL    | SYS_TEMP_0FD9D6666_765BCCBD | 
---------------------------------------------------------------------------- 
+0

Можете ли вы поделиться [Планом выполнения] (http://oracle-base.com/articles/9i/dbms_xplan.php#display) вашего первого запроса? –

+0

Что такое функция stringagg? – pablomatico

+0

stringagg() принимает все строки и возвращает значение, разделенное запятыми, в виде одной строки. Вы могли бы просто заменить его на min() или max(), и это почти такая же проблема. –

ответ

0

ORA-03113 и ORA-6000 обычно происходит на использовании WITH дизъюнкцию запроса при то роковое произошло на исполнение.

Oracle подзапрос факторинга или WITH пункт, может быть чрезмерно использован. Oracle может создать глобальную временную таблицу для каждого запроса внутри предложения WITH для повторного использования результатов. Итак, XMLTABLE() здесь, возможно, создал здесь еще один GTT, и, возможно, это сбой базы данных.

COLLECTION ITERATOR PICKLER FETCH is something when fetched from a PL/SL object. It returns pickled(packed and formatted) data

It might involve creation of some temp table beneath like I mentioned previously. So the subquery factoring and the PL/Sql array selection didnt go well.

Я также видел запросы с вложеннойUNION ALL в WITH получение разбился.

Это самая большая ошибка в Oracle, и о них следует сообщать.

Только способ обойти это сейчас, будет реформировать запрос. В нашей заявке использование WITH строго ограничено (из-за большого использования ЦП) только для целей отчета, выполненных как пакетные.

Смежные вопросы