Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

mảng hoặc danh sách vào Oracle bằng cfprocparam

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> 



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ngày truyền trong oracle

  2. Cách tốt nhất để xác định phiên bản ứng dụng khách Oracle mà tôi đang chạy là gì?

  3. Có vấn đề với các thực thể JPA, Oracle 10g và thuộc tính Loại lịch không?

  4. .NET Oracle quản lý kết nối kết nối truy cập dữ liệu không hoạt động hoặc chậm

  5. Sử dụng nzload để tải các ký tự đặc biệt