I am new to programming in ORACLE and I am trying to compare a table column value to a passed in array and I am having a rather frustrating time in doing so.
Here is the Type Declaration from the package head.
TYPE T_STRING_ARRAY IS TABLE OF VARCHAR2(5);
and here is the the function that is using it.
create or replace PACKAGE BODY TEST_PACK IS
FUNCTION TEST_LOG_FN
(
PI_START_DATE IN VARCHAR2,
PI_END_DATE IN VARCHAR2,
PI_LOG_TYPE IN T_STRING_ARRAY
)
RETURN T_REF_CURSOR
AS
PO_RESULT T_REF_CURSOR;
BEGIN
OPEN PO_RESULT FOR
SELECT
EL.ENTRY_BASE_LOG_ID,
EL.APP_NAME,
EL.APP_MODULE,
EL.CREATION_DATE,
EL.APP_STATUS,
EL.LOG_TYPE
FROM
LG_ENTRY_BASE_LOG EL
WHERE
CREATION_DATE > PI_START_DATE AND
CREATION_DATE < PI_END_DATE AND
(EL.LOG_TYPE IN PI_LOG_TYPE OR PI_LOG_TYPE = NULL);
RETURN
PO_RESULT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN NULL;
END TEST_LOG_FN;
END;
The error I am getting is PLS-00642: local collection types not allowed in SQL statements. I have read online
«To avoid the PLS-00642, the collection will need to be defined at the schema level; therefore, you would need to define the varray table as a real table, using Oracle DDL with the CREATE TYPE syntax. »
http://www.dba-oracle.com/t_pls_00642_local_collection_types_not_allowed_in_sql_statement.htm
I am not sure how to do that nor have I found any references online that I could use. Can someone help me with that? If someone knows an easier way to see if a string exists in an array, that is a perfectly acceptable answer as well.
Форумы
/ Oracle
[игнор отключен]
[закрыт для гостей]
/
Не получается выбрать значеия из коллекции через from table(…)
12 сообщений из 12, страница 1 из 1
|
Не получается выбрать значеия из коллекции через from table(…)
#40137424 |
||
|---|---|---|
|
Приветствую, ребята! На простом примере пытаюсь загрузить данные из таблички в коллекцию, потом сделать с неё select, но ругается на тип: PLS-00642 local collection types not allowed in sql statement. Вот что, делаю: 1) Создаю табличку 1.
2) Затем пытаюсь выполнить такой скрипт: 1.
Подскажите, что не так делаю? … |
||
|
||
| 03.03.2022, 19:10 |
| Ответить | Цитировать | Написать
|
|
Не получается выбрать значеия из коллекции через from table(…)
#40137426 |
||
|---|---|---|
|
Leonid Kudryavtsev Участник Сообщения: 9 300 Рейтинг: |
||
|
PLS-00642 local collection types not allowed in sql statement. Нельзя использоваться PL/SQL тип, тип нужно объявлять на уровне базы CREATE TYPE. AFAIK … |
||
|
||
| 03.03.2022, 20:13 |
| Ответить | Цитировать | Написать
|
|
Не получается выбрать значеия из коллекции через from table(…)
#40137431 |
||
|---|---|---|
|
mnbvcx Гость |
||
|
PLS-00642 local collection types not allowed in sql statement. Нельзя использоваться PL/SQL тип, тип нужно объявлять на уровне базы CREATE TYPE. AFAIK А если на уровне пакета? … |
||
|
||
| 03.03.2022, 20:44 |
| Ответить | Цитировать | Написать
|
|
Не получается выбрать значеия из коллекции через from table(…)
#40137445 |
||
|---|---|---|
|
ASNexus Гость |
||
|
пропущено… Нельзя использоваться PL/SQL тип, тип нужно объявлять на уровне базы CREATE TYPE. AFAIK А если на уровне пакета? Тип, объявленный в спецификации пакета, можно использовать в SQL-запросах SELECT, в запросах DML — нельзя (возможно, в каких-то новых версиях это изменилось, не знаю). Объявленный в теле пакета — нельзя ни в каких в SQL-запросах. … |
||
|
||
| 03.03.2022, 22:19 |
| Ответить | Цитировать | Написать
|
|
Не получается выбрать значеия из коллекции через from table(…)
#40137452 |
||
|---|---|---|
|
mnbvcx Гость |
||
|
ASNexus, ну я это и имел в виду, что не обязательно на уровне схемы тип объявлять. … |
||
|
||
| 03.03.2022, 22:41 |
| Ответить | Цитировать | Написать
|
|
Не получается выбрать значеия из коллекции через from table(…)
#40137461 |
||
|---|---|---|
|
oragraf Участник Откуда: Moscow Сообщения: 1 206 Рейтинг: |
||
|
1.
Подскажите, что не так делаю? Конкретно тут ты пытаешься выбрать данные «в никуда». Если ты их хочешь просто посмотреть в целях тестирования, то напиши цикл по массиву и выведи в консоль через dbms_output … |
||
|
||
| 03.03.2022, 23:43 |
| Ответить | Цитировать | Написать
|
|
Не получается выбрать значеия из коллекции через from table(…)
#40137509 |
||
|---|---|---|
|
zorlo Гость |
||
|
1.
Подскажите, что не так делаю? Конкретно тут ты пытаешься выбрать данные «в никуда». Если ты их хочешь просто посмотреть в целях тестирования, то напиши цикл по массиву и выведи в консоль через dbms_output Да, это понятно. Я этот пример просто написал, чтобы разобраться почему не работает обращение коллекции через table(). Но суть в том, что, хотелось бы, чтобы выполнился подобный кусок в процедуре. … |
||
|
||
| 04.03.2022, 10:12 |
| Ответить | Цитировать | Написать
|
|
Не получается выбрать значеия из коллекции через from table(…)
#40137515 |
||
|---|---|---|
|
zorlo Гость |
||
|
zorlo, Дополню, чего хотел бы пока, чтобы отрабатывало без ошибок. Создаём ещё табличку 1.
И вот, что хотел бы, чтобы заработало: 1.
… |
||
|
||
| 04.03.2022, 10:22 |
| Ответить | Цитировать | Написать
|
|
Не получается выбрать значеия из коллекции через from table(…)
#40137518 |
||
|---|---|---|
|
zorlo Гость |
||
|
zorlo, Тип можно объявить только на уровне схемы? На уровне пакета нельзя? CREATE OR REPLACE TYPE test_values_set IS TABLE OF test%ROWTYPE; … |
||
|
||
| 04.03.2022, 10:29 |
| Ответить | Цитировать | Написать
|
|
Не получается выбрать значеия из коллекции через from table(…)
#40137543 |
||
|---|---|---|
|
oragraf Участник Откуда: Moscow Сообщения: 1 206 Рейтинг: |
||
|
zorlo, не тупи 1.
… |
||
|
||
| 04.03.2022, 12:44 |
| Ответить | Цитировать | Написать
|
|
Не получается выбрать значеия из коллекции через from table(…)
#40137550 |
||
|---|---|---|
|
zorlo Гость |
||
|
oragraf, Да это понятно, как вывести элементы. … |
||
|
||
| 04.03.2022, 13:32 |
| Ответить | Цитировать | Написать
|
|
Не получается выбрать значеия из коллекции через from table(…)
#40137617 |
||
|---|---|---|
|
Кроик Семён Участник Откуда: СПб —> Dortmund Сообщения: 7 039 Рейтинг: |
||
|
zorlo, попробуйте с CAST: 1.
… |
||
|
||
| 04.03.2022, 18:07 |
| Ответить | Цитировать | Написать
|
12 сообщений из 12, страница 1 из 1
Форумы
/ Oracle
[игнор отключен]
[закрыт для гостей]
/
Не получается выбрать значеия из коллекции через from table(…)
Для примера определим пакет:
create or replace package sample_pkg is
type myRec is record(
id number,
name varchar2(50));
type myRecTbl is table of myRec;
type crs is ref cursor;
procedure test;
end sample_pkg;
Если в коде захочется сделать например так
function test_crs return crs is
myTab myRecTbl := myRecTbl();
p_id number;
p_name varchar2(50);
i number := 1;
res crs;
begin
for cr in (select * from sample_table) loop
myTab.extend();
myTab(i).id := cr.id;
myTab(i).name := cr.name;
i := i + 1;
end loop;
for x in (select * from table(myTab)) loop
dbms_output.put_line(x.name);
end loop;
return crs;
end test_crs;
будет ошибка Error: PLS-00642: local collection types not allowed in SQL statements, так как для использования в SQL тип доложен быть определен на уровне БД (схемы) а не в пакете.
AND error_code = ‘PLS-00642’
База данных: 12c Выпуск 1
Код ошибки: PLS-00642
Описание: local collection types not allowed in SQL statements
Причина: В выражении SQL был использован локально определенный (т.е. не на уровне схемы) тип коллекции. Тип должен быть определен в схеме, чтобы быть принятым в операторе SQL.
Действие: Определите тип коллекции в вашей схеме, а не внутри подпрограммы PL / SQL.
База данных: 12c Выпуск 1
Код ошибки: PLS-00642
Описание: local collection types not allowed in SQL statements
Причина: A locally-defined (i.e. not schema level) collection type was used in a SQL statement. The type must be defined in a schema to be accepted in a SQL statement.
Действие: Define the collection type in your schema, not inside a PL/SQL subprogram.
База данных: 10g Выпуск 1
Код ошибки: PLS-00642
Описание: local collection types not allowed in SQL statements
Причина: В выражении SQL был использован локально определенный (т.е. не на уровне схемы) тип коллекции. Тип должен быть определен в схеме, чтобы быть принятым в операторе SQL.
Действие: Определите тип коллекции в вашей схеме, а не внутри подпрограммы PL / SQL.
База данных: 10g Выпуск 2
Код ошибки: PLS-00642
Описание: local collection types not allowed in SQL statements
Причина: В выражении SQL был использован локально определенный (т.е. не на уровне схемы) тип коллекции. Тип должен быть определен в схеме, чтобы быть принятым в операторе SQL.
Действие: Определите тип коллекции в вашей схеме, а не внутри подпрограммы PL / SQL.
База данных: 11g Выпуск 1
Код ошибки: PLS-00642
Описание: local collection types not allowed in SQL statements
Причина: В выражении SQL был использован локально определенный (т.е. не на уровне схемы) тип коллекции. Тип должен быть определен в схеме, чтобы быть принятым в операторе SQL.
Действие: Определите тип коллекции в вашей схеме, а не внутри подпрограммы PL / SQL.
База данных: 11g Выпуск 2
Код ошибки: PLS-00642
Описание: local collection types not allowed in SQL statements
Причина: В выражении SQL был использован локально определенный (т.е. не на уровне схемы) тип коллекции. Тип должен быть определен в схеме, чтобы быть принятым в операторе SQL.
Действие: Определите тип коллекции в вашей схеме, а не внутри подпрограммы PL / SQL.
База данных: 12c Выпуск 2
Код ошибки: PLS-00642
Описание: local collection types not allowed in SQL statements
Причина: В выражении SQL был использован локально определенный (т.е. не на уровне схемы) тип коллекции. Тип должен быть определен в схеме, чтобы быть принятым в операторе SQL.
Действие: Определите тип коллекции в вашей схеме, а не внутри подпрограммы PL / SQL.
База данных: 18c Выпуск 1
Код ошибки: PLS-00642
Описание: local collection types not allowed in SQL statements
Причина: В выражении SQL был использован локально определенный (т.е. не на уровне схемы) тип коллекции. Тип должен быть определен в схеме, чтобы быть принятым в операторе SQL.
Действие: Определите тип коллекции в вашей схеме, а не внутри подпрограммы PL / SQL.
База данных: 19c Выпуск 1
Код ошибки: PLS-00642
Описание: local collection types not allowed in SQL statements
Причина: В выражении SQL был использован локально определенный (т.е. не на уровне схемы) тип коллекции. Тип должен быть определен в схеме, чтобы быть принятым в операторе SQL.
Действие: Определите тип коллекции в вашей схеме, а не внутри подпрограммы PL / SQL.
