Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Usando string no procedimento armazenado do Oracle


Até onde eu entendo seu problema, você precisa de um método para aceitar uma string delimitada por vírgulas como entrada, dividi-la em uma coleção de inteiros e depois comparar um número (leia-se:integer) com os valores dessa coleção.

A Oracle oferece principalmente três tipos de coleções - varrays , tabelas aninhadas e matrizes associativas . Eu explicaria como converter uma string delimitada por vírgulas em uma tabela aninhada e usá-la para consultar ou comparar.

Primeiro, você precisa definir um tipo de objeto no esquema. Você pode escrever consultas usando esse tipo somente se o definir no nível do esquema.
CREATE OR REPLACE TYPE entity_id AS OBJECT (id_val NUMBER(28));
/

CREATE OR REPLACE TYPE entity_id_set IS TABLE OF entity_id;
/

Em seguida, defina uma função como esta:
FUNCTION comma_to_nt_integer (p_comma_delimited_str IN VARCHAR)
    RETURN entity_id_set IS
    v_table     entity_id_set;
BEGIN
    WITH temp AS (SELECT TRIM(BOTH ',' FROM p_comma_delimited_str) AS str FROM DUAL)
        SELECT ENTITY_ID(TRIM (REGEXP_SUBSTR (t.str,
                                    '[^,]+',
                                    1,
                                    LEVEL)))
                   str
          BULK COLLECT INTO v_table
          FROM temp t
    CONNECT BY INSTR (str,
                      ',',
                      1,
                      LEVEL - 1) > 0;

    RETURN v_table;
END comma_to_nt_integer;

Você concluiu o DDL necessário para esta tarefa. Agora, você pode simplesmente escrever sua consulta como:
SELECT *
  FROM ..  
 WHERE ...
       AND gfcid in (table(comma_to_nt_integer(GDFCID_STRING)));