2009-08-11 14 views
1

Je suis un peu nouveau pour PL/SQL et besoin de quelque chose qui ressemble un peu à ceci:Comment déclarer le paramètre du curseur de référence à une méthode d'objet?

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

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

Les méthodes d'objet ci-dessus prenant 'ref cursor' ne compilent pas - le compilateur dit 'le curseur doit être défini'. Donc, bien sûr, j'ai essayé 'type generic_cursor comme ref cursor' partout mais je ne peux pas le compiler.

J'ai trouvé à peu près rien lorsque vous essayez de suivre la syntaxe pour passer des curseurs ref à des méthodes objet. Et cela m'a fait penser que j'essayais peut-être de faire quelque chose de stupide.

Est-ce que ce que j'essaie de faire est sensé? Si oui, qu'est-ce qui me manque? Où puis-je définir generic_cursor pour pouvoir l'utiliser comme type de paramètre de méthode d'objet?

Répondre

4

Votre code fonctionnera une fois que vous aurez trié les erreurs syntaxiques.

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 lorsque vous êtes nouveau. Je pense que dans votre cas, vous devez savoir que le Object_Oriented stuff est dans un livre différent du regular PL/SQL information. Vous devrez probablement vérifier les deux toutes les fois que vous êtes perplexe.

+0

Ce sys_refcursor l'a fait, merci! Je vois maintenant dans le chapitre 11 (!) Ils expliquent que vous pouvez l'utiliser au lieu de devoir d'abord créer un type de curseur ref. J'ai toujours l'impression d'abuser du langage pour le faire ressembler à n'importe quel autre langage OO et de ne pas écrire du code ... A bientôt. :) Merci encore pour votre aide. –