有条件地创建游标?

Posted

技术标签:

【中文标题】有条件地创建游标?【英文标题】:Creating cursor conditionally? 【发布时间】:2014-12-27 08:58:27 【问题描述】:

我想根据传递给函数的员工 ID 数组来限制游标结果集,否则如果数组 iks null 我想要所有记录。

这是我尝试过的东西

首先创建数组类型

    create or replace type p_emp_arr as table of number   

功能是

    create or replace
    FUNCTION getEmployee_func ( empID IN Number, empId_arr IN p_emp_arr)
    RETURN number IS
       total number(2) := 0;

      BEGIN 

      IF(empId_arr is null)
       THEN
        CURSOR empCursor IS
          SELECT * FROM Employee ;
       ELSE
        CURSOR empCursor IS
          SELECT * FROM Employee where empId in (p_emp_arr);
      END IF;

        ....
        RETURN total;
     END;

但是遇到错误

   Error(12,12): PLS-00103: Encountered the symbol "empCursor" when expecting one of the following:     := . ( @ % ; 

【问题讨论】:

您应该在 PLSQL 块的声明部分声明 Explicit Cursor 【参考方案1】:

你可以使用REFCURSOR;

语法是这样的,

OPEN EMP_CURSOR FOR
  'SELECT * FROM Employee
       where empId in SELECT COLUMN_VALUE FROM TABLE(:empId_arr)'
   USING empId_arr ;

包含FETCH的完整块:

create or replace
FUNCTION getEmployee_func ( empID IN Number, empId_arr IN p_emp_arr)
RETURN number IS
  total number(2) := 0;
  MYREC Employee%ROWTYPE;

  EMP_CURSOR SYS_REFCURSOR;
  BEGIN 

  IF(empId_arr is null)
   THEN
    OPEN EMP_CURSOR FOR
      'SELECT * FROM Employee' ;
   ELSE
    OPEN EMP_CURSOR FOR
      'SELECT * FROM Employee
          where empId in SELECT COLUMN_VALUE FROM TABLE(:empId_arr)'
      USING empId_arr ;
  END IF;

  LOOP
     FETCH EMP_CURSOR INTO MYREC;
     EXIT WHEN EMP_CURSOR%NOTFOUND;
     .....
  END;
    ....
  RETURN total;
 END;

【讨论】:

以上是关于有条件地创建游标?的主要内容,如果未能解决你的问题,请参考以下文章

为啥查询sqlite数据库时需要创建游标?

AWS Cloudformation:有条件地创建资源的属性

有条件地创建熊猫列的最快方法

使用python检查数据库连接是不是繁忙

21 使用游标

使用游标 PLSQL 的性能