Oracle
 sql >> Baza danych >  >> RDS >> Oracle

tablicę lub listę do Oracle za pomocą cfprocparam

PL/SQL obsługuje tablice od Oracle 8.0. Kiedyś nazywano je tabelami PL/SQL, co wprawiało wszystkich w zakłopotanie, więc teraz nazywa się je kolekcjami. Dowiedz się więcej.

Problem polega na tym, że są one zaimplementowane jako typy zdefiniowane przez użytkownika (tj. obiekty). Moja lektura dokumentów ColdFusion sugeruje, że cfprocparam obsługuje tylko "prymitywne" typy danych (number, varchar2, itp.). Dlatego UDT nie są obsługiwane.

Nie jestem pewien, co przez to rozumiesz:

Jeśli masz na myśli, że chcesz przekazać ciąg wartości oddzielonych przecinkami ....

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

to mam dla ciebie obejście. Oracle nie zapewnia wbudowanego Tokenizera. Ale dawno temu John Spencer opublikował na forach OTN rozwiązanie ręczne, które działa w Oracle 9i. Znajdź to tutaj.

edytuj

Nie rozpaczaj. Fora OTN zostały zaktualizowane kilka razy, odkąd John opublikował to , i wydaje się, że formatowanie uszkodziło gdzieś kod. Wystąpiło kilka błędów kompilacji, których nie było.

Przepisałem kod Johna, w tym nową funkcję. Główna różnica polega na tym, że zagnieżdżona tabela jest deklarowana jako typ SQL, a nie typ 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;
/

Jak widać, funkcja jest tylko opakowaniem procedury.

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

Zaletą deklarowania typu w SQL jest to, że możemy go użyć w klauzuli FROM w następujący sposób:

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. zbieraj informacje dba_users w bazie danych Oracle po połączeniu jako użytkownik

  2. zduplikowane rekordy należy usunąć Oracle db

  3. Nie można utworzyć nowego połączenia to sqldeveloepr

  4. Jak zaktualizować za pomocą wewnętrznego sprzężenia w Oracle

  5. wyodrębnianie znaku specjalnego z ciągu znaków w Oracle sql