2009-08-11 31 views
1

我是新來的PL/SQL一點點,需要的東西,看起來有點像這樣:如何將ref遊標參數聲明爲對象方法?

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 cursor'不編譯 - 編譯器說'需要定義遊標'。所以當然我嘗試過在所有地方都輸入'generic_cursor'作爲引用遊標',但是無法編譯它。

,我發現幾乎沒有試圖追查傳遞裁判光標對象方法的語法時。這讓我覺得,也許我試圖做一些愚蠢的事情。

我正在努力做什麼是有道理的?如果是這樣,我錯過了什麼?我在哪裏可以定義generic_cursor,以便我可以將它用作對象方法參數類型?

回答

4

您的代碼將在您理清語法錯誤後生效。

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 stuffregular PL/SQL information不同。你可能需要檢查,無論何時你難倒。

+0

sys_refcursor做到了,謝謝!我現在在第11章(!)中看到他們解釋說你可以使用它而不必先創建一個引用遊標類型。 我仍然覺得我有點濫用語言,使它看起來更像其他任何OO語言,並且爲了節省自己寫一些代碼...很快就找到了。 :) 再次感謝您的幫助。 – 2009-08-12 12:32:03

相關問題