PL/SQL obsługuje tablice od Oracle 8.0. Kiedyś nazywano je tabelami PL/SQL, co wprawiało wszystkich w zakłopotanie, więc teraz nazywa się je kolekcjami. Dowiedz się więcej.
Problem polega na tym, że są one zaimplementowane jako typy zdefiniowane przez użytkownika (tj. obiekty). Moja lektura dokumentów ColdFusion
sugeruje, że cfprocparam
obsługuje tylko "prymitywne" typy danych (number, varchar2, itp.). Dlatego UDT nie są obsługiwane.
Nie jestem pewien, co przez to rozumiesz:
Jeśli masz na myśli, że chcesz przekazać ciąg wartości oddzielonych przecinkami ....
"Fox in socks, Mr Knox, Sam-I-Am, The Lorax"
to mam dla ciebie obejście. Oracle nie zapewnia wbudowanego Tokenizera. Ale dawno temu John Spencer opublikował na forach OTN rozwiązanie ręczne, które działa w Oracle 9i. Znajdź to tutaj.
edytuj
Nie rozpaczaj. Fora OTN zostały zaktualizowane kilka razy, odkąd John opublikował to , i wydaje się, że formatowanie uszkodziło gdzieś kod. Wystąpiło kilka błędów kompilacji, których nie było.
Przepisałem kod Johna, w tym nową funkcję. Główna różnica polega na tym, że zagnieżdżona tabela jest deklarowana jako typ SQL, a nie 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 widać, funkcja jest tylko opakowaniem 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;
/
Zaletą deklarowania typu w SQL jest to, że możemy go użyć w klauzuli FROM w następujący sposób:
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>