sql >> Base de Datos >  >> RDS >> Oracle

matriz o lista en Oracle usando cfprocparam

PL/SQL admite arreglos desde Oracle 8.0. Solían llamarse tablas PL/SQL que confundían a todos, así que ahora se llaman colecciones. Más información

El problema es que se implementan como tipos definidos por el usuario (es decir, objetos). Mi lectura de los documentos de ColdFusion sugiere que cfprocparam solo admite los tipos de datos "primitivos" (número, varchar2, etc.). Por lo tanto, los UDT no son compatibles.

No estoy seguro de lo que quieres decir con esto:

Si quiere decir que desea pasar una cadena de valores separados por comas...

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

entonces tengo una solución para usted. Oracle no proporciona un Tokenizer integrado. Pero hace mucho tiempo, John Spencer publicó en los foros de OTN una solución hecha a mano que funciona en Oracle 9i. Encuéntralo aquí.

editar

No se desesperen. Los foros de OTN se han actualizado varias veces desde que John publicó eso, y el formato parece haber corrompido el código en algún momento. Hubo un par de errores de compilación que no solía tener.

He reescrito el código de John, incluyendo una nueva función. La principal diferencia es que la tabla anidada se declara como un tipo SQL en lugar de un tipo 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;
/

Como puede ver, la función es solo un envoltorio para el procedimiento.

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

La virtud de declarar el tipo en SQL es que podemos usarlo en una cláusula FROM como esta:

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>