sql >> Databáze >  >> RDS >> Oracle

pole nebo seznam do Oracle pomocí cfprocparam

PL/SQL podporuje pole od Oracle 8.0. Dříve se jim říkalo PL/SQL tabulky, což každého sakra zmátlo, takže se jim teď říká kolekce. Zjistěte více.

Problém je v tom, že jsou implementovány jako uživatelsky definované typy (tj. objekty). Moje čtení dokumentů ColdFusion naznačuje, že cfprocparam podporuje pouze "primitivní" datové typy (číslo, varchar2 atd.). Takže UDT nejsou podporovány.

Nejsem si jistý, co tím myslíte:

Pokud chcete předat řetězec hodnot oddělených čárkami ....

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

pak mám pro vás řešení. Oracle neposkytuje vestavěný Tokenizer. Ale před dlouhou dobou John Spencer zveřejnil na fórech OTN ručně vytvořené řešení, které funguje v Oracle 9i. Naleznete zde.

upravit

Nezoufejte. OTN fóra byla několikrát aktualizována od té doby, co to John zveřejnil, a zdá se, že formátování někde porušilo kód. Vyskytlo se několik chyb při kompilaci, které nepoužíval.

Přepsal jsem Johnův kód včetně nové funkce. Hlavním rozdílem je, že vnořená tabulka je deklarována jako typ SQL, nikoli jako 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 vidíte, funkce je pouze obalem 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;
/

Výhodou deklarace typu v SQL je to, že jej můžeme použít v klauzuli FROM takto:

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. Hibernate nemohl načíst SequenceInformation z databáze

  2. Připojte se k mnoha databázím současně v Laravel 5.2

  3. Jak převést případ řetězce v PostgreSQL

  4. Jak mohu napsat dotaz SQL pro konkrétní rozsah dat a čas pomocí SQL Server 2008?