Wie ref Cursor-Parameter auf eine Objektmethode erklären?
-
13-09-2019 - |
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?
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.