Alguém pode me dar uma pequena explicação sobre como e quando alguém deve usar o sys_refcursor?
Alguém pode me dar uma pequena explicação sobre como e quando alguém deve usar o sys_refcursor?
Respostas:
Um cursor é um ponteiro para um conjunto de resultados para uma consulta. Ao retornar um, sys_refcursor
você permite que o cliente busque quantas ou poucas linhas da consulta forem necessárias. Em aplicativos com estado, isso pode ser usado para paginar os resultados.
Um cursor pode permitir mais flexibilidade do que escrever uma função PL / SQL que retorna uma matriz, pois depende completamente do cliente quantas linhas buscar e quando parar. Dito isto, não encontrei muitos casos em que essa flexibilidade adicional seja útil.
Vale ressaltar que o tipo sys_refcursor
é fracamente digitado, para que você possa retornar ponteiros para consultas que não apenas possuem cláusulas diferentes ou onde, mas também números e tipos diferentes de colunas. Como alternativa, você pode usar um cursor fortemente digitado onde as colunas no conjunto de resultados são fixas.
Isso permite que você escreva funções que retornam consultas diferentes, como:
create function get_data ( type varchar2 ) return sys_refcursor as
ret_cur sys_refcursor;
begin
if type = 'EMP' then
open ret_cur for select * from emp;
elsif type = 'DEPT' then
open ret_cur for select * from dept;
end if;
return ret_cur;
end;
No entanto, se você estiver usando sys_refcursor
para criar uma função genérica de "abrir uma consulta" como a acima, provavelmente está fazendo algo errado!
get_emps
e get_depts
funções
Como um exemplo das possibilidades: como o pl / sql está de volta, é possível definir um objeto para representar uma linha, definir uma tabela pl / sql desses objetos,
create type T_MY_TABLE as table of t_my_object;
e termine com
OPEN p_recordset FOR select * from table( v_my_table );
Portanto, em vez de construir consultas diretas mongo, muitas vezes densas e / ou enigmáticas em uma tabela de banco de dados, é possível criar uma tabela interna e ter todo o poder do pl / sql para preenchê-la. E o cliente que coleta o conjunto de resultados não é o mais sábio. E mudar a definição da tabela interna é mais fácil do ponto de vista de gerenciamento do que alterar uma tabela do banco de dados.
Além disso, ao usar geradores de relatórios como o Jasper, você pode enviar o SQL para fora do relatório e entrar no banco de dados e apenas chamar o procedimento para obter o conjunto de registros, deixando o lado do relatório focado na formatação.