› Fóruns › SQL e PL/SQL › Passagem de parâmetros para uma procedure › Passagem de parâmetros para uma procedure
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