PL/SQL 从 Oracle 8.0 开始支持数组。它们曾经被称为 PL/SQL 表,这让每个人都感到困惑,所以现在它们被称为集合。了解更多。
问题是,它们是作为用户定义类型(即对象)实现的。我读到的ColdFusion 文档建议cfprocparam
仅支持“原始”数据类型(number、varchar2 等)。因此不支持 UDT。
我不确定你的意思是:
我会传递一个列表,但我不知道如何传递
使用列表将其变成
使用 PL/SQL 的数组
如果您的意思是要传递一串逗号分隔值......
"Fox in socks, Mr Knox, Sam-I-Am, The Lorax"
那么我有一个解决方法给你。 Oracle 不提供内置的 Tokenizer。但很久以前,John Spencer 在 OTN 论坛上发布了一个可在 Oracle 9i 中运行的手动解决方案。在这里找到它。
edit
但是...甲骨文讨厌我
不要灰心。自从 John 发布该消息以来,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>