2010-07-29 167 views
0

我嘗試使用像SELECT語句中的REF CURSOR ....甲骨文 - 瞭解「使用」關鍵字...?

OPEN myREF FOR SELECT * FROM MYTABLE WHERE MYID IN (:Values) USING myPassedInValList; 

但當myPassedInValList只有在一個單一ID這只是工作。我試圖使用像「1」的列表,「2」,「5」,等...

有人能告訴我,爲什麼這是行不通的。

我試圖谷歌,但「使用」是一種非常常見的詞:(

回答

3

你不能使用用戶定義類型(大概myPassedInValList是VARRAY或嵌套表?)在這樣的SQL。爲了引用在v從UDT alues,你需要使用table功能,像這樣:

OPEN myREF 
    FOR SELECT * 
     FROM MYTABLE 
     WHERE MYID IN (select * from table(:Values)) 
    USING myPassedInValList; 

table功能將數組轉換成在存儲器中的表狀物體,它允許您訪問其內容的SQL 。

此,如果您的UDT被定義爲一個數據庫對象(CREATE TYPE...)纔有效。如果你包的定義,則SQL將無法看到的定義。

1

據我所知,這是不可能的你可以嘗試繞過它使用動態SQL:字符串連接在一起OPEN myREF FOR SELECT * FROM MYTABLE WHERE MYID IN (實際值的列表中,然後打開遊標。

http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/dynamic.htm#i13057

/*you could build this string dynamically by looking through myPassedInValList and 
concatenating them in the IN list.*/ 
v_stmt_str := 'SELECT * FROM MYTABLE WHERE MYID IN (''1'',''2'')' 

/*Open cursor & specify bind argument in USING clause:*/ 
OPEN v_emp_cursor FOR v_stmt_str;