2010-07-29 47 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;