使用集合

时间:2016-08-05 14:40:12

标签: sql oracle plsql

我正在尝试使用我创建的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;

1 个答案:

答案 0 :(得分:0)

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

你的光标缺失了“

  

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;