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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top