Oracle
 sql >> Base de données >  >> RDS >> Oracle

tableau ou liste dans Oracle en utilisant cfprocparam

PL/SQL prend en charge les tableaux depuis Oracle 8.0. Auparavant, elles s'appelaient des tables PL/SQL, ce qui confondait tout le monde, alors maintenant elles s'appellent des collections. En savoir plus.

Le problème est qu'ils sont implémentés en tant que types définis par l'utilisateur (c'est-à-dire des objets). Ma lecture des documents ColdFusion suggère que cfprocparam ne prend en charge que les types de données "primitifs" (nombre, varchar2, etc.). Les UDT ne sont donc pas pris en charge.

Je ne sais pas ce que vous entendez par là :

Si vous voulez dire que vous voulez passer une chaîne de valeurs séparées par des virgules ....

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

alors j'ai une solution de contournement pour vous. Oracle ne fournit pas de Tokenizer intégré. Mais il y a longtemps, John Spencer a publié une solution manuelle qui fonctionne dans Oracle 9i sur les forums OTN. Trouvez-le ici.

modifier

Ne désespérez pas. Les forums OTN ont été mis à jour plusieurs fois depuis que John a posté cela, et le formatage semble avoir corrompu le code quelque part en cours de route. Il y avait quelques erreurs de compilation qu'il n'avait pas l'habitude d'avoir.

J'ai réécrit le code de John, y compris une nouvelle fonction. La principale différence est que la table imbriquée est déclarée comme un type SQL plutôt que comme un type 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;
/

Comme vous pouvez le voir, la fonction n'est qu'un wrapper de la procédure.

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

L'avantage de déclarer le type en SQL est que nous pouvons l'utiliser dans une clause FROM comme celle-ci :

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>