PL / SQL语句被忽略。 ORA-22905:无法访问非嵌套表项的行

时间:2018-03-27 11:53:56

标签: sql oracle plsql

我尝试从嵌套表中选择值并批量收集到关联数组集合中。当我尝试批量收集oracle抛出上述异常时(PL / SQL:SQL语句被忽略 PL / SQL:ORA-22905:无法访问非嵌套表中的行 虽然我从嵌套表中获取数据。

在所有情况下都没有发生。当在不同的客户端数据库中编译相同的包时,有些情况下它不会抛出错误,并且在某些环境中,它会抛出错误。你能帮忙解决一下这个问题吗?

我没有附上整个包裹。而是提供了问题发生的情况。

DECLARE
  TYPE rc_rec_multiset IS record (
      rc_id   NUMBER,
      doc_num VARCHAR2(100)
    );

  TYPE rc_type IS TABLE OF rc_rec_multiset;

  TYPE tab_rec_type_multiset IS
    TABLE OF rc_rec_multiset INDEX BY pls_integer;

  rc_tab_type rc_type := rc_type() ;

  rc_tab_type_dist_rc tab_rec_type_multiset;
BEGIN
  SELECT DISTINCT rc_id,
         doc_num BULK COLLECT
  INTO   rc_tab_type_dist_rc
  FROM   TABLE(rc_tab_type);
END;

1 个答案:

答案 0 :(得分:0)

你不能用SQL做到这一点;关联数组是PL / SQL数据类型,不能在SQL范围内使用。类似地,PL / SQL作用域中定义的集合不能在SQL作用域中使用(在11g及更早版本中) - 您需要在SQL作用域中定义集合(注意 - 您不能对关联数组执行此操作,因为它们纯粹是PL / SQL)或只使用PL / SQL。

假设rc_tab_type集合不稀疏,那么您可以像这样使用纯PL / SQL:

DECLARE
  TYPE rc_rec_multiset IS record (
      rc_id   NUMBER,
      doc_num VARCHAR2(100)
    );

  TYPE rc_type IS TABLE OF rc_rec_multiset;

  TYPE tab_rec_type_multiset IS
    TABLE OF rc_rec_multiset INDEX BY pls_integer;

  rc_tab_type         rc_type               := rc_type();
  rc_tab_type_dist_rc tab_rec_type_multiset;
BEGIN
  /*
   * Populate rc_tab_type here.
   */

  FOR i IN 1 .. rc_tab_type.COUNT LOOP
    rc_tab_type_dist_rc( rc_tab_type(i).rc_id ) := rc_tab_type(i).doc_num;
  END LOOP;
END;

如果它是稀疏的,那么你将不得不使用:{/ p>而不是FOR循环。

i := rc_tab_type.FIRST;
WHILE i IS NOT NULL LOOP
  rc_tab_type_dist_rc( rc_tab_type(i).rc_id ) := rc_tab_type(i).doc_num;
  i := rc_tab_type.NEXT(i);
END LOOP;