sql - 引用匿名 block 中的游标

标签 sql oracle cursor

如果返回多个值,如何引用游标的特定值?

DECLARE
  X INTEGER;
  CURSOR c1 IS SELECT col1, col2, col3.....;
BEGIN
  OPEN c1;
  LOOP
    EXIT WHEN c1%NOTFOUND;
    FETCH (col2 from c1) INTO X;
  END LOOP;
END;

最佳答案

你为什么要?据推测,如果您在游标声明中选择三列,则代码中需要所有三列,因此您需要将所有三列提取到三个单独的局部变量中,即

DECLARE
  x      integer;
  y      integer;
  z      integer;
  CURSOR c1
      IS SELECT column1, column2, column3
           FROM some_table;
BEGIN
  OPEN c1;
  LOOP
    FETCH c1 
     INTO x, y, z;
    EXIT WHEN c1%NOTFOUND;
  END LOOP;
  CLOSE c1;
END;

或者,您可以根据游标声明声明一个记录类型并获取到该类型
DECLARE
  CURSOR c1
      IS SELECT column1, column2, column3
           FROM some_table;
  c1_rec c1%ROWTYPE;
BEGIN
  OPEN c1;
  LOOP
    FETCH c1 
     INTO c1_rec;
    dbms_output.put_line( c1_rec.column2 );
    EXIT WHEN c1%NOTFOUND;
  END LOOP;
  CLOSE c1;
END;

您还可以完全摆脱显式循环,这通常是首选方法,因为您不必担心游标泄漏,并且(在现代版本中)Oracle 可以自动为您进行批量收集
DECLARE
  CURSOR c1
      IS SELECT column1, column2, column3
           FROM some_table;
BEGIN
  FOR c1_rec IN c1
  LOOP
    dbms_output.put_line( c1_rec.column2 );
  END LOOP;
END;

关于sql - 引用匿名 block 中的游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9437613/

相关文章:

c# - 强制 WaitCursor 到模态窗体的父窗体

android - 使用 Activity 实例保存游标状态?

sql - 使用游标和变量更新表

sql - 是否有 SQL 关键字表示 "Don' t Change”?

sql - Oracle 和 Teradata 之间的日期差异

java - 违反完整性约束 - 在级联上找不到父 key

MYSQL 案例

mysql - 即使一行为 NULL 也获取数据

c# - 使用 Simple.Data 更新列表

Mysql 选择昨天的值