将复杂查询结果作为PL SQL中的参数传递

时间:2016-04-29 09:13:12

标签: oracle plsql cursor

我的目标是在一个过程中执行一个查询,然后将结果传递给另一个处理数据并打印一些html表的过程。

type utentiCursorType IS REF CURSOR; /*in a separate package*/

procedure GeneraRisultatiClienti(
IdSessione integer,
Nome varchar2,
Cognome varchar2,
Giorno varchar2,
Mese varchar2,
Anno varchar2,
Via varchar2,
Civico varchar2,
CapZip varchar2,
Citta varchar2,
Stato varchar2,
Telefono varchar2,
Mobile varchar2 default '',
Email varchar2,
Username varchar2
 ) is
clienti_cur utentiCursorType;
begin
open clienti_cur for
  select u.id, u.nome, u.cognome, u.username
  from Utenti u, Clienti c
  where u.id = c.id_Utente
  and (Nome is null or u.nome = Nome ) 
  and (Cognome is null or u.cognome = Cognome)
  and (DataDiNascita is null or u.data_di_nascita = DataDiNascita)
  and (Via is null or u.via = Via)
  and (Civico is null or u.civico = Civico)
  and (CapZip is null or u.cap_zip = CapZip)
  and (Citta is null or u.citta = Citta)
  and (Stato is null or u.stato = Stato)
  and (Telefono is null or u.telefono = Telefono)
  and (Mobile is null or u.mobile = Mobile)
  and (Email is null or u.email = Email)
  and (Username is null or u.username = Username);

pkgruppo1.VisualizzaClienti(IdSessione, clienti_cur);

end GeneraRisultatiClienti;

procedure VisualizzaClienti(IdSessione integer, risultati in utentiCursorType) is

/*riga Risultati%ROWTYPE;*/

begin

    modGUI.ApriPagina('Risultati', IdSessione);
    pkgruppo1.CreaMenuGruppo1(IdSessione);

    modGUI.ApriTabella;

    modGUI.ApriRigaTabella;
    modGUI.IntestazioneTabella('Nome');
    modGUI.IntestazioneTabella('Cognome');
    modGUI.IntestazioneTabella('Username');
    modGUI.ChiudiRigaTabella;

    for riga in risultati
    loop

        modGUI.ApriRigaTabellaConBottoni('proceduraGestioneAzione');

        modGUI.PassaParametro('IdRecord', riga.id);
        modGUI.ElementoTabella(riga.nome);
        modGUI.ElementoTabella(riga.cognome);
        modGUI.ElementoTabella(riga.username);

        modGUI.ChiudiRigaTabellaConBottoni('azDettagli', 'azModifica', 'azElimina');
    modGUI.ChiudiTabella;

    modGUI.ChiudiPagina;

    end loop;*/

end VisualizzaClienti;

如您所见,我想使用常规游标类型,因为查询结果并不总是相同。 显然"对于里面的人来说"不起作用。 如何处理该光标而不使用像fetch into?

这样的东西

由于

1 个答案:

答案 0 :(得分:0)

使用ref_cursor来记录araound ... 在网络上搜索https://oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets

等样本