sql >> Database teknologi >  >> RDS >> Oracle

array eller liste ind i Oracle ved hjælp af cfprocparam

PL/SQL har understøttet arrays siden Oracle 8.0. De plejede at blive kaldt PL/SQL-tabeller, hvilket forvirrede alle, så nu kaldes de samlinger. Få mere at vide.

Problemet er, at de er implementeret som brugerdefinerede typer (dvs. objekter). Min læsning af ColdFusion-dokumenterne foreslår, at cfprocparam understøtter kun de "primitive" datatyper (nummer, varchar2 osv.). Så UDT'er understøttes ikke.

Jeg er ikke sikker på, hvad du mener med dette:

Hvis du mener, at du vil sende en streng af kommaseparerede værdier ....

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

så har jeg en løsning til dig. Oracle har ikke en indbygget Tokenizer. Men for lang tid siden offentliggjorde John Spencer en håndrullet løsning, som virker i Oracle 9i på OTN-foraerne. Find det her.

rediger

Fortvivl ikke. OTN-foraene er blevet opgraderet et par gange siden John skrev det, og formateringen ser ud til at have ødelagt koden et eller andet sted undervejs. Der var et par kompileringsfejl, som den ikke plejede at have.

Jeg har omskrevet Johns kode, inklusive en ny funktion. Den største forskel er, at den indlejrede tabel er erklæret som en SQL-type snarere end en PL/SQL-type.

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

Som du kan se, er funktionen kun en indpakning af proceduren.

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

Fordelen ved at erklære typen i SQL er, at vi kan bruge den i en FROM-sætning som denne:

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. Slip af med dobbelte anførselstegn med SQLalchemy for PostgreSQL

  2. Psycopg2 copy_from kaster DataError:ugyldig inputsyntaks for heltal

  3. Kan ikke bruge krydstabulator i Postgres

  4. Lagring af json, jsonb, hstore, xml, enum, ipaddr osv. mislykkes med kolonne x er af typen json, men udtryk er af typen, der varierer