如何将复杂的光标记录传递给过程?

时间:2013-04-22 05:32:53

标签: oracle plsql

假设我已声明了这样的游标

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个表中获取的。那么如何为这种情况声明参数呢?可能吗?

有什么建议吗?谢谢

1 个答案:

答案 0 :(得分: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;

我不建议将其作为CURSOR 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