PL/SQL har stöd för arrayer sedan Oracle 8.0. De brukade kallas PL/SQL-tabeller vilket förvirrade alla, så nu kallas de samlingar. Ta reda på mer.
Problemet är att de är implementerade som användardefinierade typer (dvs objekt). Min läsning av ColdFusion-dokumenten
föreslår att cfprocparam
stöder endast de "primitiva" datatyperna (nummer, varchar2, etc). Så UDT:er stöds inte.
Jag är inte säker på vad du menar med detta:
Om du menar att du vill skicka en sträng av kommaseparerade värden ....
"Fox in socks, Mr Knox, Sam-I-Am, The Lorax"
då har jag en lösning för dig. Oracle tillhandahåller inte en inbyggd Tokenizer. Men för länge sedan publicerade John Spencer en handrullad lösning som fungerar i Oracle 9i på OTN-forum. Hitta den här.
redigera
Misströsta inte. OTN-forumen har uppgraderats några gånger sedan John postade det, och formateringen verkar ha skadat koden någonstans på vägen. Det fanns ett par kompileringsfel som den inte brukade ha.
Jag har skrivit om Johns kod, inklusive en ny funktion. Huvudskillnaden är att den kapslade tabellen deklareras som en SQL-typ snarare än en PL/SQL-typ.
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;
/
Som du kan se är funktionen bara ett omslag till proceduren.
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;
/
Fördelen med att deklarera typen i SQL är att vi kan använda den i en FROM-sats så här:
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>