代码之家  ›  专栏  ›  技术社区  ›  Travis Heseman

在IN子句中使用Oracle表类型-编译失败

  •  9
  • Travis Heseman  · 技术社区  · 16 年前

    只需为我指定的ID返回一个光标。

    CREATE OR REPLACE PACKAGE some_package AS
    
      TYPE t_cursor IS REF CURSOR;
      TYPE t_id_table IS TABLE OF NVARCHAR(38) INDEX BY PLS_INTEGER;
    
      PROCEDURE someentity_select(
        p_ids     IN  t_id_table, 
        p_results OUT t_cursor);
    
    END;
    
    CREATE OR REPLACE PACKAGE BODY some_package AS
    
      PROCEDURE someentity_select(
        p_ids     IN  t_guid_table, 
        p_results OUT t_cursor)
      IS
      BEGIN
    
        OPEN p_results FOR 
          SELECT * 
          FROM someschema.someentity 
          WHERE id IN (SELECT column_value FROM TABLE(p_ids)); - fails here
    
      END;
    
    END;
    

    注意:someschema.someEntity.id是nvarchar2(38)

    pl/sql:ora-00382:表达式类型错误
    pl/sql:ora-22905:无法访问非嵌套表项中的行

    我哪里出错了?

    2 回复  |  直到 8 年前
        1
  •  11
  •   Tony Andrews    8 年前

    在12.2之前的Oracle版本中,只能通过create type语句从数据库中定义的集合类型中进行选择, 关联数组:

    CREATE TYPE t_id_table IS TABLE OF NVARCHAR(38);
    
    CREATE OR REPLACE PACKAGE some_package AS
    
      PROCEDURE someentity_select(
        p_ids     IN  t_guid_table, 
        p_results OUT SYS_REFCURSOR);
    
    END;
    
    CREATE OR REPLACE PACKAGE BODY some_package AS
    
      PROCEDURE someentity_select(
        p_ids     IN  t_guid_table, 
        p_results OUT SYS_REFCURSOR)
      IS
      BEGIN
    
        OPEN p_results FOR 
          SELECT * 
          FROM someschema.someentity 
          WHERE id IN (SELECT column_value FROM TABLE(p_ids));
    
      END;
    
    END;
    
        2
  •  3
  •   Robert Giesecke    16 年前

    这是一个按表的索引,它是一个pl/sql类型。

    只能在Oracle的SQL引擎中使用SQL类型。或者说pl/sql类型,Oracle可以将其简化为SQL类型。

    您可以有一个类似数组的简单集合,并将其作为结果使用。(无索引)

    type TGuidList is table of NVarchar(38);
    

    但是,通过将其声明为全局SQL类型并在包中使用它,可以获得最佳的兼容性和稳定性:

    create type tguidlist是nvarchar(38)的表;

    编辑:你不需要一个nvarchar作为一个guid,是吗?一个好的ol'varchar应该做得很好。