DECLARE
CURSOR C_DADOS( V_CLIENTE NUMBER, V_ID_INI NUMBER) IS
select *
from lms_pd.docto_servico ds
inner join lms_pd.evento_documento_servico eds on (eds.id_docto_servico = ds.id_docto_servico)
/*
where ds.id_cliente_remetente = 206116 and
eds.id_evento_documento_servico > 568650757
*/
where ds.id_cliente_remetente = V_CLIENTE
AND eds.id_evento_documento_servico > V_ID_INI
order by eds.id_evento_documento_servico;
R_DADOS C_DADOS%ROWTYPE;
BEGIN
OPEN C_DADOS(206116,568102156);
LOOP
FETCH C_DADOS INTO R_DADOS;
EXIT WHEN C_DADOS%NOTFOUND;
DBMS_OUTPUT.put(R_DADOS.CD_EMPRESA);
DBMS_OUTPUT.put_line(R_DADOS.NU_NOTA_FISCAL);
END LOOP;
CLOSE C_DADOS;
END;
Se eu colocar os valores fixos o retrorno é muito rápido, mas se colocar com as variáveis fica muito lento!
DECLARE
TYPE EmpCurTyp IS REF CURSOR;
emp_cv EmpCurTyp;
emp_rec employees%ROWTYPE;
sql_stmt VARCHAR2(200);
v_job VARCHAR2(10) := 'ST_CLERK';
BEGIN
sql_stmt := 'SELECT * FROM employees WHERE job_id = :j';
OPEN emp_cv FOR sql_stmt USING v_job;
LOOP
FETCH emp_cv INTO emp_rec;
EXIT WHEN emp_cv%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Name: ' || emp_rec.last_name || ' Job Id: ' ||
emp_rec.job_id);
END LOOP;
CLOSE emp_cv;
END;
/
Talvez os fortistas possam ajudar com outras sugestões.]
É Oracle 10G? Se sim, você está tendo problemas com as variáveis bind porque provavelmente o Oracle não está conseguindo fazer bind peeking e consequentemente utilizar índices para otimizar a consulta. Quando você põe os valores fixos, o Oracle consegue fazer isso! No 11G existe uma nova feature chamada Adaptive Cursor que normalmente resolve este problema.
Veja se o parâmetro CURSOR_SHARING do seu Bd está com valor diferente de EXACT?