2014-10-07 28 views
2

我想從DBMS_SQL.TO_CURSOR_NUMBER迭代遊標編號,並在我嘗試將值拉入變量時遇到問題–,我得到ORA-01007(變量不在選擇列表中)。如何從一個從SYS_REFCURSOR派生的DBMS_SQL遊標中獲取值?

這裏有一個代碼塊重複我的問題:

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 

回答

3

你沒有做過DEFINE_COLUMN步(S ); 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 
+0

什麼是誤導性的流程圖!我不認爲這是必要的 - 執行步驟被跳過轉換光標,所以我假設所有東西之前,它也被跳過。 – Malnormalulo 2014-10-07 20:17:35

+0

@Malnormalulo - 我不知道你是否可以在define之前執行execute操作;但即使可以,也可以按順序顯示,以避免'execute_and_fetch'的複雜性。但是,在這方面有點混淆。 – 2014-10-07 20:22:06

相關問題