PL / SQLは、Oracle8.0以降でアレイをサポートしています。以前はPL/SQLテーブルと呼ばれていたため、誰もが混乱していました。現在はコレクションと呼ばれています。 詳細a>
問題は、それらがユーザー定義タイプ(つまりオブジェクト)として実装されていることです。 ColdFusionドキュメント
を読んだ cfprocparam
が 「プリミティブ」データ型(number、varchar2など)のみをサポートします。したがって、UDTはサポートされていません。
これが何を意味するのかわかりません:
カンマ区切りの値の文字列を渡したい場合は....
"Fox in socks, Mr Knox, Sam-I-Am, The Lorax"
その後、私はあなたのための回避策があります。 Oracleは、組み込みのTokenizerを提供していません。しかし、ずっと前に、John Spencerは、OTNフォーラムでOracle9iで機能する手動ソリューションを公開しました。 ここで見つけてください。
編集
絶望するな。 Johnが投稿してからOTNフォーラムは数回アップグレードされており、フォーマットによってコードが破損しているようです。以前は使用していなかったコンパイルエラーがいくつかありました。
新しい関数を含めて、ジョンのコードを書き直しました。主な違いは、ネストされた表がPL/SQL型ではなく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>