Cursor Expressions sind so übel nicht!
Sie erlauben äußerst dynamische Konstrukte, die selbst mit analytischen Funktionen nicht so einfach realisierbar sind:
Beispiel:
Hier nutze ich eine Funktion is_related_to, der ich die Bedindung, sprich das SELECT, das bestimmte Mitarbeiter ermitteln soll, beim Aufruf übergeben kann. Die Funktion sorgt für eine Aneinanderreihung der Werte als kommaseparierte Liste.
Das mächtige an der Funktion ist, dass mir die kommaseparierte Liste komplett dynamisch anhand meines Select-Statements zusammengebaut wird.
SQL> col related format a60 SQL> -- Wer sind die Mitarbeiter, die in der gleichen Abteilung arbeiten wie Scott SQL> select ename, is_related_to (cursor(select ename from emp where deptno=x.deptno)) related from emp x where ename = 'SCOTT'; ENAME RELATED ---------- ------------------------------------------------------------ SCOTT SMITH,JONES,SCOTT,ADAMS,FORD SQL> -- Wer sind die Mitarbeiter, die den gleichen Beruf haben wie Scott SQL> select ename, is_related_to (cursor(select ename from emp where job=x.job)) related from emp x where ename = 'SCOTT'; ENAME RELATED ---------- ------------------------------------------------------------ SCOTT SCOTT,FORD SQL> -- Wer sind die Mitarbeiter, die das gleiche Gehalt haben wie Scott SQL> select ename, is_related_to (cursor(select ename from emp where sal=x.sal)) related from emp x where ename = 'SCOTT'; ENAME RELATED ---------- ------------------------------------------------------------ SCOTT SCOTT,FORD SQL> -- Wer sind die Mitarbeiter, die den gleichen Vorgesetzten haben SQL> select ename, is_related_to (cursor(select ename from emp where mgr=x.mgr)) related from emp x where ename = 'SCOTT'; ENAME RELATED ---------- ------------------------------------------------------------ SCOTT SCOTT,FORD SQL> -- Wer sind die Mitarbeiter, die weniger verdienen als Scott SQL> select ename, is_related_to (cursor(select ename from emp where sal<x.sal)) related from emp x where ename = 'SCOTT'; ENAME RELATED ---------- ------------------------------------------------------------ SCOTT SMITH,ALLEN,WARD,JONES,MARTIN,BLAKE,CLARK,TURNER,ADAMS,JAMES,MILLER
Um so etwas zu realisieren, könnte man folgende Implementierung mit Hilfe von Cursor Expression nutzen:
create or replace function is_related_to ( mycur sys_refcursor) return varchar2 is dummy varchar2(20); erg_String varchar2(200); begin loop fetch mycur into dummy; exit when mycur%notfound; erg_string := erg_string||dummy||','; end loop; return (substr(erg_string,1,length(erg_string)-1)); end; /