在游标内使用 Merge 语句

2024-04-21

我们需要填充一个主表,该表由 20 个不同表中的列组成。

我编写了一个存储过程来连接一些返回最大列数的表并将它们放在游标中。

现在。我正在使用 for 循环来迭代游标记录,以便可以将它们插入主表中。

如何在游标 for 循环内使用合并语句,以便我可以检查是否需要更新现有行或插入新行,具体取决于记录是否已存在。

如果我们可以在游标 for 循环中使用 merge 语句,有什么想法吗?有什么例子吗?


你可以做一个MERGE通过选择光标的数据DUAL。例如

使用一些数据创建源表和目标表

SQL> create table src ( col1 number, col2 varchar2(10) );

Table created.

SQL> create table dest( col1 number, col2 varchar2(10) );

Table created.

SQL> insert into src values( 1, 'A' );

1 row created.

SQL> insert into src values( 2, 'B' );

1 row created.

SQL> insert into dest values( 1, 'C' );

1 row created.

SQL> commit;

Commit complete.

运行合并

SQL> ed
Wrote file afiedt.buf

  1  begin
  2    for x in (select * from src)
  3    loop
  4      merge into dest
  5      using( select x.col1 col1, x.col2 col2
  6               from dual ) src
  7         on( src.col1 = dest.col1 )
  8       when matched then
  9         update set col2 = src.col2
 10       when not matched then
 11         insert( col1, col2 )
 12           values( src.col1, src.col2 );
 13    end loop;
 14* end;
SQL> /

PL/SQL procedure successfully completed.

并验证合并是否符合我们的要求。第 1 行已更新,第 2 行已插入。

SQL> select * from dest;

      COL1 COL2
---------- ----------
         1 A
         2 B

然而,以这种方式构建代码通常没有太大意义。通常,最好将用于打开游标的查询直接放入 MERGE 语句中,这样而不是从中选择一行数据DUAL,您将从您尝试合并数据的所有表中选择要合并的所有数据。当然,为此查询创建一个视图可能是有意义的MERGE语句可以查询以保留MERGE语句可读。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在游标内使用 Merge 语句 的相关文章

随机推荐