暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 在循环中将值分配到表类型变量中会导致错误PLS-00382: 表达式类型错误

ASKTOM 2020-05-25
264

问题描述

请参考我随此问题附上的脚本-

由于表-test_mgr_hierar5上的光标循环,有些记录应该存储在表类型变量中。
预计表类型将保存列person_id的值-177603、157564、157286、186196。

下一步是-需要从表-test_mgr_hierar90中删除记录,其中person_id不是上述记录。所以实际上它的类似-从test_mgr_hierar50删除其中person_id不在 (177603,157564,157286,186196) -这些值收集在表类型变量。

我面临的问题不是删除,而是不知何故,我无法通过循环/扩展子句在表类型变量中收集这些值。所以我的问题只与下面的条款有关-

对于csr1中的v
循环深度 _ 最大值: = 深度 _ 最大值1;
exch_rt.EXTEND;
-- exch_rt(depts_max) := v.person_id; --- 这是一个错误的错误 (PLS-00382: 表达式类型错误
结束循环;


我已经分享了所有步骤/脚本,并附上了会话。我尝试了多种方法来更改该语句,但这似乎不起作用 (附件会话中的详细信息) 或赋值语句,但在不同的试验和错误后无法找到。因此,您只需要建议将值分配到表类型变量中的正确方法。

专家解答

exch_tbl是 * objects * 的表,因此数组中的每个条目都必须是一个对象

所以在你的例子中

SQL> create or replace type exch_row as object (
  2      person_id NUMBER);
  3
  4  /

Type created.

SQL>
SQL> create or replace type exch_tbl as table of exch_row;
  2  /

Type created.

SQL>
SQL>
SQL> DECLARE
  2   l_row     exch_row;
  3   exch_rt   exch_tbl;
  4   depts_max NUMBER;
  5
  6  CURSOR csr1
  7  IS
  8   select 100 person_id from dual;
  9
 10  BEGIN
 11    depts_max := 0;
 12    exch_rt :=  exch_tbl();
 13
 14   for v IN csr1
 15   LOOP
 16      depts_max := depts_max + 1;
 17      exch_rt.EXTEND;
 18      exch_rt(depts_max) := exch_row(v.person_id);      <============= object
 19   END LOOP;
 20  END;
 21  /

PL/SQL procedure successfully completed.


我已经删除了你的 “当其他人那么空” ....请不要把它放回去 :-)
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论