只是想获得一个光标回我指定的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:不能从非嵌套表项访问的行

我在哪里去了?

有帮助吗?

解决方案

在Oracle版本之前12.2你只能从在数据库中通过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;

其他提示

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

您只能在甲骨文的SQL引擎使用SQL类型。或PL / SQL类型,甲骨文可以入侵周围看起来像SQL类型。

可以具有简单的阵列状的收集和使用它作为一个结果。 (由没有索引)

type TGuidList is table of NVarchar(38);

但最好的兼容性和稳定性,你通过声明它作为一个全球性的SQL类型获取和使用你的包内:

创建型TGuidList是为nvarchar表(38);

编辑:您将不再需要一个nvarchar的GUID,你愿意吗?一个良好的醇”的VarChar应该做的伎俩就好了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top