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

有什么建议么 ?谢谢

4

1 回答 1

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;

了解更多

于 2013-04-22T06:16:05.057 回答