Question

Je suis un peu nouveau pour PL / SQL et besoin de quelque chose qui ressemble un peu à ceci:

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

En fait, j'ai besoin d'une seule routine générique qui sait comment effectuer une action de table indépendante déléguer des tâches spécifiques à la table à une classe dérivée.

Les méthodes d'objet ci-dessus en prenant « curseur de référence de ne compile pas - compilateur dit« curseur doit être défini. Alors bien sûr, je l'ai essayé « type generic_cursor comme curseur de référence » dans tous les sens mais ne peut pas le compiler.

J'ai trouvé assez bien rien en essayant de traquer la syntaxe pour faire passer les curseurs ref pour objet des méthodes. Et cela me fait penser que peut-être que je suis en train de faire quelque chose de stupide.

Est-ce que ce que je suis en train de faire du sens? Si oui, qu'est-ce que je manque? Où puis-je définir le generic_cursor pour que je puisse l'utiliser comme un type de paramètre de méthode objet?

Était-ce utile?

La solution

Votre code fonctionnera une fois que vous triez les erreurs de syntaxe.

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 documentation Oracle est assez difficile à comprendre quand vous êtes nouveau. Je pense que dans votre cas, vous devez savoir que le titre trucs Object_Oriented est dans un livre différent de informations PL / SQL régulière . Vous aurez probablement besoin de vérifier à la fois quand vous êtes perplexe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top