PL / SQL đã hỗ trợ mảng kể từ Oracle 8.0. Chúng từng được gọi là bảng PL / SQL khiến mọi người nhầm lẫn, vì vậy bây giờ chúng được gọi là bộ sưu tập. Tìm hiểu thêm.
Vấn đề là chúng được triển khai dưới dạng Các kiểu do người dùng xác định (tức là các đối tượng). Tôi đọc tài liệu ColdFusion
gợi ý rằng cfprocparam
chỉ hỗ trợ các kiểu dữ liệu "nguyên thủy" (số, varchar2, v.v.). Vì vậy, UDT không được hỗ trợ.
Tôi không chắc bạn muốn nói gì về điều này:
Nếu bạn muốn chuyển một chuỗi giá trị được phân tách bằng dấu phẩy ....
"Fox in socks, Mr Knox, Sam-I-Am, The Lorax"
thì tôi có một giải pháp cho bạn. Oracle không cung cấp Tokenizer tích hợp sẵn. Nhưng cách đây khá lâu, John Spencer đã xuất bản một giải pháp cuộn bằng tay hoạt động trong Oracle 9i trên các diễn đàn OTN. Tìm nó ở đây.
chỉnh sửa
Đừng tuyệt vọng. Các diễn đàn OTN đã được nâng cấp một vài lần kể từ khi John đăng điều đó, và định dạng có vẻ như đã làm hỏng mã ở đâu đó trên đường đi. Có một số lỗi biên dịch mà nó không sử dụng để mắc phải.
Tôi đã viết lại mã của John, bao gồm một chức năng mới. Điểm khác biệt chính là bảng lồng nhau được khai báo là kiểu SQL chứ không phải kiểu 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;
/
Như bạn có thể thấy, hàm chỉ là một trình bao bọc cho thủ tục.
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;
/
Lợi ích của việc khai báo kiểu trong SQL là chúng ta có thể sử dụng nó trong một mệnh đề FROM như sau:
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>