oracle - 如何从 SYS_REFCURSOR 派生的 DBMS_SQL 游标中获取值?

标签 oracle oracle11g

我试图从 DBMS_SQL.TO_CURSOR_NUMBER 迭代游标编号,但遇到了问题 - 当我尝试将值拉入变量时,出现 ORA-01007(变量不在选择列表中)。

这是一个复制我的问题的代码块:

DECLARE
  cur SYS_REFCURSOR;
  nm INTEGER;
  colDescs DBMS_SQL.DESC_TAB2;
  numCols INTEGER;
  val VARCHAR2(3);
BEGIN
  OPEN cur FOR
    SELECT 'x' AS foo, 2 AS bar
    FROM dual;
  nm := DBMS_SQL.TO_CURSOR_NUMBER(cur);
  DBMS_SQL.DESCRIBE_COLUMNS2(nm, numCols, colDescs);

  DBMS_OUTPUT.PUT_LINE(numCols);

  DBMS_OUTPUT.PUT_LINE(DBMS_SQL.FETCH_ROWS(nm));

  DBMS_SQL.column_value(nm, 1, val);
  DBMS_OUTPUT.PUT_LINE(val);

  DBMS_SQL.CLOSE_CURSOR(nm);
EXCEPTION
  WHEN OTHERS THEN
    DBMS_SQL.CLOSE_CURSOR(nm);
    DBMS_OUTPUT.PUT_LINE('borked '||SQLCODE);
END;
/

预期输出:

2
1
x

实际输出:

2
1
borked -1007

最佳答案

您还没有完成DEFINE_COLUMN脚步); before you fetch :

  DBMS_SQL.DEFINE_COLUMN(nm, 1, val, 3);

所以这有效:

DECLARE
  cur SYS_REFCURSOR;
  nm INTEGER;
  colDescs DBMS_SQL.DESC_TAB2;
  numCols INTEGER;
  val VARCHAR2(3);
BEGIN
  OPEN cur FOR
    SELECT 'x' AS foo, 2 AS bar
    FROM dual;
  nm := DBMS_SQL.TO_CURSOR_NUMBER(cur);
  DBMS_SQL.DESCRIBE_COLUMNS2(nm, numCols, colDescs);

  DBMS_OUTPUT.PUT_LINE(numCols);

  DBMS_SQL.DEFINE_COLUMN(nm, 1, val, 3);

  DBMS_OUTPUT.PUT_LINE(DBMS_SQL.FETCH_ROWS(nm));

  DBMS_SQL.column_value(nm, 1, val);
  DBMS_OUTPUT.PUT_LINE(val);

  DBMS_SQL.CLOSE_CURSOR(nm);
EXCEPTION
  WHEN OTHERS THEN
    DBMS_SQL.CLOSE_CURSOR(nm);
    DBMS_OUTPUT.PUT_LINE('borked '||SQLERRM);
    DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
END;
/

anonymous block completed
2
1
x

关于oracle - 如何从 SYS_REFCURSOR 派生的 DBMS_SQL 游标中获取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26242308/

相关文章:

python - Flask-sqlalchemy 和 oracle 数据库 id 不是 auto_increment

database - 如何在 oracle 11g 快捷版中创建数据库?

c++ - 会终止 Linux 进程,停止它在 Oracle 数据库中的查询作业吗?

oracle - 如何禁用 oracle 窗体中的 F8

oracle - PL/SQL Developer (allroundautomations.com) 在编译包主体时挂起

oracle - 来自 dbms_metadata.get_ddl 的自定义表 DDL

sql - 子查询 - 获得最高分

oracle - 将 CLOB 对象作为字符串值读入 R

java - 尝试使用 Maven 导入 o​​racle jdbc7 驱动程序时出错

Oracle 11GR2 TKPROF - 如何捕获递归调用树