【问题标题】:PL/SQL Statement Ignored. ORA-22905: cannot access rows from a non-nested table itemPL/SQL 语句被忽略。 ORA-22905: 无法访问非嵌套表项中的行
【发布时间】:2018-09-05 19:43:58
【问题描述】:

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

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

我没有附上整个包裹。而是提供发生问题的案例。

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;

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    您不能使用 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;
    

    如果它是稀疏的,那么你将不得不使用 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;
    

    【讨论】:

    • 嗨,我同意你的版本部分。正在编译的两个环境是在 11g 和 12c 上,其中代码在 12c 中成功编译,但在 11g 上没有。可能是导致问题的原因。选择查询写在嵌套表集合之上,而不是关联数组。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2020-11-29
    • 2016-07-19
    • 2017-09-15
    相关资源
    最近更新 更多