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

Usando una cadena en el procedimiento almacenado de Oracle

Según entiendo su problema, necesita un método para aceptar una cadena delimitada por comas como entrada, dividirla en una colección de enteros y luego comparar un número (léase:entero) con los valores de esta colección.

Oracle ofrece principalmente tres tipos de colecciones - varrays , tablas anidadas y matrices asociativas . Explicaría cómo convertir una cadena delimitada por comas en una tabla anidada y usarla para consultar o comparar.

Primero, debe definir un tipo de objeto en el esquema. Puede escribir consultas utilizando este tipo solo si lo define a nivel de 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;
/

A continuación, defina una función 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;

Ha terminado con el DDL requerido para esta tarea. Ahora, simplemente puede escribir su consulta como:

SELECT *
  FROM ..  
 WHERE ...
       AND gfcid in (table(comma_to_nt_integer(GDFCID_STRING)));