Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

array atau daftar ke Oracle menggunakan cfprocparam

PL/SQL telah mendukung array sejak Oracle 8.0. Mereka dulu disebut tabel PL/SQL yang membingungkan semua orang, jadi sekarang mereka disebut koleksi. Cari tahu lebih lanjut.

Masalahnya adalah, mereka diimplementasikan sebagai Tipe Buatan Pengguna (yaitu objek). Bacaan saya tentang dokumen ColdFusion menyarankan bahwa cfprocparam hanya mendukung tipe data "primitif" (angka, varchar2, dll). Jadi UDT tidak didukung.

Saya tidak yakin apa yang Anda maksud dengan ini:

Jika maksud Anda, Anda ingin meneruskan string nilai yang dipisahkan koma ....

"Fox in socks, Mr Knox, Sam-I-Am, The Lorax"

maka saya punya solusi untuk Anda. Oracle tidak menyediakan Tokenizer bawaan. Tapi lama sekali John Spencer menerbitkan solusi gulung tangan yang bekerja di Oracle 9i di forum OTN. Temukan di sini.

edit

Jangan putus asa. Forum OTN telah ditingkatkan beberapa kali sejak John memposting itu , dan pemformatan tampaknya telah merusak kode di suatu tempat di sepanjang jalan. Ada beberapa kesalahan kompilasi yang tidak biasa terjadi.

Saya telah menulis ulang kode John, termasuk fungsi baru. Perbedaan utamanya adalah tabel bersarang dideklarasikan sebagai tipe SQL daripada tipe 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;
/

Seperti yang Anda lihat, fungsinya hanyalah pembungkus prosedur.

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;
/

Keutamaan mendeklarasikan tipe dalam SQL adalah kita dapat menggunakannya dalam klausa FROM seperti ini:

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. Bagaimana memahami statistik file jejak di Oracle. Seperti CPU, waktu yang telah berlalu, kueri...dll

  2. Sql:Mengoptimalkan klausa ANTARA

  3. Unggahan file dalam aplikasi PL/SQL non-Apex dimigrasikan ke ORDS

  4. Apakah mungkin menggunakan sql%rowcount untuk SELECT?

  5. Bagaimana Anda mendapatkan hasil yang diformat dengan baik dari prosedur Oracle yang mengembalikan kursor referensi?