Как заполнить переменную моего собственного созданного типа данных в Oracle PL / SQL? - PullRequest
0 голосов
/ 25 мая 2010

В Oracle я создал тип данных:

TABLE of VARCHAR2(200)

Я хочу иметь переменную этого типа в хранимой процедуре (определяемую локально, а не как фактическую таблицу в БД) и заполнять ее данными.

Некоторые онлайн-примеры показывают, как я использовал бы мой тип, если он был заполнен и передан в качестве параметра хранимой процедуре:

SELECT column_value currVal FROM table(pMyPassedParameter)

Однако я хочу заполнить его во время самого кода PL / SQL с помощью операторов INSERT.

Кто-нибудь знает синтаксис этого?

РЕДАКТИРОВАТЬ: я должен был уточнить: мои исходные данные вводятся как параметр VARCHAR2, передаваемый хранимой процедуре: строка с разделителем (как запятая) с разделителями Я уже перебираю строку с разделителями, чтобы получить каждое отдельное значение - я хотел бы вставить каждое из них в свой тип, чтобы я мог рассматривать его как TABLE для остальной логики.

Ответы [ 2 ]

4 голосов
/ 25 мая 2010

«Я хочу, чтобы заполнить его во время PL / SQL сам код с инструкциями INSERT "

Это похоже на заполнение любой другой переменной PL / SQL: мы должны использовать INTO. Только потому, что мы заполняем несколько строк, нам нужно использовать синтаксис BULK COLLECT.

declare
    l_array your_nested_table_type;
begin
    select col1
    bulk collect into l_array
    from t72;
end;
/

Если результирующий набор возвращает много записей, рекомендуется использовать предложение LIMIT внутри цикла. Это потому, что коллекции PL / SQL - как и любая другая переменная PL / SQL - хранятся в памяти сеанса. Поэтому мы не хотим, чтобы массив становился слишком большим, иначе он может взорвать PGA. Узнайте больше .

редактировать

"Я отредактировал вопрос, чтобы уточнить именно то, что я хочу "

вздох Токенизация строки - это совсем другая проблема. Ранее я публиковал решения в двух темах. Если вы используете 9i или более раннюю версию, используйте , этот подход . В противном случае используйте это решение регулярного выражения (на самом деле это разбивает строку на числовые токены, но преобразование в символы достаточно просто).

редактировать 2

«Я только хочу иметь возможность использовать тип "внутренне" (в пределах сохраненного Процедура), добавив значения к нему. Является это то, что я могу сделать с первым ссылка? "

Конечно. Почему нет?

SQL> declare
  2      local_array tok_tbl;
  3  begin
  4      local_array := parser.my_parse('Keith Pellig,Peter Wakeman,Ted Bentley,Eleanor Stevens');
  5      local_array.extend();
  6      local_array(5) := 'Reese Verrick';
  7      for i in local_array.first()..local_array.last()
  8      loop
  9          dbms_output.put_line(local_array(i));
 10      end loop;
 11  end;
 12  /
Keith Pellig
Peter Wakeman
Ted Bentley
Eleanor Stevens
Reese Verrick

PL/SQL procedure successfully completed.

SQL>

Здесь я повторно использовал свой тип SQL, но он бы работал так же хорошо, если бы вместо этого в пакете PL / SQL было объявлено TOK_TBL.

3 голосов
/ 25 мая 2010

вы не упоминаете, является ли созданный вами тип типом SQL или типом PL / SQL. Они аналогично используются в Pl / SQL, поэтому я предполагаю, что вы создали тип SQL с помощью команды, подобной этой:

SQL> CREATE TYPE tab_varchar IS TABLE of VARCHAR2(200);
  2  /

Type created

Это вложенная таблица. Узнайте , как манипулировать коллекциями в PL / SQL , в документации, например:

SQL> DECLARE
  2     lt tab_varchar;
  3  BEGIN
  4     /* initialization */
  5     lt := tab_varchar('a', 'b', 'c');
  6     /* adding elements */
  7     lt.extend(1);
  8     lt(4) := 'd';
  9     FOR i IN lt.FIRST .. lt.LAST LOOP
 10        dbms_output.put_line('lt(' || i || ')=' || lt(i));
 11     END LOOP;
 12  END;
 13  /

lt(1)=a
lt(2)=b
lt(3)=c
lt(4)=d
...