Come dichiarare cursore di parametro ref a un metodo oggetto?
-
13-09-2019 - |
Domanda
Sono un po 'nuova per PL / SQL e bisogno di qualcosa che sembra un po' come questo:
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 );
In sostanza, ho bisogno di una singola routine generica che sa come eseguire un'azione tavolo indipendente delegare attività specifiche per ogni tabella per una classe derivata.
I metodi dell'oggetto di cui sopra che si 'ref cursore di non compilare - compilatore dice 'il cursore deve essere definito'. Così, naturalmente, ho provato 'tipo generic_cursor come cursore ref' in tutto il luogo, ma non riesco a farlo per compilare.
Ho trovato praticamente non quando si cerca di rintracciare la sintassi per il passaggio di cursori ref di opporsi metodi. E questo mi ha fatto pensare che forse sto cercando di fare qualcosa di stupido.
fa quello che sto cercando di fare avere un senso? Se è così, cosa mi manca? Dove posso definire il generic_cursor modo che io possa usarlo come un tipo di parametro del metodo oggetto?
Soluzione
Il tuo codice funziona una volta a risolvere gli errori sintattici.
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>
La documentazione Oracle è piuttosto difficile da capire quando sei nuovo. Credo che nel tuo caso è necessario sapere che la Object_Oriented roba si trova in un libro diverso dal regolare PL / SQL informazioni . Si avrà probabilmente bisogno di controllare sia ogni volta che siete perplessi.