Weitere Beispiele zu Cursor Expressions

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;
/

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert