打开游标以根据oracle中同一表的其他列值来获取和更新表的列值

时间:2018-06-25 18:38:04

标签: oracle plsql sql-update oracle12c database-cursor

我必须根据以下逻辑更新表中的最后2列,该逻辑有42列。

  • C42的字段值(在下面的公式中用N代替)=(“具有空/无值的第一列位置”-1)
  • C41的字段值= C(N)列的字段值,其中N =(“ C42列的值减去1”)

注意:表值的设置方式是,当在列中遇到第一个空值时;该表肯定有10万条记录,它是中间表,上面的计算每周重复一次,并且表中有新值,然后每周都要计算最后两列。 / p>

例如:

C42 = C19   ( 20 - 1) 

C41 = C(20) when 20 columns have some value and 21st column is null

试图创建存储过程,并打开了一个游标以获取值进行计算,但是在创建逻辑和基于逻辑更新每一行时存在问题。有人可以建议一种有效的方法来执行上述计算逻辑并更新每条记录。预先感谢

1 个答案:

答案 0 :(得分:0)

如果我了解您在做什么,则不需要PL / SQL,只需要使用合并和一个case表达式进行简单的更新-可以承认,它们都有很多术语,所以有点笨拙。

使用一个简化的表,只需要担心四列,以及要更新的第41和42列:

create table your_table (c1 number, c2 number, c3 number, c4 number, c41 number, c42 number);
insert into your_table (c1, c2) values (11, 12);
insert into your_table (c1, c2, c3) values (23, 24, 25);

您可以通过以相反的顺序合并所有其他列来获得c42值:

coalesce(c4, c3, c2, c1)

或您的情况:

coalesce(c40, c39, c38, c37, ..., c4, c3, c2, c1)

您可以使用类似case的表达式来获取该列的位置:

case
  when c40 is not null then 40
  when c39 is not null then 39
  ...
  when c4 is not null then 4
  when c3 is not null then 3
  when c2 is not null then 2
  when c1 is not null then 1
end;

您可以查询(使用我的简化表)来查看值:

select c1, c2, c3, c4,
  coalesce(c4, c3, c2, c1) as c41,
  case
    when c4 is not null then 4
    when c3 is not null then 3
    when c2 is not null then 2
    when c1 is not null then 1
  end as c42
from your_table;

        C1         C2         C3         C4        C41        C42
---------- ---------- ---------- ---------- ---------- ----------
        11         12                               12          2
        23         24         25                    25          3

您只需更新即可:

update your_table
set c41 = coalesce(c4, c3, c2, c1),
  c42 =
    case
      when c4 is not null then 4
      when c3 is not null then 3
      when c2 is not null then 2
      when c1 is not null then 1
    end;

2 rows updated.

select * from your_table;

        C1         C2         C3         C4        C41        C42
---------- ---------- ---------- ---------- ---------- ----------
        11         12                               12          2
        23         24         25                    25          3

如果这是您将要定期执行的操作,则可以创建这些虚拟列,以便自动计算并始终保持最新状态。