代码之家  ›  专栏  ›  技术社区  ›  Rob P.

甲骨文-了解'使用'关键字…?

  •  0
  • Rob P.  · 技术社区  · 15 年前

    我正试图用一个select语句打开一个REF游标,比如。。。。

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

    有人能告诉我为什么这样不行吗。

    我试着用谷歌搜索,但“使用”是一个非常常见的词:(

    2 回复  |  直到 15 年前
        1
  •  4
  •   Allan    15 年前

    在SQL中不能使用这样的用户定义类型(可能myPassedInValList是varray或嵌套表?)。为了引用UDT中的值,需要使用 table 功能,如:

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

    这个 桌子 函数将数组转换为内存中类似于表的对象,允许您在SQL中访问它的内容。

    只有将UDT定义为数据库对象时,这才有效( CREATE TYPE... ). 如果它是在您的包中定义的,那么SQL将无法看到该定义。

        2
  •  1
  •   FrustratedWithFormsDesigner    15 年前

    据我所知,这是不可能的。您可以尝试使用动态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;