jag*_*mot 4 sql oracle plsql stored-procedures oracle10g
我们需要填充一个主表,该表由一组20个不同表中的列组成.
我编写了一个存储过程来连接一些表,这些表返回最大列数并将它们放在游标中.
现在.我使用for循环迭代光标记录,所以我可以将它们插入到主表中.
我如何在游标中使用合并语句for循环,以便我可以检查是否需要更新现有行或插入新行,具体取决于记录是否已存在.
如果我们可以在游标中使用合并语句进行循环的任何想法?任何例子?
您可以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.
Run Code Online (Sandbox Code Playgroud)
运行合并
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.
Run Code Online (Sandbox Code Playgroud)
并验证合并是否符合我们的要求.第1行已更新,第2行已插入.
SQL> select * from dest;
COL1 COL2
---------- ----------
1 A
2 B
Run Code Online (Sandbox Code Playgroud)
但是,以这种方式构造代码通常没有多大意义.您通常最好将用于打开游标的查询直接打开到MERGE语句中,这样DUAL
您就可以从所有表中选择要合并的所有数据,而不是从中选择一行数据.你正在尝试合并来自的数据.当然,为该查询创建一个视图可能是有意义的,MERGE
语句可以查询该视图以保持MERGE
语句可读.
归档时间: |
|
查看次数: |
17464 次 |
最近记录: |