首页 文章

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

提问于
浏览
9

只需尝试为我指定的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 回答

  • 11

    在12.2之前的Oracle版本中,您只能通过CREATE TYPE语句从数据库中定义的集合类型进行SELECT, not 一个关联数组:

    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;
    
  • 3

    这是一个索引表,它是PL / SQL类型 .

    您只能在Oracle的SQL引擎中使用SQL类型 . 或者PL / SQL类型,Oracle可以将其看作SQL类型 .

    您可以拥有一个类似于数组的简单集合,并将其用作结果 . (没有索引)

    type TGuidList is table of NVarchar(38);
    

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

    创建类型TGuidList是NVarchar(38)的表;

    编辑:您不需要NVARChar作为GUID,是吗?一个好的'VarChar应该做的很好 .

相关问题