2009-08-11 7 views
1

Ich bin ein wenig neu zu PL/SQL und brauchen etwas, das ein bisschen wie folgt aussieht:Wie Ref Cursor-Parameter zu einer Objektmethode zu deklarieren?

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

Grundsätzlich, ich brauche eine einzelne generische Routine, die weiß, wie man eine Tabelle unabhängige Aktion Delegieren Tabelle auszuführen -spezifische Aufgaben für eine abgeleitete Klasse.

Die oben genannten Objektmethoden, die 'ref cursors' nicht kompilieren - Compiler sagt 'Cursor muss definiert werden'. Also habe ich natürlich versucht 'generic_cursor als ref cursor' überall zu tippen, aber es kann nicht kompiliert werden.

Ich fand ziemlich nichts bei dem Versuch, die Syntax für die Übergabe ref cursors an Objektmethoden zu finden. Und das ließ mich denken, dass ich vielleicht etwas Dummes versuchen würde.

Macht das, was ich versuche, Sinn? Wenn ja, was fehlt mir? Wo kann ich den generic_cursor definieren, damit ich ihn als Objektmethode verwenden kann?

Antwort

4

Ihr Code wird funktionieren, sobald Sie die syntaktischen Fehler aussortieren.

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 müssen Sie wissen, dass die Object_Oriented stuff in einem anderen Buch als die regular PL/SQL information ist. Sie müssen wahrscheinlich beide überprüfen, wenn Sie ratlos sind.

+0

Das sys_refcursor hat es geschafft, danke! Ich sehe jetzt in Kapitel 11 (!), Dass Sie es verwenden können, anstatt zuerst einen Ref-Cursortyp zu erstellen. Ich habe immer noch den Eindruck, dass ich die Sprache missbrauche, damit sie mehr wie jede andere OO-Sprache aussieht und mir beim Schreiben von Code hilft ... Finde es bald heraus. :) Nochmals vielen Dank für Ihre Hilfe. –

Verwandte Themen