Pular para o conteúdo

Fóruns SQL e PL/SQL Passagem de parâmetros para uma procedure Passagem de parâmetros para uma procedure

#96847
rwarstat
Participante

    Valeu Litz pela ajuda.

    Estou trabalhando também com a seguinte solução:

    1º Crio um type público, mas do tipo varchar:

    create or replace type myTableType as table
    of varchar2 (255);

    2º Crio uma função que vai retorna o meu parâmetro varchar no type criado anteriormente:

    create or replace
    function in_list( p_string in varchar2 ) return myTableType
    as
    l_string long default p_string || ',';
    l_data myTableType := myTableType();
    n number;
    begin
    loop
    exit when l_string is null;
    n := instr( l_string, ',' );
    l_data.extend;
    l_data(l_data.count) :=
    ltrim( rtrim( substr( l_string, 1, n-1 ) ) );
    l_string := substr( l_string, n+1 );
    end loop;

    return l_data;
    

    end;

    3º Altero a clausula where do select para conter a chamada da função:

    SELECT 1
    INTO v_result
    FROM sol_exame se
    WHERE se.cd_paciente IN
    (SELECT *
    FROM THE (SELECT CAST (in_list (p_cd_paciente) AS mytableType) FROM DUAL) a)

    A minha procedure vai ficar da seguinte maneira:

    CREATE OR REPLACE PROCEDURE pr_teste (p_cd_paciente IN TYP_TB_OBJ_NUMBER)
    AS
    v_result NUMBER (1);
    BEGIN
    SELECT 1
    INTO v_result
    FROM sol_exame se
    WHERE se.cd_paciente IN
    (SELECT *
    FROM THE (SELECT CAST (in_list (p_cd_paciente) AS mytableType) FROM DUAL) a);
    END;

    4º A chamada da função ficou assim:

    DECLARE
    P_CD_PACIENTE VARCHAR2(32767);

    BEGIN
    P_CD_PACIENTE := '2702, 2703';

    INFOSAUDE.PR_TESTE ( P_CD_PACIENTE );
    COMMIT;
    END;

    Essa forma de fazer consegui através de uma lista, onde me indicaram o seguinte link
    http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:210612357425#9304006450690

    Havia pensado também em fazer usando tabela temporária, mas me parece que o custo para o banco seria maior em razão de ter que ir “cortando” a variável de parâmetro e fazer a inserção na tabela. Por isso, essa foi descartada.

    Abraço,
    Roberto