PL / SQL中参数化游标的意义是什么?

问题描述 投票:0回答:2

有人可以解释在PL / SQL中使用参数化游标而不是仅仅创建一个变量并在内部使用该变量有什么意义?

以下匿名块显示了我的意思:

DECLARE
    num NUMBER := 1;
    CURSOR d1 (p_num IN NUMBER) IS SELECT 'foo' FROM dual WHERE 1 = p_num;
    CURSOR d2 IS SELECT 'foo' FROM dual WHERE 1 = num;
BEGIN
    NULL;
END;

游标d1和d2之间在处理/性能/等方面有什么区别吗?

提前感谢。

sql oracle plsql cursor
2个回答
0
投票

您可能直到运行时才知道p_num的值。可能是您从其他处理,另一个表,客户端环境或以某种方式计算得出的结果。

作为一个简单的例子:

declare
  cursor c1 is
    select * from departments;
  cursor c2 (p_department_id employees.department_id%type) is
    select * from employees
    where department_id = p_department_id;
begin
  for r1 in c1 loop
    -- do something with this department info
    dbms_output.put_line(r1.department_name);

    -- now loop through empoyees in that department
    for r2 in c2 (r1.department_id) loop
      -- do something with this employee info
      dbms_output.put_line('  ' || r2.first_name);
    end loop;
  end loop;
end;
/

Administration
  Jennifer
Marketing
  Michael
  Pat
Purchasing
  Den
  Alexander
...

c2光标正在单个部门中寻找员工,但是不能进行硬编码。

显然,您不会真正使用嵌套循环或任何PL / SQL来完成此特定任务;并且在很多地方都使用了这种构造,这同样适用,或者查询至少可以通过联接组合成单个游标。

对于更复杂的逻辑,例如代码可以在多个路径中使用,并且可以使用多个可选的辅助游标,并且所有游标都需要来自同一(昂贵)基本查询的信息,并且您不想重复连接到基本表。

[与大多数逐行处理一样,我怀疑滥用的次数比真正必要的更多。尽管它仍然是有用的工具。


-2
投票

我也面临着同样的问题。我尝试differently解决但无法解决。

© www.soinside.com 2019 - 2024. All rights reserved.