Oracle локальные типы коллекций не допускаются в операторах sql
Короче говоря, я предлагаю обсудить код, который вы видите ниже.
Компилятор Oracle 11 повышает
"PLS-00306: неправильное количество или типы аргументов при вызове в 'PIPE_TABLE'"
"PLS-00642: Типы локальных коллекций, не разрешенные в SQL-заявлении"
Oracle 12 компилирует следующий пакет без таких предупреждений, но у нас есть неожиданность во время выполнения
при выполнении анонимного блока как есть - все в порядке (мы можем передать некоторые строки в функции pipe_table - это не влияет)
теперь пусть раскомментирует строку с помощью hello; или поместит туда вызов любой процедуры и снова запустите измененный анонимный блок мы получаем "ORA-22163: коллекции левой руки и правой стороны не одного типа"
И вопрос: Предоставляет ли Oracle 12 локальные типы коллекций в SQL? Если да, то что не так с кодом PACKAGE buggy_report ?
В дальнейших экспериментах мы выяснили, что проблемы еще глубже, чем предполагалось.
Например, различные элементы, используемые в пакете buggy_report , мы можем получить ORA-03113: end-of-file on communication channel
при запуске script (в вопросе). Это можно сделать с изменением типа t_id_table на VARRAY или TABLE .. INDEX BY .. . Есть много способов и вариантов, приводящих нас к различным исключениям, которые не относятся к этой теме.
Еще одна интересная вещь заключается в том, что время компоновки спецификации пакета buggy_report может занимать до 25 секунд,
когда обычно это занимает около 0,05 секунды. Я могу определенно сказать, что это зависит от наличия параметра TYPE t_id_table в объявлении функции pipe_table , а "длинная компиляция" происходит в 40% случаев установки. Таким образом, кажется, что проблема с local collection types in SQL скрытно появляется во время компиляции.
Итак, мы видим, что Oracle 12.1.0.2, очевидно, имеет ошибку в реализации использования локальных типов коллекций в SQL.
Ниже приведены минимальные примеры для получения ORA-22163 и ORA-03113 . Там мы принимаем тот же пакет buggy_report , что и в вопросе.
чтобы сделать длинную историю короткой, я предлагаю обсудить текст, который вы видите ниже.
компилятор Oracle 11 поднимает
"PLS-00306: неправильный номер или типы аргументов советы в вызове "PIPE_TABLE""
"PLS-00642: локальные типы коллекций не допускаются в инструкции SQL"
Oracle 12 компилирует следующий пакет без таких предупреждений, но у нас есть сюрприз во время выполнения
при выполнении анонимного блока как есть - все в порядке (мы можем трубить некоторые строки в pipe_table функция-это не влияет)
теперь давайте раскомментируем строку с hello; или поставить там вызов какой-либо процедуры, и снова запустить изменен anonumous блок мы получаем "ORA-22163: левая и правая боковые коллекции не одного типа"
и вопрос: У Oracle 12 разрешить локальные типы коллекций в SQL? Если да, то что не так с кодом PACKAGE buggy_report ?
в дальнейших экспериментах мы обнаружили, что проблемы еще глубже, чем предполагалось.
еще одна интересная вещь-это компиляция время buggy_report спецификация пакета может занять до 25 секунд, когда обычно это занимает около 0,05 секунд. Я могу определенно сказать, что это зависит от присутствия на pipe_table объявление функции, и" компиляция долгого времени " случаются в 40% случаев установки. Так что, похоже, проблема с local collection types in SQL подспудно появляются во время компиляции.
Итак, мы видим, что Oracle 12.1.0.2, очевидно, имеет ошибку в реализации использования локальных типов коллекций в язык SQL.
минимальные примеры, чтобы получить ORA-22163 и ORA-03113 следующий. Там мы предполагаем то же самое buggy_report пакета, как в вопросе.
да, в Oracle 12c вам разрешено использовать локальные типы коллекций в SQL.
PL / SQL-конкретные типы данных, разрешенные через интерфейс PL/SQL-to-SQL
оператор таблицы теперь может использоваться в программе PL/SQL для коллекции, тип данных которой объявлен в PL/SQL. Это также позволяет типу данных быть ассоциативным массивом PL/SQL. (В предыдущих выпусках тип данных коллекции должен быть объявлен на уровне схемы.)
однако я не знаю, почему ваш код не работает, возможно, эта новая функция все еще имеет ошибку.
я повозился с вашим примером. Трюк, как Oracle 12c может использовать коллекции PL/SQL в операторах SQL, заключается в том, что Oracle создает типы объектов суррогатной схемы с совместимыми атрибутами типа SQL и использует эти суррогатные типы в запросе. Твое дело похоже на жука. Я проследил выполнение, и суррогатные типы создаются только один раз, если они не существуют. Таким образом, эффективный тип не изменяется и не перекомпилируется (не знаю, выполняется ли неявная перекомпиляция с помощью инструкции ALTER) во время выполнения конвейерная функция. И проблема возникает, только если вы используете на
Я понимаю, что существует много материала об этом, но я все еще не могу заставить это работать должным образом. Приведенный выше код — моя последняя попытка. Проблема в том, что у меня есть дубликаты, а иногда и записи тройной экземпляр в таблице.
- получить повторные записи
- «сохранить» второстепенную последовательность каждой повторяющейся записи (первой созданной, следует поддерживать)
- удалить другие записи
* Я не мог создать группу. имея количество > 1, используя последовательные, потому что последовательности не повторяются
ОШИБКА: типы локальных коллекций pls-00642 не разрешены в инструкции sql
Должен ли я использовать pls_integer?
Вы могли бы BULK COLLECT INTO V_MANTER , но я не уверен, что вы имели в виду LEAST() - возможно MIN() ; но тогда, если вы возвращаете только одно значение, вам не нужна коллекция. Кажется, вы идентифицируете один num_seq_aluno_curso / cod_situacao_aluno_turma париж за раз, во всяком случае, на данный момент. Но есть ли дубликаты в этой таблице или в тех, к которым вы присоединяетесь - иначе зачем вообще присоединяться? И почему вы вообще используете PL/SQL, а не просто удаляете дубликаты напрямую?
не является единичным значением. это минимальное последовательное значение для каждой группы повторяющихся дисциплин
Ну, для каждой группы будет одно минимальное значение, но ваш запрос просматривает только одну группу, не так ли? Возможно, вы надеетесь удалить предложение where позже, но на данный момент вы все равно получите только одно значение из запроса — если вы действительно имели в виду min() , а не least() , что ничего вам не говорит с одним аргументом; и это не обязательно будет связано с дубликатом. Возможно, добавление примеров данных и информации о том, чего вы хотите достичь, поможет указать вам на другой подход.
"минимальный последовательный для каждой группы повторной дисциплины" Тогда вам понадобится MIN() и предложение GROUP BY. Нам трудно понять, чего вы пытаетесь достичь с помощью одного только кода. Было бы полезно, если бы вы предоставили некоторые образцы входных данных и требуемый результат, полученный из этих входных данных.
Короче говоря, предлагаю обсудить код, который вы видите ниже.
Компилятор Oracle 11 поднимает
"PLS-00306: wrong number or types of arguments tips in call to 'PIPE_TABLE'"
"PLS-00642: Local Collection Types Not Allowed in SQL Statement"
Oracle 12 компилирует следующий пакет без таких предупреждений, но у нас есть сюрприз во время выполнения
when executing the anonymous block as is - everything is fine (we may pipe some rows in the pipe_table function - it doesn't affect)
now let's uncomment the line with hello; or put there a call to any procedure, and run the changed anonumous block again we get "ORA-22163: left hand and right hand side collections are not of same type"
И вопрос: разрешает ли Oracle 12 локальные типы коллекций в SQL? Если да, то что не так с кодом PACKAGE buggy_report ?
В ходе дальнейших экспериментов мы обнаружили, что проблемы даже глубже, чем предполагалось.
Например, различные элементы, используемые в пакете, buggy_report мы можем получить ORA-03113: end-of-file on communication channel при запуске скрипта (в вопросе). Это можно сделать, изменив тип t_id_table на VARRAY или TABLE .. INDEX BY .. . Есть много способов и вариантов, которые приводят нас к различным исключениям, которые не относятся к теме этой публикации.
Еще один интересный момент: время компиляции buggy_report спецификации пакета может занимать до 25 секунд, тогда как обычно это занимает около 0,05 секунды. Однозначно могу сказать, что это зависит от наличия TYPE t_id_table параметра в pipe_table объявлении функции, а «длительная компиляция» происходит в 40% случаев установки. Так что, похоже, проблема с local collection types in SQL латентно возникла во время компиляции.
Итак, мы видим, что в Oracle 12.1.0.2 явно есть ошибка в реализации использования локальных типов коллекций в SQL.
Минимальные примеры , чтобы получить ORA-22163 и ORA-03113 Подписчиков. Там мы предполагаем тот же buggy_report пакет, что и в вопросе.
I am trying to work with collections.I have declared a package as:
create or replace package my_pack
as
type my_rec is record (my_emp emp.ename%type);
type my_table is table of my_rec;
end my_pack;
wherein i create a record and a table of records.
procedure my_proc1
as
my_tab_var my_pack.my_table;
begin
select ename into my_tab_var from emp;
dbms_output.put_line('Sucessful');
exception
when others then
dbms_output.put_line('Hell'||sqlerrm);
end;
But while compiling i get the following error.PLS-00642: local collection types not allowed in SQL statements.
I am using personal oracle 9 on windows 98.
Please tell me how i can manage to get rid of this error.I am an amatuer programmer of pl/sql.
Comments
Kamal,
Thanks a lot for the help.But am still getting errors.I am using personal oracle 9i.Is that a problem. I ran the changed procedure in sqlplus as well as in TOAD.But ended up with errors.
TOAD:PLS-00597: expression 'MY_TAB_VAR' in the INTO list is of wrong type
SQLPLUS:Warning: Procedure created with compilation errors.
Type "show errors" in SQL*Plus to get a list of the errors.
If you can cut and paste from SQL*Plus, like Kamal did, that will probably help us diagnose your problem.
Am here with attaching the page from sql plus.Thanks to all you guys for the help
SQL*Plus: Release 9.0.1.0.1 - Production on Thu Aug 12 11:08:25 2004
(c) Copyright 2001 Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Personal Edition Release 9.0.1.1.1 - Production
JServer Release 9.0.1.1.1 - Production
SQL> CREATE OR REPLACE PROCEDURE my_proc1 AS
2 my_tab_var my_pack.my_table;
3 BEGIN
4 SELECT ename BULK COLLECT INTO my_tab_var FROM emp;
5 dbms_output.put_line('Sucessful');
6 EXCEPTION
7 WHEN OTHERS THEN
8 dbms_output.put_line('Hell' || SQLERRM);
9 END;
10
11 /
Warning: Procedure created with compilation errors.
SQL> show errors
Errors for PROCEDURE MY_PROC1:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/7 PL/SQL: SQL Statement ignored
4/38 PLS-00597: expression 'MY_TAB_VAR' in the INTO list is of wrong
type
Читайте также: