使用集合中的值更新表中的列

Posted

技术标签:

【中文标题】使用集合中的值更新表中的列【英文标题】:Updating a column in a table with values from a collection 【发布时间】:2016-08-05 14:40:11 【问题描述】:

我正在尝试使用我创建的 PL/SQL 集合中的值更新表中的多个列。

所以我声明一个这样的表:

TYPE mon_tableau IS VARRAY (2) OF FLOAT;
v_tab  mon_tableau;

我给它一些像这样的值:

v_tab := mon_tableau (10000, 20000);

然后我创建一个 SQL 语句,获取我想用 v_tab 中的两个值(10000 和 20000)更新的值。

如何进行更新?我在循环中尝试了一个游标:

DECLARE
   TYPE mon_tableau IS VARRAY (2) OF FLOAT;
  v_tab        mon_tableau;
   v_new_prix   RATE_PACK_PARAMETER_VALUE.PARAMETER_VALUE_FLOAT%TYPE;
 CURSOR get_prix
   IS
        SELECT   e.PARAMETER_VALUE_FLOAT
          FROM   mpuzptab a,
                 mpulkgvm b,
                 mpulkrim c,
                 rate_pack_element d,
                 rate_pack_parameter_value e
         WHERE       a.digits IN ('+21685000', '+21685003')

BEGIN
   v_tab := mon_tableau (10000, 20000);
  FOR i IN v_tab.FIRST..v_tab.LAST
   LOOP
      FOR j IN get_prix
      LOOP
         v_new_prix := j.PARAMETER_VALUE_FLOAT;

         UPDATE   rate_pack_parameter_value v
            SET   v_new_prix = v_tab (i)
        WHERE   v.RATE_PACK_ELEMENT_ID = j.RATE_PACK_ELEMENT_ID;
      END LOOP;
   END LOOP;
END;

【问题讨论】:

您想使用 PL/SQL 集合中的值更新真实表吗?它必须是那种集合类型吗?表数据如何与集合相关?这将有助于显示表结构,可能还有一些示例日期、您尝试的更新以及您正在寻找的结果。 发布你到目前为止所做的代码 您似乎正在尝试将表中的每个匹配行更新为 10000,然后再次将其更新为 20000。假设它有一个名为 v_new_prix 的列,这看起来是错误的。而且您的光标不包括您尝试用于更新的e.RATE_PACK_ELEMENT_ID。你的目标到底是什么?为什么你使用 PL/SQL,而不是普通 SQL 中的相关更新? 当然同意 Alex..why PL/SQL。它可以由 SQL 本身完成,是任何特定要求的一部分。 那么你真正要做的是将'+21685000'对应的参数值设置为10000,将'+21685003'对应的值设置为20000?您仍然没有显示表结构,或者表是如何相关的,或者它们在开始时包含的数据。 【参考方案1】:

请更正以下内容并尝试。也发布您的错误。

你的光标不见了"

j.RATE_PACK_ELEMENT_ID

" 您稍后在更新时使用。在使用之前先选择它。

下面的代码应该可以工作(未经测试)。修改提到的地方。

DECLARE
   TYPE mon_tableau IS VARRAY (2) OF FLOAT;
   v_tab        mon_tableau;
   v_new_prix   RATE_PACK_PARAMETER_VALUE.PARAMETER_VALUE_FLOAT%TYPE;
 CURSOR get_prix
   IS
        SELECT   e.PARAMETER_VALUE_FLOAT,
                 e.RATE_PACK_ELEMENT_ID
          FROM   mpuzptab a,
                 mpulkgvm b,         ---Unnecessary table
                 mpulkrim c,         ---Unnecessary table
                 rate_pack_element d,---Unnecessary table
                 rate_pack_parameter_value e
         WHERE   a.digits IN ('+21685000', '+21685003')
         and    <code>; -----Join your table a & e to avoid cartesian
BEGIN
   v_tab := mon_tableau(10000, 20000);
  FOR i IN v_tab.FIRST..v_tab.LAST
   LOOP
      FOR j IN get_prix
      LOOP
         --v_new_prix := j.PARAMETER_VALUE_FLOAT;

         UPDATE   rate_pack_parameter_value v
            SET   PARAMETER_VALUE_FLOAT = v_tab(i)
        WHERE    v.RATE_PACK_ELEMENT_ID = j.RATE_PACK_ELEMENT_ID;
      END LOOP;
   END LOOP;
END;

【讨论】:

谢谢先生,但实际上它用相同的值更新了两个列,即 20000 !是订单问题吗?? 可以发一下表格数据吗?如果表中所有记录的 id 都相同,那么它当然会更新整个表。也没有更新 2 列。您在此处指的是哪一列。 通过启动此代码:SELECT e.PARAMETER_VALUE_FLOAT, e.RATE_PACK_ELEMENT_ID FROM mpuzptab a, mpulkgvm b, ---不必要的表 mpulkrim c, ---不必要的表 rate_pack_element d,---不必要的表 rate_pack_parameter_value e WHERE a.digits IN ('+21685000', '+21685003') ,结果是:90000 对应数字 +21685000 和 50000 到 +21685003 的值,我想将 90000 更新为 10000 并将 50000 更新为20000 那是哪一栏?您只需要在光标中选择该列并在上面的 where 子句中使用它。您发布表结构和一些示例数据 我要更新的列是 PARAMETER_VALUE_FLOAT

以上是关于使用集合中的值更新表中的列的主要内容,如果未能解决你的问题,请参考以下文章

使用同一列中的值更新表中的唯一列

用于替换表中的值的宏

使用 XLRD 从 excel 表中的列中读取 int 值

如何使用窗口函数更新表中的列

Oracle SQL:根据在另一个表中给定条件的列中找到的值插入

当没有明确的列可以加入时,如何使用另一个表中的值更新 sql 表?