【问题标题】:Using Merge statement inside a cursor在游标内使用 Merge 语句
【发布时间】:2012-01-10 03:27:39
【问题描述】:

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

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

现在。我正在使用 for 循环遍历游标记录,以便将它们插入到主表中。

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

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

【问题讨论】:

    标签: sql oracle stored-procedures plsql oracle10g


    【解决方案1】:

    您可以通过从DUAL 中选择光标的数据来执行MERGE。例如

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

    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 语句的可读性可能是有意义的。

    【讨论】:

    • 在for循环中,“(select * from src)”可以做游标吗?
    • @HonorGod - 不,它不能是光标。但是,它可以而且应该是用于打开游标的查询。
    猜你喜欢
    • 1970-01-01
    • 2020-10-13
    • 2018-08-05
    • 2021-01-06
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    相关资源
    最近更新 更多