Как можно заполнить переменную мою собственную созданную тип данных в Oracle PL / SQL?
-
04-10-2019 - |
Вопрос
В 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