假设我已声明了这样的游标
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 :(得分: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;