sql >> Database >  >> RDS >> Oracle

array of lijst in Oracle met behulp van cfprocparam

PL/SQL ondersteunt arrays sinds Oracle 8.0. Vroeger werden ze PL/SQL-tabellen genoemd, wat iedereen in de war bracht, dus nu worden ze verzamelingen genoemd. Meer informatie.

Het probleem is dat ze worden geïmplementeerd als door de gebruiker gedefinieerde typen (d.w.z. objecten). Mijn lezing van de ColdFusion-documenten suggereert dat cfprocparam ondersteunt alleen de "primitieve" datatypes (nummer, varchar2, etc). UDT's worden dus niet ondersteund.

Ik weet niet zeker wat je hiermee bedoelt:

Als u bedoelt dat u een reeks door komma's gescheiden waarden wilt doorgeven ....

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

dan heb ik een oplossing voor je. Oracle biedt geen ingebouwde tokenizer. Maar lang geleden publiceerde John Spencer een met de hand gerolde oplossing die werkt in Oracle 9i op de OTN-forums. Vind het hier.

bewerken

Wanhoop niet. De OTN-forums zijn een paar keer geüpgraded sinds John dat heeft gepost, en de opmaak lijkt de code ergens onderweg te hebben beschadigd. Er waren een paar compilatiefouten die het voorheen niet had.

Ik heb de code van John herschreven, inclusief een nieuwe functie. Het belangrijkste verschil is dat de geneste tabel wordt gedeclareerd als een SQL-type in plaats van een 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;
/

Zoals je kunt zien, is de functie slechts een wrapper voor de procedure.

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

Het voordeel van het declareren van het type in SQL is dat we het kunnen gebruiken in een FROM-clausule zoals deze:

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. Pivot-operator in SQL begrijpen

  2. Geef het aantal keren weer dat een locatie in de respectieve tabel verscheen nadat de overeenkomstige optie uit de vervolgkeuzelijst was gekozen

  3. Rijen (bovenliggende en onderliggende) programmatisch invoegen

  4. Rapporttool voor gegevenswoordenboek