【问题标题】:Reference Cursor If Then Use Cursor in Loop参考光标 If Then 在循环中使用光标
【发布时间】:2017-09-22 15:06:00
【问题描述】:

我试图使用这样的东西:

 DECLARE type cur1 REF CURSOR;
 c1 cur1;

  BEGIN 
   IF (variable1 = 'true') THEN 
     OPEN c1 FOR 'SELECT * FROM STUDENT'; 
   ELSE 
     OPEN c1 FOR 'SELECT * FORM EMP';
 END IF ; 
  END; 

我从PL/SQL cursor with IF condition得到的

但是,我需要遍历光标才能使用数据。所以我想弄清楚如何做以下事情。

DECLARE type cur1 REF CURSOR;
 c1 cur1;

  BEGIN 
   IF (variable1 = 'true') THEN 
     OPEN c1 FOR 'SELECT * FROM STUDENT'; 
   ELSE 
     OPEN c1 FOR 'SELECT * FORM EMP';
 END IF ;
    for award_rec in c1 loop ....
  END; 

但我收到以下错误

PLS-00221:“c1”不是过程或未定义

我应该如何构建它?

【问题讨论】:

  • 可能不相关,但是:比较运算符是=,所以应该是if variable = 'true':= 用于分配而不是用于比较
  • a_horse_with_no_name 你对 = 是正确的,我忘了在问题中改变它。谢谢!

标签: sql oracle plsql


【解决方案1】:

您不能将 for 循环与 REF CURSOR 一起使用。而是在带有EXIT WHEN 条件的循环中获取它。由于每个条件要选择的表(以及列)都不同,因此您必须在两个条件中都包含循环。

您可以使用BULK COLLECT INTO 子句将记录提取到相应表记录的集合中。

SET SERVEROUTPUT ON;
DECLARE
TYPE cur1
IS
  REF
  CURSOR;
    c1 cur1;
    variable1 VARCHAR2(10) := 'true';
  TYPE emprec_t
IS
  TABLE OF emp%ROWTYPE;
TYPE student_t
IS
  TABLE OF student%ROWTYPE;
  emp_rec emprec_t;
  stu_rec student_t;
BEGIN
  IF (variable1 = 'true') THEN
    OPEN c1 FOR 'SELECT * FROM STUDENT';
    FETCH c1 BULK COLLECT INTO stu_rec;
  FOR i IN stu_rec.FIRST..stu_rec.LAST
  LOOP
    DBMS_OUTPUT.PUT_LINE(stu_rec(i).STUDENT_ID);
  END LOOP;
ELSE
  OPEN c1 FOR 'SELECT * FROM  EMP';
  FETCH c1 BULK COLLECT INTO emp_rec;
  FOR i IN emp_rec.FIRST..emp_rec.LAST
  LOOP
    DBMS_OUTPUT.PUT_LINE(emp_rec(i).EMPLOYEE_ID);
  END LOOP;
END IF ;
END;
/

编辑:您可以遍历集合并从特定索引中获取列,如图所示。

【讨论】:

  • 感谢考希克·纳亚克!但是,当我尝试遍历 emp_rec 时出现错误... for Award_rec in emp_rec loop EXIT when ng_rec%NOTFOUND;我知道 emp_rec 不是游标。
  • 搞错了。当我尝试访问游标 emp_rec.field 时出现错误,它给了我必须声明它们的错误。
  • 我已经修改了代码。现在检查。您需要使用循环访问 emp_rec 集合并获取各个列。
  • 谢谢!我决定以另一种方式处理我的问题,因此我不需要光标中的 if。
  • 好的!!。至少您可以投票赞成答案,因为它回答了问题:)-
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多