2014-05-07 22 views
0

使用Oracle 10g DBMS,我想在過程中應用DBMS_SQL.execute_and_fetch。我拒絕EXECUTE IMMEDIATE,因爲我想綁定命名變量,並且不依賴於它們在語句中的順序。使用DBMS_SQL.Execute_and_fetch - 獲取Ref Cursor(10g)的遊標編號

問題是,我無法獲得傳遞到我的過程的參考遊標參數的遊標編號的句柄。這裏是我想要做的一個示例代碼片段。

PROCEDURE TestProc(vuserid INTEGER, 
        olist OUT refcur) 
IS 
    cursor_num INTEGER; 
    vsql  VARCHAR2(1000 CHAR); 
BEGIN 
    vsql := 'SELECT * FROM USERS WHERE USER_ID = :user_id'; 

    /*creates a new cursor. Need to use the cursor that is passed to my procedure*/ 
    /*cursor_num := dbms_sql.open_cursor; */ 

    /*Only available in 11g onwards  */ 
    /*cursor_num := dbms_sql.to_cursor_number(olist); */ 

    sys.dbms_sql.parse(cursor_num, vsql, sys.dbms_sql.native); 
    sys.dbms_sql.bind_variable(cursor_num, ':user_id', vuserid); 
    sys.dbms_sql.execute_and_fetch(cursor_num, FALSE); 
END TestProc; 

如何成功地使用DBMS_SQL.execute_and_fetch過程中我的具體情況,其中用於獲取光標裁判光標我通過?

+0

我假設'olist'必須是'IN'參數,不是嗎? –

+0

嗨Wernfried。不,它是寫出來的。我正在使用ODP.Net調用該過程,根據文檔它應該是OUT。見[這裏](http://docs.oracle.com/cd/B19306_01/win.102/b14307/featRefCursor.htm#i1008035) –

回答

0

我asssume您正在尋找這樣的:

PROCEDURE TestProc (
     vUserid INTEGER, 
     olist    OUT SYS_REFCURSOR) 
IS 
    cursor_num INTEGER; 
    vSQL VARCHAR2(1000 CHAR); 
    result NUMBER; 
BEGIN 
    vSQL := 'SELECT * FROM USERS WHERE USER_ID = :user_id'; 

    cursor_num := DBMS_SQL.OPEN_CURSOR; 
    DBMS_SQL.PARSE(cursor_num,vSQL,DBMS_SQL.NATIVE); 
    DBMS_SQL.BIND_VARIABLE(cursor_num, ':user_id', vUserid); 
    result := DBMS_SQL.EXECUTE(cursor_num); 
    olist := DBMS_SQL.TO_REFCURSOR(cursor_num); 

END TestProc; 

然後調用塊可以使用FETCH olist INTO...FETCH olist BULK COLLECT INTO...得到您的查詢的結果。

但是,在它不可用之前,您必須至少運行Oracle 11。

+0

謝謝Wernfried。但我沒有選擇。我正在使用10g,正如我在我的問題中所說的那樣。否則,我可以使用DBMS_SQL.TO_CURSOR_NUMBER(oList)來獲取遊標編號。我想要的是一種獲取10g光標數量的方法。謝謝。 –

+0

那麼光標號就是'cursor_num'的值。在'OPEN olist FOR SELECT ...',e.i.之後可以使用'TO_CURSOR_NUMBER(olist)'。 'cursor_num'等於'TO_CURSOR_NUMBER(olist)' –

+0

是的,但我很抱歉 - 你錯過了我的觀點。我需要在10g中做這些事情之一 - 而不是11g。無論我使用TO_CURSOR_NUMBER還是(如在您的代碼DBMS_SQL.TO_REFCURSOR中)對我來說都是無用的,因爲它們都不可用於10g。有沒有辦法在10g中做到這一點?再次感謝。 T –