2010-01-11 41 views
8

简单地尝试为我指定的id返回一个游标。在IN子句中使用Oracle表类型 - 编译失败

 
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:不能访问的行来自非嵌套表项目

我在哪里出错了?

回答

10

只能从在数据库通过一个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; 
+0

谢谢..但现在它显示ORA-12714:无效的国家字符集在该行上指定..虽然更接近。 – 2010-01-11 23:18:58

+1

您可能想发布另一个关于该问题的问题,因为它是一个完全不同的问题,我不知道国家字符集问题。 – 2010-01-12 15:22:27

3

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

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

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

type TGuidList is table of NVarchar(38); 

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

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

编辑:你不需要一个GUID的NVarChar,你会吗?好的VarChar应该可以做到这一点。

+0

我必须使用NVarchar2 - 它是我客户的古老数据库标准的一部分(这也是我使用SP的原因)。 – 2010-01-12 02:49:06