Как объявить параметр курсора ref для метода объекта? - PullRequest
1 голос
/ 12 августа 2009

Я немного новичок в PL / SQL и мне нужно что-то вроде этого:

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

По сути, мне нужна одна общая процедура, которая знает, как выполнять независимое от таблицы действие, делегируя специфичные для таблицы задачи производному классу.

Вышеуказанные методы объекта, принимающие 'ref курсора, не компилируются - компилятор говорит, что' курсор должен быть определен '. Поэтому, конечно, я попытался повсеместно использовать «тип generic_cursor в качестве курсора ссылки», но не смог его скомпилировать.

Я обнаружил ничего , когда пытался отследить синтаксис для передачи ref-курсоров в объектные методы. И это заставило меня подумать, что, возможно, я пытаюсь сделать что-то глупое.

Имеет ли смысл то, что я пытаюсь сделать? Если так, что я пропускаю? Где я могу определить generic_cursor, чтобы использовать его как тип параметра метода объекта?

1 Ответ

4 голосов
/ 12 августа 2009

Ваш код будет работать, как только вы разберетесь с синтаксическими ошибками.

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>

Документация Oracle довольно сложна для понимания, когда вы новичок. Я думаю, что в вашем случае вам нужно знать, что Object_Oriented материал находится в другой книге, чем обычная информация PL / SQL . Вам, вероятно, придется проверять оба, когда вы в тупике.

...