Sometimes it would be easy to have a view which is parameterized. One of the options is to use sys_context. Another option is to makeuse of a pipelined function.

Example package
CREATE OR REPLACE PACKAGE okps_preop_tst IS
TYPE outrec_typ IS RECORD (
id                pof_dossiers.id%TYPE,
dossier_type      pof_dossiers.dsr_type%TYPE,
dossier_nr        pof_dossiers.dossier_nr%TYPE,
dossier_datum     pof_dossiers.dossier_datum%TYPE,
patient_nr        pof_dossiers.patient_nr%TYPE,
geplande_ok_datum pof_dossiers.geplande_ok_datum%TYPE,
spm_id            pof_dossiers.spm_id%TYPE,
bevroren          pof_dossiers.bevroren%TYPE,
naam_patient      pof_vragenlijst.antwoord%TYPE,
operateur1        pof_vragenlijst.antwoord%TYPE,
operateur2        pof_vragenlijst.antwoord%TYPE,
);
TYPE outrecset IS TABLE OF outrec_typ;

— Recordtype = operatiegegevens + dossiergegevens

TYPE outrec_typ2 IS RECORD (
ok_sessie_kenmerk_id    ok_sessies_kenmerken.ok_sessie_kenmerk_id%TYPE,
volgnummer              operaties.volgnummer%TYPE,
datum                   ok_sessies.datum%TYPE,
specialisten            ok_sessies.specialisten%TYPE,
resterende_tijd         number,
osk_opmerking           ok_sessies_kenmerken.opmerking%TYPE,
begintijd               ok_sessies_kenmerken.begintijd%TYPE,
eindtijd                ok_sessies_kenmerken.eindtijd%TYPE,
naam                    varchar2(50),
meisjesnaam             varchar2(50),
geboortedatum           date,
geslacht                varchar2(1),
patient_nr              pof_dossiers.patient_nr%TYPE,
operateur1              varchar2(4000),
operateur2              varchar2(4000),
);
TYPE outrecset2 IS TABLE OF outrec_typ2;

FUNCTION v_dossiers(p_specialisme in varchar2,p_datum in date) RETURN outrecset PIPELINED;
FUNCTION v_operaties(p_specialisme in varchar2,p_datum in date) RETURN outrecset2 PIPELINED;
END okps_preop_tst;
/
CREATE OR REPLACE PACKAGE BODY okps_preop_tst IS
FUNCTION v_dossiers(p_specialisme in varchar2,p_datum in date) RETURN outrecset PIPELINED
IS

— Parameters
—     p_specialisme : Code voor specialisme
—     p_datum       : Minimale (zoek)datum

out_rec outrec_typ;
BEGIN
FOR i in (select
dsr.id
,dsr.dsr_type dossier_type
,dsr.dossier_nr                                                        dossier_nr
,dsr.dossier_datum                                                     dossier_datum
,dsr.patient_nr                                                        patient_nr
,dsr.geplande_ok_datum                                                 geplande_ok_datum
,dsr.spm_id                                                            spm_id
,dsr.bevroren                                                          bevroren
,max(decode(vrg.vraag_nr,4,vragenlijst.antwoord,null))                 naam_patient
,max(decode(vrg.vraag_nr,8,vragenlijst.antwoord,null))                 operateur1
,max(decode(vrg.vraag_nr,8,vragenlijst.antwoord2,null))                 operateur2
from pof_dossiers     dsr
,    pof_vragenlijst  vragenlijst
,    pof_specialismen spm
,    pof_vragen vrg
where dsr.id               = vragenlijst.dsr_id
and   dsr.spm_id           = spm.id
and   vrg.id               = vragenlijst.vrg_id
and   (dsr.geplande_ok_datum>=p_datum or dsr.geplande_ok_datum is null)
and   afgevoerd=’N’
and   spm.specialisme_code = nvl(p_specialisme,spm.specialisme_code)
and   vrg.vraag_nr in (4,8,10,11,12,14,16,19,20,21,28,29,30,51,52,61,63,80,87,93,94,96,97,101,122,130,132,136,137
,138,139,140,141,143,144)
group by dsr.id, dsr.dsr_type, dsr.dossier_nr, dsr.dossier_datum, dsr.patient_nr, dsr.geplande_ok_datum, dsr.spm_id, dsr.bevroren) LOOP\
PIPE ROW(i);
END LOOP;
RETURN;
END v_dossiers;



FUNCTION v_operaties(p_specialisme in varchar2,p_datum in date) RETURN outrecset2 PIPELINED
IS
out_rec outrec_typ2;
BEGIN
FOR i in (select osk.ok_sessie_kenmerk_id, ope.volgnummer , oks.datum
,      oks.specialisten , ok_tijd_prog_new(osk.ok_sessie_kenmerk_id,mv_preop.tijdsduur) resterende_tijd
,      osk.opmerking osk_opmerking
,      osk.begintijd, osk.eindtijd
,      pc.naam, pc.meisjesnaam , pc.geboortedatum , pc.geslacht
,      mv_preop.patient_nr ,    ok_operateurs(ope.operatie_id)      operateur1
,    ok_operateurs(ope.operatie_id,2)      operateur2
from oks ok
,    ok_sessies  oks
,    ok_sessies_kenmerken   osk
,    specialismen   spme
,    sessies   ses
,    kenmerken     kenm
,    operaties    ope
,    dba_patienten.patienten@proddb   pc
,    TABLE(v_dossiers(p_specialisme,p_datum))   mv_preop
where oks.ok_id                    = ok.ok_id (+)
and   oks.datum                    > p_datum
and   spme.specialisme_code        = nvl(p_specialisme,spme.specialisme_code)
and   oks.ok_sessie_id             = osk.ok_sessie_id
and   spme.specialisme_id (+)      = oks.specialisme_id
and   ses.sessie_id (+)            = oks.sessie_id
and   kenm.kenmerk_id  (+)         = osk.kenmerk_id
and   ope.ok_sessie_kenmerk_id (+) = osk.ok_sessie_kenmerk_id
and   pc.patientnummer (+)         = ope.patient_nr
and   mv_preop.id (+)              = ope.dossier_id) LOOP
PIPE ROW(i);
END LOOP;
RETURN;
END v_operaties;
END okps_preop_tst;
/

 

Usage

select * from TABLE(okps_preop_tst.v_operaties(‘XGY’,sysdate)

Categories: PL/SQL