CURSOR Expressions

CURSOR Expressions

A CURSOR expression returns a nested cursor. This form of expression is equivalent to the PL/SQL REF CURSOR and can be passed as a REF CURSOR argument to a function.
CRUSOR表达式返回一个嵌套的CUROS。这种格式的表达式相当于PL/SQL中的REF CURSOR,并且可以作为 一个REF CURSOR类型的参数传给函数。



A nested cursor is implicitly opened when the cursor expression is evaluated. For example, if the cursor expression appears in a select list, a nested cursor will be opened for each row fetched by the query. The nested cursor is closed only when:
当对cursor表达式求值时,嵌套cursor会被隐式的打开。比如,cursor表达式出现在select语句中,查询语句获取的每一行数据都会打开一个嵌套的cursor。嵌套cursor在以下情况下会被关闭:  

  • The nested cursor is explicitly closed by the user
    嵌套cursor被用户显示的关闭

  • The parent cursor is reexecuted
    父cursor被重新执行

  • The parent cursor is closed
    父cursor被关闭

  • The parent cursor is cancelled
    父cursor被取消

  • An error arises during fetch on one of its parent cursors (it is closed as part of the clean-up)
    获取父cursor时出错(嵌套cursor被闭是清理的一部分)

Restrictions on CURSOR Expressions 
Cursor表达式的限制
The following restrictions apply to CURSOR expressions:
Cursor表达式有以下限制:

  • If the enclosing statement is not a SELECT statement, then nested cursors can appear only as REF CURSOR arguments of a procedure.
    如果外层语句不是select语句,嵌套cursor只能作为存储过程的REF CURSOR类型的参数被使用(以处应该也包含function)。

  • If the enclosing statement is a SELECT statement, then nested cursors can also appear in the outermost select list of the query specification or in the outermost select list of another nested cursor.
    如果外层语句是select语句,嵌套cursor可以出现在查询语句的最外层,或是另一个嵌套cursor中的查询语句的最外层。  

  • Nested cursors cannot appear in views.
    嵌套cursor不能出现在视图中。

  • You cannot perform BIND and EXECUTE operations on nested cursors.
    不能在在嵌套cursor上执行BIND和EXECUTE。

Examples The following example shows the use of a CURSOR expression in the select list of a query:
以下事例演示了cursor表达式在select语句的用法:

SELECT department_name, CURSOR(SELECT salary, commission_pct 
   FROM employees e
   WHERE e.department_id = d.department_id)
   FROM departments d
   ORDER BY department_name;

The next example shows the use of a CURSOR expression as a function argument. The example begins by creating a function in the sample OE schema that can accept theREF CURSOR argument. (The PL/SQL function body is shown in italics.)
接下来的事例演示了cursor作为函数参数的用法。此事例以在OE用户下创建一个可以接收REF CURSOR类型参数的函数开始(PL/SQL函数体以斜体展示)

CREATE FUNCTION f(cur SYS_REFCURSOR, mgr_hiredate DATE) 
   RETURN NUMBER IS
   emp_hiredate DATE;
   before number :=0;
   after number:=0;
begin
  loop
    fetch cur into emp_hiredate;
    exit when cur%NOTFOUND;
    if emp_hiredate > mgr_hiredate then
      after:=after+1;
    else
      before:=before+1;
    end if;
  end loop;
  close cur;
  if before > after then
    return 1;
  else
    return 0;
  end if;
end;
/

The function accepts a cursor and a date. The function expects the cursor to be a query returning a set of dates. The following query uses the function to find those managers in the sample employees table, most of whose employees were hired before the manager.
此函数有两个参数,一个cursor类型,一个日期类型。函数要求cursor返回一组日期。以下的查询使用上面的函数在employees表中查找大部分下属入取时间比自己早的经理的名字。

SELECT e1.last_name FROM employees e1
   WHERE f(
   CURSOR(SELECT e2.hire_date FROM employees e2
   WHERE e1.employee_id = e2.manager_id),
   e1.hire_date) = 1
   ORDER BY last_name;
 
LAST_NAME
-------------------------
Cambrault
Higgins
Hunold
Kochhar
Mourgos
Zlotkey
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值