Как можно заполнить переменную мою собственную созданную тип данных в Oracle PL / SQL?

StackOverflow https://stackoverflow.com/questions/2903142

Вопрос

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

TABLE of VARCHAR2(200)

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

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

SELECT column_value currVal FROM table(pMyPassedParameter)

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

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

Редактировать: Я должен был быть уточнен: мои исходные данные вводятся как параметр varchar2, переданный в хранимую процедуру: разделитель (как запятая) разделите строку. Я уже итерацию через разграниченную строку, чтобы получить каждое отдельное значение - я хотел бы вставить каждого в мой тип, чтобы я мог относиться к нему как таблицу для остальной части логики.

Это было полезно?

Решение

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

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

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

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

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

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

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

Редактировать 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, но он будет работать так же, если TOK_TBL были объявлены в пакете PL / SQL вместо этого.

Другие советы

Вы не упоминаете, если созданный вами тип - это тип 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top