Oracle存储过程之merge into 函数(一)

原创 2016年08月31日 16:51:46

继上一篇博客:Oracle存储过程游标使用的merge into 函数的使用。
http://blog.csdn.net/z1729734271/article/details/52351700
本人之前也没有接触过Oracle的存储过程,这些只是最近项目经理让我参考写的一些总结,有什么不好的,不对的希望大家可以提出来。

create or replace package body PG_HOSPITAL_WT_TO_JSQY is
--这个package包里可以放多个存储过程
procedure GETHOSPITAL is
  begin
        merge into T_JSQY_HOSPITAL a --存储过程的目标表
        using (select t.*
                 from (select v.*,
                              row_number() over(partition by v.id order by v.lastupdate_ desc nulls last) rnum
                         from WT_DEPT v where substr(v.dept_class,1,2) not in ('D1','D3','D4','D5') and substr(v.dept_class,1,1) not in ('L','K') and v.jgbd in ('211','112') and v.todate_ > '20160701' and v.enabled='1' and v.ZFRQ is null) t
                where rnum = 1) e  --将查询出的信息当做表e
        on (a.ORGANCODE = e.id)    --限定条件
        when matched then          --当符合这些条件时 更新
          update
             set a.organname  = e.caption,
                 a.gbcode     = e.dept_adrresscode,
                 a.address    = e.tx_dz,
                 a.streetcode = substr(e.DEPT_XZJDCODE, 0, 6),
                 a.genrecode = e.dept_class,
                 a.managecode = e.dept_code,
                 a.membershipcode = e.lsgx,
                 a.WHOUPDATEID = '存储过程更新',
                 a.UPDATEDDATE = sysdate,
                 a.removed = '0'
        when not matched then     --不符合条件时,插入
          insert
            (id,
             organcode,
             organname,
             gbcode,
             address,
             streetcode,
             genrecode,
             managecode,
             membershipcode,
             WHOCREATEID,
             CREATEDDATE,
             REMOVED)
          values
            (SEQ_ORGID1606.Nextval,
             e.id,
             e.caption,
             e.dept_adrresscode,
             e.tx_dz,
             substr(e.DEPT_XZJDCODE, 0, 6),
             e.dept_class,
             e.dept_code,
             e.lsgx,
             '存储过程插入',
             sysdate,
             '0');    
        exception             --异常信息处理
        when others then
          dbms_output.put_line('>>>>>>>>>>>>>>>>>>'||sqlerrm);--这个请看下面,具体的我详细查了一下
    commit;  
  end;
   dbms_output.put('a'); --写入buffer但不输出
   dbms_output.put('b'); --写入buffer但不输出
   dbms_output.new_line; --回车(换行),输出                              
   dbms_output.put_line('hello world!'); --输出并换行 
   dbms_output.put('d'); --写入buffer但不输出 
Oracle内置函数SQLCODE和SQLERRM是特别用在OTHERS处理器中,分别用来返回Oracle的错误代码和错误消息。

OTHERS处理器应该是异常处理块中的最后的异常处理器,因为它是用来捕获除了别的异常处理器处理以外的所有的Oracle异常,所以在程序的最外层使用一个OTHERS处理器的话,将可以确保所有的错误都会被检测到。
  
  在一个内在的异常中,SQLCODE返回Oracle错误的序号,而SQLERRM返回的是相应的错误消息,错误消息首先显示的是错误代码。SQLCODE返回的是负数,除非Oracle的错误为“ORA-01403:NO DATA FOUND”(译:ORA-01403:未找到数据),当Oracle错误为“ORA-01403:NO DATA FOUND”时,其对应的SQLCODE为+100。对于用户自定义的异常,SQLCODE返回的是+1,而SQLERRM返回的是User-Defined Exception。
  
  一个Oracle的错误消息最多只能包含512个字节的错误代码。

      如果没有异常被触发,则SQLCODE返回0,SQLERRM返回“ORA-0000:normal, successful completion”。

      实例
      Exception
         when osi_general_error then
         when OTHERS THEN 
               out_ErrorMsg := SUBSTR(SQLERRM,1,100);
               out_ErrorNbr := ABS(SQLCODE);
      此段内容解释参考博客:
      http://blog.csdn.net/azkaser/article/details/4925084

最近对存储过程的操作,在我理解,存储过程是一个SQL语句的集合来完成系统内某些特定的需求,这些需求可以是一个sql搞定的,也可以是多个sql组合完成的。因为最近操作都是十几万,几十万的数据,运用存储过程可以大大减少SQL调用从而提高我们的执行效率。这些只是我最近接触的两种,存储过程里面还可以有好多判断if else之类的,这些判断都可以大大减少我们的执行SQL的语句,以后再做补充。

后续补充了一篇merge into 存储过程的逻辑整理,大家可以看一下,存储过程的逻辑还是是很重要!!!!
http://blog.csdn.net/z1729734271/article/details/52437856

什么是存储过程,存储过程的作用及优点
http://blog.csdn.net/z1729734271/article/details/52785013

版权声明:本文为博主原创,无版权,未经博主允许可以随意转载,无需注明出处,随意修改或保持可作为原创!

Oracle存储过程之merge into 函数(二)

之前的merger into 的各个组成部分,都有详细说明,想了解的大家可以查看我之前的博客:http://blog.csdn.net/z1729734271/article/details/5238...
  • z1729734271
  • z1729734271
  • 2016年09月05日 10:06
  • 1097

Oracle中merge into的使用

Oracle中merge into的使用 1.使用说明: 在进行SQL语句编写时,我们经常会遇到需要同时进行Insert/Update的情况 :若存在记录,就更新(Update),若不存在数据...
  • u011715137
  • u011715137
  • 2013年12月18日 10:36
  • 1621

Merge into的使用详解

转自:http://blog.csdn.net/inthirties/article/details/4731930 Merge是一个非常有用的功能,类似于Mysql里的insert into on...
  • ruihua1021
  • ruihua1021
  • 2015年04月07日 10:20
  • 179

Oracle merge into

最近学习别人的存储过程的时候遇到merge into用法,还未总结 参考https://www.cnblogs.com/dongsheng/p/4384754.html...
  • u011672034
  • u011672034
  • 2018年01月16日 19:47
  • 7

ORACLE 存储过程INTO 多个变量

select f1,f2,f3 into v1,v2,v3 from tab1
  • u011134399
  • u011134399
  • 2016年11月14日 17:11
  • 4843

oracle数据库存储过程范例(使用游标进行循环)

使用游标进行循环。 create or replace PROCEDURE Counting AS a_count number; cursor authorListCursor is select ...
  • enthusiastic513
  • enthusiastic513
  • 2015年07月08日 16:30
  • 522

Oracle merge into 记录

MERGE INTO table_name(目的表) table_alias USING (table/view/sub_query)//数据来源(可以用子查询)alias(别名) on(连接条件)...
  • u013132238
  • u013132238
  • 2016年07月25日 14:23
  • 279

Merge OUTPUT 高级用法综合写的一个MergeTab的存储过程

主要是写下来给自己备忘,T-SQL 中 MERGE 的用法,算是高级吧, WHEN MATCHED THEN UPDATE -- 中加了 后面要更新的列是否都相等,如果相等就没必要进行更新,只会 增加...
  • killoly
  • killoly
  • 2016年04月16日 23:33
  • 303

DB2 MERGE INTO语句的使用

  • 2014年08月15日 09:25
  • 2KB
  • 下载

Oracle存储过程笔记2:动态SQL(MERGE INTO )

CREATE OR REPLACE PROCEDURE P_PROD_UV(P_STARTTIME IN VARCHAR ,P_ENDTIME IN VARCHAR) IS /*-----------...
  • zhq1209
  • zhq1209
  • 2010年11月27日 20:14
  • 1299
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oracle存储过程之merge into 函数(一)
举报原因:
原因补充:

(最多只允许输入30个字)