Тип коллекции как параметр курсора

Я должен сделать курсор, который получает список в качестве параметра. Я попробовал это:

declare

type array_t is table of varchar(50); -- //also tried varray(10) instead of table

cursor c_cursor (p_list array_t) is
select 
    field_1
from 
    table_1
where 
    field_2 in p_list;

a_list array_t;

begin
    a_list := array_t('aaa',
        'bbb',
        'cccc',
        'ddd');

    for v_cursor in c_cursor(a_list) loop
        dbms_output.put_line(v_cursor.field_1);
    end loop;
end;

и я получаю следующую ошибку

ORA-06550: line 11, column 21:
PLS-00642: local collection types not allowed in SQL statements

Я читал об использовании , СОЗДАЮТ ИЛИ ЗАМЕНЯЮТ метод, но я не могу использовать , СОЗДАЮТ ИЛИ ЗАМЕНЯЮТ в этом случае (на самом деле, база данных только для чтения).

Есть ли какое-либо возможное решение?

1
nl ja de
Here' s некоторый пример: stackoverflow.com/questions/4249010/…
добавлено автор Art, источник
Пожалуйста, добавьте ожидаемую продукцию вопроса.
добавлено автор TechDo, источник

3 ответы

Необходимо создать тип отдельно использование вопроса

CREATE OR REPLACE type array_t as table of varchar2(50);

Пожалуйста, попробуйте после этого.

1
добавлено

вы нуждаетесь в типе SQL не pl/sql один, затем используете стол синтаксис, чтобы использовать его.

поскольку вы говорите, что не можете создать один, попробовать построенный в одном на DBMS_OUTPUT.

SQL> create table table_1(field_1 varchar2(20), field_2 varchar2(20));

Table created.

SQL> insert into table_1 values ('test', 'aaa');

1 row created.

SQL> insert into table_1 values ('test2', 'cccc');

1 row created.

SQL> insert into table_1 values ('test3', 'x');

1 row created.

SQL> commit;

Commit complete.

SQL> set serverout on
SQL> declare
  2  cursor c_cursor (p_list sys.DBMSOUTPUT_LINESARRAY) is
  3  select /*+ cardinality(p, 10) */
  4      field_1
  5  from
  6      table_1 t
  7      inner join table(p_list) p
  8              on t.field_2 = p.column_value;
  9
 10  a_list sys.DBMSOUTPUT_LINESARRAY;
 11
 12  begin
 13      a_list := sys.DBMSOUTPUT_LINESARRAY('aaa',
 14          'bbb',
 15          'cccc',
 16          'ddd');
 17
 18      for v_cursor in c_cursor(a_list) loop
 19          dbms_output.put_line(v_cursor.field_1);
 20      end loop;
 21  end;
 22  /
test
test2

/* + количество элементов (p, 10) */ намек должен сказать Oracle примерно, сколькими ряды будут во множестве. поместите представительное число, или оракул предположит, что множество содержит 8k ряды, которые могут вызвать плохой план.

0
добавлено
@user1961089, на чем версия оракула - вы? необходимо быть в состоянии использовать подходящий тип, который вы видите с , избранным владелец, type_name, coll_type, elem_type_name, upper_bound, длина от all_coll_types где elem_type_name = ' VARCHAR2'
добавлено автор DazzaL, источник
PLS 00201: идентификатор sys. DBMSOUTPUT_LINESARRAY должен быть объявлен: (
добавлено автор Enrique, источник
Я нашел подходящий тип. Большое спасибо.
добавлено автор Enrique, источник

Это может помочь - Oracle PL/SQL:

DECLARE
  Type t_EmpNoArr IS VARRAY(20000) OF NUMBER(10) ;
  v_RetVal  t_EmpNoArr:= t_EmpNoArr();
  --
  FUNCTION retArray return t_EmpNoArr
  IS
    v_empnoArr t_EmpNoArr:= t_EmpNoArr();
  BEGIN
    FOR i IN ( SELECT empno FROM scott.emp )
    LOOP
      v_empnoArr.extend() ;
      v_empnoArr(v_empnoArr.count):= i.empno ;
    END LOOP;
  --
    FOR j IN 1..v_empnoArr.COUNT() LOOP
       DBMS_OUTPUT.PUT_LINE(v_empnoArr(j));
    END LOOP;
  --
  RETURN v_empnoArr;
 END retArray;
 --
 BEGIN
   v_RetVal:= retArray();
 END;
 /
0
добавлено
Верстка сайтов HTML/CSS/JS/PHP
Верстка сайтов HTML/CSS/JS/PHP
3 439 участник(ов)

Правила группы: напишите !rules в чате. Группа Вк: vk.com/web_structure Freelancer: @web_fl Веб Дизайн: @dev_design Маркетолог: @topmarkening Автор: @M_Boroda

CSS — русскоговорящее сообщество
CSS — русскоговорящее сообщество
1 502 участник(ов)

Сообщество любителей CSS Возникли проблемы с CSS? – пиши сюда, обсудим и предложим самое лучшее решение Работа: @css_ru_jobs Правила: https://teletype.in/@css_ru/r1EWtQ2w7 Приходите в наши чаты @javascript_ru и @frontend_ru Флуд: @css_flood

Чат — Типичный Верстальщик
Чат — Типичный Верстальщик
1 080 участник(ов)

Основной канал: @tpverstak Обратная связь: @annblok Все ссылки на соц.сети проекта: http://taplink.cc/tpverstak ПРАВИЛА ЧАТА — https://teletype.in/@annblok/BygPgC3E7

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)

Oracle RU
Oracle RU
303 участник(ов)

Русскоязычная группа по Oracle. — Архитектура СУБД — PL/SQL — Оптимизация — Администрирование — Вакансии Oracle (указать инфу по вилке ЗП и удалёнке) Приглашайте коллег :-) Запрещены: личные оскорбления, обсуждения оффтопик вопросов политики и религии

Веб-Технологи: UI/UX, Вёрстка, Фронтенд
Веб-Технологи: UI/UX, Вёрстка, Фронтенд
167 участник(ов)

Всё про веб-дизайн и вёрстку. А также: HTML, CSS, флекс и бутстрапы, шаблонизаторы, препроцессоры, методологии, аглифаеры, улучшаторы и обфускаторы. Обсуждаем темы юзабилити, устраиваем А/В тесты лендингов, и проводим аудит.

DTP :: @DTPublish
DTP :: @DTPublish
147 участник(ов)

Обсуждаемые темы: полиграфия, препресс, верстка, дизайн, иллюстрации, скрипты, плагины. Канал - @DTPublishing

css_jobs
css_jobs
26 участник(ов)

Чат для вопросов по css и html: @css_ru Флуд: @css_flood Канал с вакансиями и резюме: @css_jobs_feed

css_флуд
css_флуд
10 участник(ов)