Oracle的 merge 实验

简介:

开始

PL/SQL 的培训例子有问题。我的验证如下:

复制代码
SQL> select empno, ename from emp_cpy;        
        
     EMPNO ENAME        
---------- ----------        
      7900 gaoxx        
      7902 jianxx        
        
SQL>         
复制代码
复制代码
SQL> select empno, ename from emp;

     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
      7698 BLAKE
      7782 CLARK
      7788 SCOTT
      7839 KING
      7844 TURNER
      7876 ADAMS

     EMPNO ENAME
---------- ----------
      7900 JAMES
      7902 FORD
      7934 MILLER

14 rows selected.

SQL> 
复制代码
复制代码
SQL> select empno, ename from emp;

     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
      7698 BLAKE
      7782 CLARK
      7788 SCOTT
      7839 KING
      7844 TURNER
      7876 ADAMS

     EMPNO ENAME
---------- ----------
      7900 JAMES
      7902 FORD
      7934 MILLER

14 rows selected.

SQL> 
复制代码

我的merge 语句:

复制代码
set serveroutput on;        
        
  DECLARE        
    v_empno emp.empno%TYPE := 7900;        
  BEGIN        
    MERGE INTO emp_cpy c        
       USING emp e        
       ON (e.empno = v_empno)        
    WHEN MATCHED THEN        
       UPDATE SET        
         c.empno = e.empno, c.ename=e.ename,        
         c.job = e.job, c.mgr = e.mgr,        
         c.hiredate = e.hiredate, c.sal=e.sal,        
         c.comm=e.comm,c.deptno=e.deptno        
    WHEN NOT MATCHED THEN        
       INSERT VALUES(e.empno,e.ename,e.job,e.mgr,e.hiredate,        
       e.sal,e.comm,e.deptno);          
            
  END; 
复制代码

执行后:

发现并没有运行 update ,而只是 insert 了。这是因为 on 的条件里根本没有提及 emp_cpy 表的任何字段:

复制代码
SQL> select empno,ename from emp_cpy;        
        
     EMPNO ENAME        
---------- ----------        
      7369 SMITH        
      7499 ALLEN        
      7521 WARD        
      7566 JONES        
      7654 MARTIN        
      7698 BLAKE        
      7782 CLARK        
      7788 SCOTT        
      7839 KING        
      7844 TURNER        
      7876 ADAMS        
        
     EMPNO ENAME        
---------- ----------        
      7900 JAMES        
      7902 FORD        
      7934 MILLER        
      7900 gaoxx        
      7902 jianxx        
        
16 rows selected.        
复制代码

正确的作法应当是:

复制代码
BEGIN

MERGE INTO emp_cpy c
       USING emp e
       ON (e.empno = c.empno) 
WHEN MATCHED THEN
       UPDATE SET
       c.ename=e.ename 
WHEN NOT MATCHED THEN 
    INSERT VALUES(
      e.empno,e.ename,
      e.job,e.mgr,
      e.hiredate,e.sal,e.comm,e.deptno);
END;
复制代码

 在PL/SQL中,比较完整的是:

复制代码
set serveroutput on;        
        
  DECLARE        
    v_empno emp.empno%TYPE := 7900;        
  BEGIN        
    MERGE INTO emp_cpy c        
       USING emp e        
       ON (e.empno = v_empno and e.empno=v_empno)        
    WHEN MATCHED THEN        
       UPDATE SET        
         c.empno = e.empno, c.ename=e.ename,        
         c.job = e.job, c.mgr = e.mgr,        
         c.hiredate = e.hiredate, c.sal=e.sal,        
         c.comm=e.comm,c.deptno=e.deptno        
    WHEN NOT MATCHED THEN        
       INSERT VALUES(e.empno,e.ename,e.job,e.mgr,e.hiredate,        
       e.sal,e.comm,e.deptno);          
          
  END; 
复制代码

结束 





本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/11/13/2768138.html,如需转载请自行联系原作者

目录
相关文章
|
7月前
|
Oracle 关系型数据库 数据库
Oracle中merge Into的用法
Oracle中merge Into的用法
|
7月前
|
存储 Oracle 关系型数据库
实验三 Oracle数据库的创建和管理
实验三 Oracle数据库的创建和管理
77 1
|
7月前
|
SQL Oracle 关系型数据库
实验一 安装和使用Oracle数据库
实验一 安装和使用Oracle数据库
82 1
|
SQL Oracle 网络协议
【大数据开发运维解决方案】linux5 安装 oracle 11g(11.2.0.4)实验
​ 安装环境(可以查看附件的环境安装过程来安装和我这个一模一样的环境): oracle linux 5 64位 ,oracle11.2.0.4 64位  ip 192.168.0.5    hostname jtxy 安装目录: /u01 系统要求: 以下是安装Oracle数据库的内存要求11所示g版本2(11.2):
【大数据开发运维解决方案】linux5 安装 oracle 11g(11.2.0.4)实验
|
SQL Oracle 关系型数据库
|
存储 SQL 专有云
Oracle存储过程迁移ODPS-01(专有云):支持DML(delete/update/merge)SQL
关系型数据库支持的DML(delete/update/merge)SQL ,在maxcompute(ODPS)该如何写? 总有人问,现写了一个例子,应该可以说明了。 有问题,欢迎大家指正。
2608 1
|
SQL Oracle 关系型数据库