PL / SQL поддерживает массивы начиная с Oracle 8.0. Раньше их называли PL / SQL-таблицами, которые запутывали всех, так что теперь их называют коллекциями. Узнайте больше.
Проблема в том, что они реализованы как пользовательские типы (то есть объекты). Мое чтение документов ColdFusion предполагает, что cfprocparam
поддерживает только "примитивные" типы данных (число, varchar2 и т. Д.). Таким образом, UDT не поддерживаются.
Я не уверен, что вы подразумеваете под этим:
Я бы пропустил список, но не понимаю, как
работать со списком, чтобы превратить его в
массив с использованием PL / SQL
Если вы имеете в виду, что хотите передать строку значений, разделенных запятыми ....
"Fox in socks, Mr Knox, Sam-I-Am, The Lorax"
тогда у меня есть обходной путь для вас. Oracle не предоставляет встроенный токенизатор. Но давным-давно Джон Спенсер опубликовал собственное решение, которое работает в Oracle 9i на форумах OTN. Найдите это здесь.
1024 * редактировать *
но ... Оракул ненавидит меня
Не отчаивайся. Со времени публикации Джоном форумы OTN несколько раз обновлялись, и форматирование, похоже, повредило код где-то на этом пути. Была пара ошибок компиляции, которые он не использовал, чтобы иметь.
Я переписал код Джона, включая новую функцию. Основное отличие состоит в том, что вложенная таблица объявляется как тип SQL, а не как тип PL / SQL.
create or replace type tok_tbl as table of varchar2(225)
/
create or replace package parser is
function my_parse(
p_str_to_search in varchar2
, p_delimiter in varchar2 default ',')
return tok_tbl;
procedure my_parse(
p_str_to_search in varchar2
, p_delimiter in varchar2 default ','
, p_parsed_table out tok_tbl);
end parser;
/
Как видите, функция - это просто оболочка для процедуры.
create or replace package body parser is
procedure my_parse ( p_str_to_search in varchar2
, p_delimiter in varchar2 default ','
, p_parsed_table out tok_tbl)
is
l_token_count binary_integer := 0;
l_token_tbl tok_tbl := tok_tbl();
i pls_integer;
l_start_pos integer := 1;
l_end_pos integer :=1;
begin
while l_end_pos != 0
loop
l_end_pos := instr(p_str_to_search,p_delimiter,l_start_pos);
if l_end_pos != 0 then
l_token_count := l_token_count + 1;
l_token_tbl.extend();
l_token_tbl(l_token_count ) :=
substr(p_str_to_search,l_start_pos,l_end_pos - l_start_pos);
l_start_pos := l_end_pos + 1;
end if;
end loop;
l_token_tbl.extend();
if l_token_count = 0 then /* we haven't parsed anything so */
l_token_count := 1;
l_token_tbl(l_token_count) := p_str_to_search;
else /* we need to get the last token */
l_token_count := l_token_count + 1;
l_token_tbl(l_token_count) := substr(p_str_to_search,l_start_pos);
end if;
p_parsed_table := l_token_tbl;
end my_parse;
function my_parse ( p_str_to_search in varchar2
, p_delimiter in varchar2 default ',')
return tok_tbl
is
rv tok_tbl;
begin
my_parse(p_str_to_search, p_delimiter, rv);
return rv;
end my_parse;
end parser;
/
Преимущество объявления типа в SQL заключается в том, что мы можем использовать его в предложении FROM, например:
SQL> insert into t23
2 select trim(column_value)
3 from table(parser.my_parse('Fox in socks, Mr Knox, Sam-I-Am, The Lorax'))
4 /
4 rows created.
SQL> select * from t23
2 /
TXT
------------------------------------------------------------------------------
Fox in socks
Mr Knox
Sam-I-Am
The Lorax
SQL>