11

只需尝试为我指定的 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: expression is of wrong type
PL/SQL: ORA-22905: cannot access rows from a non-nested table item

我哪里错了?

4

2 回答 2

13

在 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;
于 2010-01-11T23:04:31.660 回答
3

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

您只能在 Oracle 的 SQL 引擎中使用 SQL 类型。或者 PL/SQL 类型,Oracle 可以修改它看起来像 SQL 类型。

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

type TGuidList is table of NVarchar(38);

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

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

编辑:您不需要 NVarChar 作为 GUID,对吗?一个好的 ol' VarChar 应该可以解决问题。

于 2010-01-11T23:25:34.750 回答