2013-04-22 47 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