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

Oracle 使用批量收集/FORALL

askTom 2018-07-23
192

问题描述

我有一个以前使用 “slow-by_slow” 类型过程的过程。我已经将其转换为批量收集和FORALL (test_cur,请参阅livesql)。

该过程是从2个表中获取数据,然后将该数据插入到2个相应的表中。我想使用数据并在将其插入表格之前对其进行稍微修改。

在FORALL之前,我添加了一个额外的SELECT语句,该语句从游标中检索数据并将值附加到数据列之一的末尾。

我意识到我可以改变光标查询并在最后附加 “测试”,但我试图创建一个非常基本的例子来理解这里,但在我的现实生活中,我从另一个表中获取数据,并希望在将其插入到其中一个表中之前,将该数据与光标中的一部分数据合并。

当我试图编译test_cur过程,我得到这些错误:

[错误] PLS-00201 (19:21): PLS-00201: 必须声明标识符 'I'
[错误] PLS-00201 (19:21): PLS-00201: 必须声明标识符 'I'
[错误] ORA-00904 (19:10): PL/SQL: ORA-00904:: 无效标识符


我是否需要额外的select语句的单独游标?

我做错了什么?

提前感谢您的帮助。







专家解答

如错误所示,在代码的这一部分中,我没有定义:

select l_inv_data(i).description||'TEST'
  BULK COLLECT into l_desc
  from dual;
复制


要访问l_inv_data(i).description,您需要循环遍历其所有元素。并且,假设每个描述可能不同,将它们分配给一个新数组。

因此,您也可以将l_desc定义为关联数组。循环通过l_inv_data来分配值。然后在你的forall插入中访问这个:

 l_desc dbms_sql.varchar2a;
...

  for i in 1..l_inv_data.COUNT loop
    l_desc(i) := l_inv_data(i).description||'TEST';
  end loop;

  FORALL i IN 1..l_inv_data.COUNT
  INSERT INTO header
  (ID, DESCRIPTION, AMOUNT)
  VALUES
  (l_inv_data(i).id, l_desc(i), l_inv_data(i).hdr_amt);
复制


或者,如果更改足够简单,请在forall本身中进行转换:

  FORALL i IN 1..l_inv_data.COUNT
  INSERT INTO header
  (ID, DESCRIPTION, AMOUNT)
  VALUES
  (l_inv_data(i).id, l_inv_data(i).description||'TEST', l_inv_data(i).hdr_amt);
复制


I realize that I could just change the cursor query and append "TEST" at the end, but I was trying to create a very basic example for ease of understanding here, but in my real-life procedure, I am getting data from another table and want to combine that data with a portion of the data from the cursor before inserting it into one of the tables.

听起来你需要加入光标!在这种情况下,你可以在那里进行操纵。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论