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

Roh*_*ith 9 oracle10g

这是我写的存储过程.在这个过程中,"p_subjectid"是从前端传递的数字数组.

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;
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误.

Oracle error ORA-22905: cannot access rows from a non-nested table item OR
Run Code Online (Sandbox Code Playgroud)

正如我在不同的帖子中看到的,我尝试在下面的评论中给出的表函数内部"cast(p_subjectid as packg.subjectid_tab)".但是我得到了另一个错误:ORA-00902: invalid datatype.

这就是"subjectid_tab"的定义.

type subjectid_tab is table of number index by binary_integer;
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*ten 11

您必须在ammoQ建议的"数据库级别"上声明类型:

CREATE TYPE subjectid_tab AS TABLE OF NUMBER INDEX BY binary_integer;
Run Code Online (Sandbox Code Playgroud)

而不是在PL/SQL中声明类型.如果在PL/SQL块中声明类型,它将不可用于SQL"引擎".

  • 万一其他人都在挣扎,这在Oracle 11g中将不起作用。PLS-00355:使用了在此上下文中未定义的pl / sql表。不过,在Oracle 12c中,一切看起来都很不错。作为在11g中的变通方法,如果您只能绑定到关联数组(如nodejs),则首先将关联数组循环到嵌套表(没有INDEX BY后缀)中。这会降低性能,但是您该怎么办?如果有人知道更好的方法,请不要犹豫。 (2认同)