Escrevo aplicativos da Web básicos há um ano (para um banco de dados Oracle) e, como as funções são bem simples, a maioria de nós usa loops FOR regulares para obter nossos dados:
for i in (select * from STUDENTS) loop
htp.prn(i.student_last_name || ', ' || i.student_first_name || ' ' || i.student_dob);
end loop;
Mas, os cursores parecem ser a maneira 'certa' de fazer as coisas. Posso encontrar muitas informações sobre o que são os cursores e maneiras diferentes de fazer um loop entre eles, mas não consigo encontrar uma razão sólida para usá-los em loops FOR regulares. Depende das necessidades do procedimento? Existem vantagens inerentes das quais devo estar ciente?
FOR
é apenas outra maneira de usar cursores. Consulte os documentos: docs.oracle.com/cd/E11882_01/appdev.112/e10472/… Enfim, o que htp.prn () faz?FOR
loop é muito mais legível, eu acho. Eu tendem a usar cursores 'reais' apenas se tiver que dar um passo para trás, não apenas para frente. Fiz essa outra pergunta porque posso imaginar uma função de tabela em vez dehtp.prn()
.Respostas:
Um cursor pode ser explícito ou implícito e qualquer um dos tipos pode ser usado em um loop FOR. Existem realmente dois aspectos em sua pergunta.
Por que usar um loop FOR explícito do cursor sobre um loop FOR implícito do cursor?
Por que usar um loop com um FETCH em vez de um loop FOR que não possui um FETCH explícito?
Aqui estão algumas informações úteis da documentação.
Exemplo de cursor implícito FOR LOOP
Exemplo de Cursor Explícito FOR LOOP
Cursor implícito
Cursor explícito
Instruções Cursor FOR LOOP
fonte
O código que você postou está usando um cursor. Está usando um loop implícito do cursor.
Há casos em que o uso de um loop explícito do cursor (por exemplo, declarar uma variável CURSOR na seção de declaração) produz código mais limpo ou melhor desempenho
student_cursor
em vez de incluir uma instrução SQL de 30 linhas que incorpora um monte de lógica. Por exemplo, se você estava imprimindo todos os alunos que foram liberados para se formar e que envolviam ingressar em tabelas que tinham seus registros acadêmicos, os requisitos do programa de graduação, tabelas com informações sobre retenções acadêmicas, tabelas com informações sobre livros vencidos da biblioteca, tabelas com informações sobre taxas não pagas, substituições administrativas, etc. provavelmente faria sentido refatorar o código para que essa consulta não ficasse no meio do código que se preocupa em apresentar a lista a um usuário. Isso pode envolver a criação de uma visão que encapsularia toda essa lógica. Ou pode envolver a criação de um cursor explícito que foi declarado como parte do bloco PL / SQL atual ou em algum bloco PL / SQL de nível superior (por exemplo, um cursor declarado em um pacote) para que seja reutilizável. Ou pode envolver fazer outra coisa para encapsulamento e reutilização (por exemplo, criando uma função de tabela em pipeline).htp.prn
, fazer umBULK COLLECT
provavelmente não comprará nada. Em outros casos, no entanto, pode resultar em melhorias substanciais no desempenho.fonte
Vejo que muitos desenvolvedores estão usando cursores explícitos em vez de cursores implícitos, fora do antigo hábito. Isso porque no Oracle versão 7, esse sempre foi o caminho mais eficiente. Hoje em dia geralmente existe o contrário. Especialmente com o otimizador que, se necessário, pode reescrever o cursor implícito para loops em uma coleta em massa.
fonte
Recentemente, tive que reescrever um monte de consultas de um loop FOR implícito em cursores explícitos. O motivo foi que as consultas buscaram dados de um banco de dados externo via link e esse banco de dados tinha uma codificação diferente do nosso banco de dados local. Ao transferir dados do cursor implícito para um tipo de registro definido localmente, ocorreram erros intermitentes misteriosos (apenas em determinadas linhas específicas). Nosso DBA explicou isso para nós, não teríamos sido capazes de chegar ao fundo disso sozinhos. Parece que esse erro foi relatado no Oracle.
Fomos aconselhados a reescrever tudo usando cursores explícitos e o erro desapareceu.
Não é o principal motivo pelo qual você pode usar explícito ou implícito, mas vale a pena notar.
Edição: Oracle 12c.
fonte