2013-04-22 69 views
0

讓說我已經聲明如下如何將複雜的光標記錄傳遞給過程?

CURSOR cur_customer IS 
    SELECT c.customer_id, c.name, o.order_date 
    FROM customer c, order o 
    WHERE c.customer_id = o.customer_id 

BEGIN 
    FOR rec_customer IN cur_Customer LOOP 
     -- invoke procedure here with rec_customer as a parameter 
    END LOOP; 
END; 

對於光標所在的只有一個表中取出的情況下,光標,這個參數可以聲明如下

rec_customer customer%ROWTYPE 

但在這種情況下,光標從2個表中獲取。那麼如何爲這種情況聲明參數?它可能嗎?

有什麼建議嗎?謝謝

+0

你真的是指「參數」嗎?或者只是「可變」?您的標題問題與正文中的示例不匹配。 – APC 2013-04-22 06:18:21

回答

2

如果這一切都在PL/SQL程序中完成,則不需要聲明任何內容。使用隱式遊標並讓PL/SQL數字出來:

declare 
    tot_sal number(23,2) := 0; 
begin 
    for r in (select dept.dept_no 
         , emp.sal 
       from dept 
        join emp (on emp.deptno = dept,deptno)) 
    loop 
     tot_sql := tot_sql + r.sql; 
    end loop; 
end; 

我不建議這是一個良好的使用FOR循環遊標的,它只是爲需要多麼少的基礎設施,使事情的工作說明。

如果你想要更多的結構,你可以使用這樣的%ROWTYPE關鍵字只是參考光標:

CURSOR cur_customer IS 
    SELECT c.customer_id, c.name, o.order_date 
    FROM customer c, order o 
    WHERE c.customer_id = o.customer_id; 

rec_customer cur_customer%ROWTYPE; 

也就是說,你可以用你的光標來定義記錄變量,就像你可以使用一個表。

如果要定義可在程序單元(特別是程序包)之間共享的結構,請聲明RECORD類型。類似這樣的:

TYPE emp_rec IS RE(ORD 
    (emp_dept_name dept.dname%type 
     , emp_name emp.ename%type 
     , emp_sal emp.sql%type); 

你可以用它來定義各種東西,例如,程序單元參數,無論您使用%ROWTYPE。將這些聲明放在包規範中,以便在多個包中共享它們。

FUNCTION get_emp (p_id emp.empno%type) return emp_rec%rowtype; 

Find out more