Oracle存储过程怎么理解

免费教程   2024年05月09日 11:58  

今天小编给大家分享一下Oracle存储过程怎么理解的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一、存储过程通俗理解

简单理解存储过程是数据库SQL的操作语言,用于操作表数据,类似Java的方法,可以有入参,也可以有出参。开发存储过程需要熟悉一定的语法;

存储过程是可以包含多个操作,如:表增删改查、判断、循环、异常捕获、嵌套存储过程等;

举栗:有个业务需求,要求每天对购买商品大于1000元的买家发送抽奖信息短信及积分等级。 Java实现逻辑(仅仅是举例哈)可能是通过订单服务查询订单,然后再去用户服务查询用户信息,然后再去积分服务获取积分,获取以上数据后,再通过定时任务去执行该需求。

分析:以上的操作涉及多个服务,并且发生多次数据库的网络IO连接,多次网络交互会造成性能开销大,导致不必要的资源浪费。 而若通过存储过程实现,则逻辑是:【创建存储过程–查询用户表–查询订单表–查询积分表,使用存储过程对上述数据遍历判断,数据插入到短信推送信息表】,这时Java代码只需要一次与数据库的IO链接获取短信推送信息,直接去执行发送短信即可。

Oracle数据库有声明,只要是对数据的操作可以使用存储过程执行,速度比其他语言获取数据再加工要快。

二、创建存储过程基本语法(汇总)CREATEORREPLACEPROCEDUREP_存储过程名(变量名IN|OUT数据类型)--存储过程名称通常以P_开头IS--IS作为申明变量的关键词V_NUMNUMBER;--声明NUMBER类型的变量,后以分号结束V_USERNAMEVARCHAR2(40);--声明VARCHAR2类型的变量V_SORTINTEGER;--声明Integer类型的变量V_IS_BINDNUMBER(12);--声明长度为12的NUMBER类型变量V_NAMET_USER.NAME%TYPE;--声明变量直接赋值(表中NAME类型和长度就是V_NAME的类型和长度)V_USERT_USER%ROWTYPE;--声明记录型变量,相当于Java的对象,可以使用点加变量名获取值CURSORT_USERISSELECTNAME,AGEFROMT_USER;--声明游标--此处只作演示所用,其他变量声明可参考博文下面的示例及注释;BEGIN--执行代码开始--执行的代码逻辑,类似Java的方法体V_USER:='张三';--给变量赋值。语法是冒号后面跟等号DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,'YYYYMMDD'));--打印语句,相当于Java中的println方法EXCEPTION--异常WHENOTHERSTHEN...--OTHERS相当于Java中的Exception,会捕获所有异常END;--执行代码结束,以分号结束,也有一些是END后跟储存过程名加分号三、执行存储过程的方式(5种)--方式一,在SQL>后面执行EXEC存储过程名(参数..);或EXECUTE存储过程名(参数..);--方式二,在PL/SQLDeveloper的SQL窗口中执行(下有图)BEGIN存储过程名(参数);--执行的存储过程需要加分号END;--方式三,在PL/SQLDeveloper的Test窗口中执行,可执行debug,或者编译(下有图)BEGIN存储过程名(参数);--该种调用方式可调试END;--方式四,Java代码调用CallableStatementcallableStatement=connection.divpareCall("{call存储过程名(?)}");--方式五,在Mapper中调用,有入参和出参,使用<![CDATA[]]>包裹<![CDATA[{CALL存储过程名(#{name,mode=IN,jdbcType=VARCHAR},#{age,mode=OUT,jdbcType=INTEGER})}]]>四、网上现有的创建存储过程的两种方式解释(看注释)--方式一:该方式类似创建一个Java类,形成一个P_PUSH_MSG.sql的文件,该可以编译后保存在数据库,方便以后执行;CREATEORREPLACEPROCEDUREP_PUSH_MSG(V_RETCODEOUTVARCHAR2,V_RETINFOOUTVARCHAR2)IS...--方式二:该方式类似直接写的main方法,或者sql语句,不是文件,直接复制粘贴到其他地方执行、测试等。概念与上面方式一样;DECLAREV_IS_BINDNUMBER(12);BEGIN...END;五、一些存储过程示例(仅供参考)--示例一:数据库造数,不用手动插入了DECLAREINUMBER:=0;BEGINFORIIN1..500LOOP--循环语法,循环500次INSERTINTOT_USER(ID,USERID,USERNAME,AGE,CREATE_TIME)VALUES(I,'U_'+I,'XXYZ'+I,I,SYSDATE);ENDLOOP;--循环语法结束COMMIT;--事务提交END;--示例二:CREATEORREPLACEPROCEDUREP_ORDER_LIST(V_IN_DATENUMBER)ISBEGINDECLARE--CREATEORREPLACEPROCEDURE里面是可以有DECLARE的V_IS_BINDNUMBER(12);V_IS_WORKNUMBER(12);V_COUNT_DATENUMBER(12);BEGINV_COUNT_DATE:=V_IN_DATE;DELETEFROMT_PUSH_MSG_TEMPWHEREDT=V_COUNT_DATE;--删除临时表表T_PUSH_MSG_TEMPFORIIN(SELECTA.IDCPU_ID,A.UCXM,A.ORGID,L.NAMEORGNAME,Y.REGINON_ID,Y.REGINON_NAMEFROMJYXXALEFTJOIN(SELECTLBO.IDBRANCH_ID,LBO.IDREGINON_ID,LBO.NAMEREGINON_NAMEFROMORGANIZATIONN1)YONA.ORGID=Y.BRANCH_IDLEFTJOINORGANIZATIONLONA.ORGID=L.ID)LOOP--循环语法为:FORXIN()LOOP...--插入表INSERTINTOT_PUSH_MSG_TEMP(DT,CPU_ID,CPU_NAME,IS_BIND,IS_BIND_RATE,REGION_ID,REGION_NAME,BRANCH_ID,BRANCH_NAME)VALUES(V_COUNT_DATE,I.CPU_ID,I.UCXM,V_IS_BIND,CASEV_IS_WORKWHEN0THEN0ELSE--CASEWHEN用法ROUND(V_IS_BIND/V_IS_WORK,2)END,--ROUND函数用法I.REGINON_ID,I.REGINON_NAME,I.ORGID,I.ORGNAME);ENDLOOP;END;END;--示例三:CREATEORREPLACEPROCEDUREP_QYWX_TEXT_SHYJ_MSG()ISV_COUNTNUMBER;--数量BEGINSELECTCOUNT(*)INTOV_COUNTFROMT_ENTRY_INFOWHEREENTRY_DT=V_DATE;--赋值用法,INTO关键字到变量V_COUNT中IFV_COUNT=0THEN--IF判断用法--业务开始FORAIN(SELECTCHARGE_NAMEFROMT_ENTRY_INFOWHEREDEPTIN('好好学习部','天天向上部'))LOOP--循环用法SELECTSEQ_ENTRY_INFO.NextvalINTOIDFROMDUAL;--查询序列INSERTINTOT_PUSH_MSG(ID,BUSINESS_TYPE,RECIVE_MOBILE,RECIVE_NAME,TITLE,CONTENT,CONTENT_ORDER,STATUS,CREATE_DATE,UPDATE_DATE)VALUES(ID,'DX',(SELECTMOBILEFROMT_EXT_USERWHERENAME=A.CHARGE_NAME),A.CHARGE_NAME,'PLSQL','存储过程示例',ID,'无',SYSDATE,NULL);ENDLOOP;ELSIFV_COUNT<10THEN--判断语句,类似Java的elseif。注意:这里是ELSIF,少个字母EDBMS_OUTPUT.PUT_LINE('T_ENTRY_INFO表记录数少于'||V_COUNT||'条。');--拼接语法,使用双竖线拼接,相当于Java的加号ELSE--判断语句,相当于Java的elseDBMS_OUTPUT.PUT_LINE('T_ENTRY_INFO表记录数大于'||V_COUNT||'条。');ENDIF;EXCEPTION--异常捕获语句WHENOTHERSTHEN--OTHERS关键字,相当于Java中的ExceptionDBMS_OUTPUT.PUT_LINE(SQLERRM)--异常原因:使用SQLERRM关键词相当于Java代码中的堆栈信息END;六、其他语法DROPPROCEDURE存储过程名;--删除存储过程名SETSERVEROUTPUTON;--若是没有执行输出语句,可以使用该命令

以上就是“Oracle存储过程怎么理解”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

域名注册
购买VPS主机

您或许对下面这些文章有兴趣:                    本月吐槽辛苦排行榜

看贴要回贴有N种理由!看帖不回贴的后果你懂得的!


评论内容 (*必填):
(Ctrl + Enter提交)   

部落快速搜索栏

各类专题梳理

网站导航栏

X
返回顶部