PL/SQL podporuje pole od Oracle 8.0. Dříve se jim říkalo PL/SQL tabulky, což každého sakra zmátlo, takže se jim teď říká kolekce. Zjistěte více.
Problém je v tom, že jsou implementovány jako uživatelsky definované typy (tj. objekty). Moje čtení dokumentů ColdFusion
naznačuje, že cfprocparam
podporuje pouze "primitivní" datové typy (číslo, varchar2 atd.). Takže UDT nejsou podporovány.
Nejsem si jistý, co tím myslíte:
Pokud chcete předat řetězec hodnot oddělených čárkami ....
"Fox in socks, Mr Knox, Sam-I-Am, The Lorax"
pak mám pro vás řešení. Oracle neposkytuje vestavěný Tokenizer. Ale před dlouhou dobou John Spencer zveřejnil na fórech OTN ručně vytvořené řešení, které funguje v Oracle 9i. Naleznete zde.
upravit
Nezoufejte. OTN fóra byla několikrát aktualizována od té doby, co to John zveřejnil, a zdá se, že formátování někde porušilo kód. Vyskytlo se několik chyb při kompilaci, které nepoužíval.
Přepsal jsem Johnův kód včetně nové funkce. Hlavním rozdílem je, že vnořená tabulka je deklarována jako typ SQL, nikoli jako typ 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;
/
Jak vidíte, funkce je pouze obalem procedury.
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;
/
Výhodou deklarace typu v SQL je to, že jej můžeme použít v klauzuli FROM takto:
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>