Oracle错误ORA-22905:无法访问非嵌套表项中的行

问题描述:

这是我写入的存储过程。在此proc中,“p_subjectid”是从前端传递的一组数字。Oracle错误ORA-22905:无法访问非嵌套表项中的行

PROCEDURE getsubjects(p_subjectid subjectid_tab,p_subjects out refCursor) 
     as 

     BEGIN 

      open p_subjects for select * from empsubject where subject_id in 
      (select column_value from table(p_subjectid)); 
      --select * from table(cast(p_subjectid as packg.subjectid_tab)) 
     END getsubjects; 

这是我得到的错误。

Oracle error ORA-22905: cannot access rows from a non-nested table item OR 

正如我在不同的岗位都看到了,我试图铸造“剧组(p_subjectid为packg.subjectid_tab)”中的注释给出below.But我得到另一个错误内表功能:ORA-00902: invalid datatype

这是“subjectid_tab”的定义。

type subjectid_tab is table of number index by binary_integer; 

任何人都可以告诉我什么是错误,我的程序有什么问题。

您必须声明的“数据库级”为ammoQ提出的类型:

CREATE TYPE subjectid_tab AS TABLE OF NUMBER INDEX BY binary_integer; 

,而不是宣称PL/SQL中的类型。如果您只是在PL/SQL块中声明该类型,那么SQL“引擎”将不可用。

我认为你不能简单地在一个数字表上使用table()它必须是一个对象表。

+0

然后如何使用'IN'子句和数字表 – 2009-05-22 04:43:58

+2

试试这个: “CREATE TYPE subjectid_tab AS TABLE NUMBER INDEX BY binary_integer;” 而不是在PL/SQL中声明类型。 – 2009-05-22 05:06:55

你要投的流水线查询,以便结果:

如果你的管道函数返回VARCHAR2的行类型,然后定义(例如)

类型CREATE OR REPLACE TYPE char_array_t是VARRAY(32 )的varchar2(255); select * from table(cast(fn(x)as user_type_t));

现在可以工作。

昨天刚刚有这个问题。

 
DECLARE 
    TYPE number_table IS TABLE OF NUMBER; 
    result_ids number_table := number_table(); 
BEGIN 
    /* .. bunch of code that uses my type successfully */ 

    OPEN ? AS 
    SELECT * 
    FROM TABLE(CAST(result_ids AS number_table)); /* BOOM! */ 
END; 

在您从java例程调用时,前面介绍的两种方法都会失败。我发现这是由于number_table类型没有以可导出的方式定义,而不是可以从数据库运出。该类型在日常工作中很有用。但是,只要您尝试执行以任何方式引用它的可返回记录集(包括IN子句?!?),就会得到未定义的数据类型。

所以解决方案确实是CREATE TYPE myschema.number_table IS TABLE NUMBER;然后删除块中的类型声明并使用模式级声明。使用模式限定符来引用类型,以确保您使用的是正确的类型。

这是一个很好的解决方案。 如果您施放的类型位于pl/sql块的DECLARE部分中,则不能使用表(cast())。 你真的需要使用CREATE TYPE my_type [...]。否则,它会抛出“无法读取行[...]”异常。