我尝试使用像SELECT语句中的REF CURSOR ....甲骨文 - 了解“使用”关键字...?
OPEN myREF FOR SELECT * FROM MYTABLE WHERE MYID IN (:Values) USING myPassedInValList;
但当myPassedInValList只有在一个单一ID这只是工作。我试图使用像“1”的列表,“2”,“5”,等...
有人能告诉我,为什么这是行不通的。
我试图谷歌,但“使用”是一种非常常见的词:(
我尝试使用像SELECT语句中的REF CURSOR ....甲骨文 - 了解“使用”关键字...?
OPEN myREF FOR SELECT * FROM MYTABLE WHERE MYID IN (:Values) USING myPassedInValList;
但当myPassedInValList只有在一个单一ID这只是工作。我试图使用像“1”的列表,“2”,“5”,等...
有人能告诉我,为什么这是行不通的。
我试图谷歌,但“使用”是一种非常常见的词:(
你不能使用用户定义类型(大概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将无法看到的定义。
据我所知,这是不可能的你可以尝试绕过它使用动态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;