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