Frage

Ich bin ein wenig neu zu PL / SQL und brauchen etwas, das ein bisschen wie folgt aussieht:

create type base as object (
  unused number,
  member procedure p( c in ref cursor )
) not final;

create type child1 under base (
  overriding member procedure p( c in ref cursor ) as
    t table1%rowtype
  begin
    fetch c into t;
    -- process table1 row
  end;
);

create type child2 under base (
  overriding member procedure p( c in ref cursor ) as
    t table2%rowtype
  begin
    fetch c into t;
    -- process table2 row
  end;
);

procedure generic_handler( o in base, c in ref cursor ) as
begin
  o.p( c );
end;

o1 child1 := child1(0)
o2 child2 := child2(0)

c ref cursor
open c for select * from table1;
generic_handler( o1, c );

open c for select * from table2;
generic_handler( o2, c );

Im Grunde brauche ich eine einzelne generische Routine, die weiß, wie man eine Tabelle unabhängige Aktion Delegieren tabellenspezifische Aufgaben auf eine abgeleitete Klasse auszuführen.

Die oben genannten Objektmethoden unter ‚ref Cursors nicht kompilieren - Compiler sagt‚Cursor‘werden muss, definiert. So natürlich habe ich versucht, ‚Typen generic_cursor als ref Cursor‘ Ort überall kann es aber nicht zu kompilieren.

Ich fand ziemlich nichts , wenn Sie vorbei ref Cursor die Syntax aufzuspüren versucht, Methoden zu widersprechen. Und das machte ich denken, dass vielleicht ich versuche, etwas Dummes zu tun.

Ist, was ich versuche Sinn machen? Wenn ja, was bin ich dabei? Wo finde ich die generic_cursor definieren, so dass ich es als Objektmethode Parametertyp verwenden kann?

War es hilfreich?

Lösung

Ihr Code funktioniert, wenn Sie die syntaktische Fehler auszusortieren.

SQL> create or replace type base as object
  2  (  unused number
  3      ,  member procedure p( c in sys_refcursor )
  4  )
  5  not final;
  6  /

Type created.

SQL>
SQL> create or replace type child1 under base (
  2      overriding member procedure p( c in sys_refcursor )
  3  );
  4  /

Type created.

SQL> create or replace type body child1 as
  2      overriding member procedure p( c in sys_refcursor )
  3          as
  4              t dept%rowtype;
  5          begin
  6              loop
  7                  fetch c into t;
  8                  exit when c%notfound;
  9                  dbms_output.put_line('dname='||t.dname);
 10              end loop;
 11          end;
 12  end;
 13  /

Type body created.

SQL>
SQL> create or replace type child2 under base (
  2      overriding member procedure p( c in sys_refcursor )
  3   );
  4  /

Type created.

SQL> create or replace type body child2 as
  2      overriding member procedure p( c in sys_refcursor )
  3          as
  4              t emp%rowtype;
  5          begin
  6              loop
  7                  fetch c into t;
  8                  exit when c%notfound;
  9                  dbms_output.put_line('ename='||t.ename);
 10              end loop;
 11          end;
 12  end;
 13  /

Type body created.

SQL>
SQL>
SQL> create or replace procedure generic_handler
  2          ( o in out base, c in sys_refcursor )
  3          as
  4  begin
  5      o.p( c );
  6  end;
  7  /

Procedure created.

SQL>
SQL> set serveroutput on size unlimited
SQL>
SQL> declare
  2      o1 child1 := child1(0);
  3      o2 child2 := child2(0);
  4      rc sys_refcursor;
  5  begin
  6      open rc for select * from dept where deptno = 10;
  7      o1.p(rc);
  8      open rc for select * from emp where deptno = 10;
  9      o2.p(rc);
 10  end;
 11  /
dname=ACCOUNTING
ename=BOEHMER
ename=SCHNEIDER
ename=KISHORE

PL/SQL procedure successfully completed.

SQL>

Die Oracle-Dokumentation ist ziemlich schwer zu verstehen, wenn Sie neu sind. Ich denke, in Ihrem Fall, dass Sie wissen müssen, dass die Zeug Object_Oriented ist in einem anderen Buch aus dem regelmäßige PL / SQL-Informationen . Sie werden wahrscheinlich müssen beide überprüfen, wann immer Sie ratlos sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top