我正在尝试使用像....这样的选择语句打开REF CURSOR。
OPEN myREF FOR SELECT * FROM MYTABLE WHERE MYID IN (:Values) USING myPassedInValList;
但这仅在myPassedInValList中只有一个ID时才有效。我正在尝试使用像'1','2','5'等列表......
有人可以告诉我为什么这不起作用。
我尝试使用Google,但“使用”是一个非常常见的词:(
答案 0 :(得分:3)
你不能在SQL中使用用户定义的类型(可能是myPassedInValList是varray或嵌套表?)。为了引用UDT中的值,您需要使用table
函数,如下所示:
OPEN myREF
FOR SELECT *
FROM MYTABLE
WHERE MYID IN (select * from table(:Values))
USING myPassedInValList;
table
函数会将数组转换为内存中的表格式对象,允许您在SQL中访问它的内容。
这仅在您的UDT被定义为数据库对象(CREATE TYPE...
)时才有效。如果它在您的包中定义,则SQL将无法看到该定义。
答案 1 :(得分: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;