PL/SQL поддържа масиви от Oracle 8.0. Преди се наричаха PL/SQL таблици, което объркваше всички, така че сега се наричат колекции. Научете повече.
Проблемът е, че те се изпълняват като дефинирани от потребителя типове (т.е. обекти). Моето четене на документите на ColdFusion
предполага, че cfprocparam
поддържа само "примитивните" типове данни (number, varchar2 и т.н.). Така че UDT не се поддържат.
Не съм сигурен какво имате предвид с това:
Ако имате предвид, че искате да предадете низ от стойности, разделени със запетая...
"Fox in socks, Mr Knox, Sam-I-Am, The Lorax"
тогава имам решение за вас. Oracle не предоставя вграден токенизатор. Но преди много време Джон Спенсър публикува ръчно разработено решение, което работи в Oracle 9i във форумите на OTN. Намерете го тук.
редактиране
Не се отчайвай. 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>