oracle 如何将复杂的游标记录传递到过程中?

i1icjdpr  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(112)

假设我声明了一个游标,如下所示

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个表中提取的。那么,如何声明这种情况下的参数呢?有可能吗?
有什么建议吗?谢啦,谢啦

sqxo8psd

sqxo8psd1#

如果这些都是在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_sal := tot_sal + r.sal;
     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;


了解更多

相关问题