PLSQL:在运行时编辑游标

时间:2014-01-22 16:15:54

标签: plsql cursor

我有点困惑

是否可以在函数/ proc中使用这样的东西?

CURSOR CR IS
SELECT
FROM
WHERE Y = X

以及稍后在正文中,将X值更改为Z或其他内容,然后重新打开游标,使其获取Y = Z的行?

3 个答案:

答案 0 :(得分:2)

是的,请尝试这样的事情(快速输入以便语法可能不准确)

sql   VARCHAR2(255);
cur   REF CURSOR;
val   varchar2(100);

val := X;
sql :=  'SELECT .. FROM .. WHERE Y = :val';

open cur for
    sql
    USING val;

close cur;
....

val := Z;

open cur for
    sql
    USING val;

答案 1 :(得分:2)

有几种方法可以在不使用动态SQL的情况下执行此操作。一种选择是使用参数化游标:

DECLARE
  nSome_value  NUMBER := 666;

  CURSOR CR(parmSome_value NUMBER) IS
    SELECT *
      FROM SOME_TABLE
      WHERE SOME_COLUMN = parmSome_value;
BEGIN
  nSome_value := 123; -- change value of nSome_value

  OPEN CR(nSome_value);  -- pass nSome_value in as the value of the cursor parameter

  -- Fetch from the cursor, do whatever

  CLOSE CR;
END;

它仍然是静态SQL,但通过将参数传递给游标,可以提高游标的可重用性。

另一种选择是使用游标FOR循环,引用循环SQL中的变量:

DECLARE
  nSome_value  NUMBER := 666;
BEGIN
  nSome_value := 123; -- change value of nSome_value

  FOR aRow IN (SELECT *
                 FROM SOME_TABLE
                 WHERE SOME_COLUMN = nSome_value)
  BEGIN
    -- Do something useful with the rows returned by the cursor
  END LOOP;
END;

请注意,在这些情况下,您不会更改SQL - 您只是更改查询中使用的变量或参数的值。这些方法的一个优点是,与动态生成的SQL不同,它们不容易受到SQL注入攻击。

分享并享受。

答案 2 :(得分:0)

这也可以通过使用像函数这样的子程序来完成,而不是使用光标

将缩短代码:

创建或替换函数getashish(dept varchar2)将emp3返回为

emp5 emp3:= emp3();

str varchar2(300);

开始

str:='从员工e加入部门中选择emp1(e.last_name,l.city,e.salary)d

on e.department_id = d.department_id连接位置l在d.location_id = l.location_id其中

d.department_name =:dept';

执行立即str 批量收集到emp5 使用dept;

返回emp5; 端;

在这里你必须创建一个对象,包括yoy想要的返回类型,然后创建该对象的表格:

创建或替换类型emp1作为对象(lname varchar2(10),city varchar2(10),sal number(10));

创建或替换 输入emp3作为emp1表;