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()它必须是一个对象表。
你要投的流水线查询,以便结果:
如果你的管道函数返回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 [...]。否则,它会抛出“无法读取行[...]”异常。
然后如何使用'IN'子句和数字表 – 2009-05-22 04:43:58
试试这个: “CREATE TYPE subjectid_tab AS TABLE NUMBER INDEX BY binary_integer;” 而不是在PL/SQL中声明类型。 – 2009-05-22 05:06:55