【问题标题】:How do I fetch values from a DBMS_SQL cursor derived from a SYS_REFCURSOR?如何从派生自 SYS_REFCURSOR 的 DBMS_SQL 游标中获取值?
【发布时间】:2014-10-08 02:36:34
【问题描述】:

我正在尝试从 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

【问题讨论】:

    标签: oracle oracle11g


    【解决方案1】:

    您还没有完成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
    

    【讨论】:

    • 多么误导的流程图!我认为没有必要 - 转换后的游标跳过了 EXECUTE 步骤,所以我在跳过它之前假设了所有内容。
    • @Malnormalulo - 我不确定你是否总是可以在定义之前执行;但即使可以,它们也可能按此顺序显示,以避免execute_and_fetch 引起的并发症。但是,是的,在这种情况下有点令人困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    相关资源
    最近更新 更多