Oracle中如何写存储过程
>存储过程是什么?
存储过程是一种命名的PL/SQL程序块,输入、输出参数数量【0个或多个】,通常没有返回值【也有特殊的情况】。
运行SQL语句时,Oracle是要先编译再执行的;而存储过程是已经编译好的代码,所以被调用或引用时,执行效率非常高。
存储过程被保存在数据库中,但是不能被SQL直接执行或调用,可以通过EXECUTE命令执行或在PL/SQL程序块内部被调用。
>创建存储过程的语法格式:
CREATE [OR REPLACE] procedure pro_name
[(parameter1[,parameter2]...] is|as
begin
plsql_sentences;
[exception]
[dowith_sentences;]
end [pro_name];
-->pro_name:存储过程的名称,如果数据库中已经存在了此名称,则可以指定"OR PLACE"关键字来覆盖原来的存储过程;如果不想覆盖,可修改名称,这样就可以区分开了
-->parameter1: 存储过程被调用或执行时用到的参数。【注意:这个值不是存储过程内定义的内部变量,内部变量应该在is|as之后定义】
parameter1如果是输入参数,则需要在后面指定IN关键字;如果是输出参数,则需要在后面指定OUT关键字,在IN和OUT后面加的是参数的数据类型,不需要指定长度;【不明白不要紧,后面会举例说明;】
-->plsql_sentences:PL/SQL语句,存储过程中功能实现的主要代码
-->dowith_sentences:异常处理语句,是可选的PL/SQL语句(不需要可以不写)
>创建和运行简单的存储过程
>举个栗子----【创建一个存储过程,该存储过程实现向dept表中插入一条记录】(首先记得自己建一张表,这里不再演示了)
create [or replace] procedure pro_insertDept is
begin
insert into dept values(77,'市场拓展部','8');
commit;
dbms_output.put_line('插入新纪录成功!');
end pro_insertDept;
执行Execute之后,

从上面的结果看出,我们已经顺利的创建出了存储过程pro_insertDept。【如果没有创建成功的话,可以使用show error命令查看错误信息。】
》》如果在我们创建之前,就已经有这个同名的存储过程了,那么应该怎么处理呢?【两种方法】
①修改现有的存储过程名称,重新创建
②使用字段中“OR Replcae"关键字创建一个同名的存储过程覆盖已经存在的存储过程。实际使用不加中括号,这里只是表示可有可无;
表示已经存在的话覆盖后,创建存储过程;没有的话,直接创建存储过程。
-->如果现在使用SQL*PLUS去查询插入的记录,一定是不存在的

原因是,我们只是创建了存储过程而并没有执行,若想要执行的话,使用Execute关键字来执行存储过程;也可以简写”EXEC“

-->接下里我们尝试在PL/SQL块中调用此存储过程,之前先将上一条记录删除,因为字段ID为主键;
然后按照下面的方式调用即可;

注:set serverout on 意思是在窗口里显示服务器输出信息。
>带参数的存储过程
①IN模式参数-------->“输入类型参数,参数由调用者传入,只能被存储过程读取,是默认的参数模式,也是最常用的”
>举个栗子----【创建一个存储过程,并定义3个IN模式的变量,然后将这3个变量的值插入到dept表中,代码及运行结果如下。】
create or replace procedure insert_dept(
id in number,
dname in varchar2,
deptno in number) is
begin
insert into dept
values(id,dname,deptno);
commit;
end insert_dept;
创建存储过程成功! 【注意点:参数类型不能指定长度。】
在调用或执行IN模式的存储过程时,用户需要自己传参数,你传什么,它就使用什么去执行。
>传参数的方式有三种:
1)指定名称传递-->参数名称在左,参数值在右,中间使用赋值符号"=>"连接:
pro_name(parameter1=>value1[,parameter2=>value2]...)
还是用栗子比较容易懂,不太明白的,请看这里:(因为标注字段名称,所以,赋值时位置可以颠倒)
【在PL/SQL块中调用存储过程insert_dept,然后使用'指定名称'的方式向其传入参数数值,最后执行当前的PL/SQL块】

2)按位置传递(这种方式不用写字段名称,所以赋值顺序必须与字段标准顺序一致)

##因为有的时候参数过多,或者参数名称太长不好记,这种方法只要记住顺序就可以了,实在记不住,使用DESC查看;
3)混合方式传递(顾名思义:这是将前两者结合使用的)
执行方法,还可以使用Execute关键字执行,和上面使用的方法结果是一样的;

特别注意:因为在中间使用了"指名方式"传值,所以后面的参数都要使用指名方式;因为指名方式可能已经破坏了参数原始的定义顺序了.
②OUT模式参数----->"输出类型参数,表示这个参数在存储过程中已经被赋值,并且参数值可以传递到当前存储过程以外的环境中"
老规矩--看栗子(栗子说:"为什么老是看我 ~_~!!")
【创建一个存储过程,要求定义两个OUT模式的字符类型的参数,然后在dept表中检索到的一行部门信息存储到这两个参数中】
create or replace procedure select_dept_out(
m_id in number, --定义IN模式变量,要求输入人员编号
m_dname out dept.dname%type, --定义OUT模式变量,可以存储部门名称并输出
m_deptno out dept.deptno%type) is
begin
select dname,deptno
into m_dname,m_deptno
from dept
where id=m_id; --检索某个员工号的员工信息
exception
when no_data_found then --如果select语句没有结果返回
dbms_output.put_line('该员工编号不存在'); --输出信息
end select_dept_out;
当调用或者执行以上存储过程时,都需要定义变量来保存这两个out参数,下面对OUT模式如何调用或执行分别举例子说明:
一》在PL/SQL块中调用OUT模式的存储过程:在PL/SQL块的DECLARE部分定义与存储过程中out参数兼容的若干变量
【首先在PL/SQL块中声明若干变量,然后调用select_dept_out存储过程,并将定义的变量传入该存储过程,以便接收out参数的返回值】

具体过程:执行上述代码时,声明的两个变量会被传入到存储过程中,但存储过程执行时,其中的out参数会被赋值,存储过程执行完毕后,OUT参数的值会在调用处(begin)返回,之后定义的两个变量(declare)就能得到传回来的值,就可以在存储过程之外任意使用了。
二》使用Exec执行OUT模式的存储过程:使用Exec命令需要在SQL*Plus环境中使用variable关键字声明两个变量,用来存储out参数的返回值
【使用variable关键字声明两个变量,分别用来存储部门名称和部门编号,然后使用exec命令执行存储过程,并传入声明的两个变量来接收out参数的返回值】

Exec执行的方式是无法直接看到结果的,可以通过两种方式输出变量的值: ①print命令 ②select语句
#>print命令

#>select语句

③IN OUT模式参数
开始之前咱们现总结一下IN和OUT的特性:
在执行存储过程时,
IN参数只能根据调用者传入的值去执行存储过程,不能被修改;
OUT参数只能等待存储过程执行完毕为其赋值再供外界使用,不能像IN一样为存储过程提供数据;
到這里,大家想一想:如果我要是想【计算一个数的平方或者平方根】,这种存储过程怎么写呢?
岂不是要是用IN传入一个数,再用OUT定义一个变量来接收了?不过大家仔细想一下,我们想要计算的值传进去后,就没用了,如果再原路将计算结果返还回来,那该多好,就不用单独定义OUT参数了,结果就有了IN OUT模式参数
IN OUT就是解决这个问题的;兼顾了IN和OUT的参数特性调用存储过程时,上面的分析如果看懂了,这里就不详细解释定义了。就是给定一个参数,在存储过程执行过程中,发生了改变,之后再将该参数原路返还给调用者;
创建存储过程,计算一个数的平方或平方根:
create or replace procedure pro_square(
num in out number,
flag in boolean) is
i int:=2; --表示计算平方
begin
if flag then --if语句,如果为true
num:=power(num,i); --计算平方
else --否则
num:=sqrt(num); --计算平方根
end if;
end pro_square;
执行上述存储过程:

--->IN参数的默认值(IN类型是可以设定默认值的,上面忘了说了,放在最后吧,重新建了表dept2)
IN模式的参数是可以设定默认值的,当执行时,调用者没有传值的话,可以使用默认值赋值:看栗子
【创建一个存储过程,定义3个IN参数,并将其中的两个参数设置为初始默认值;然后将这三个IN参数的值插入到dept中】
create or replace procedure insert_dept2_default(
num_deptno in number,
var_dname in varchar2 default '综合部', --定义部门名称并设定默认值
var_loc in varchar2 default '北京') is
begin
insert into dept2 values(num_deptno,var_dname,var_loc); --插入一条记录
end insert_dept2_default;
执行执行过程:

边学习边总结了存储过程的基本写法规则也就这些,希望能给大家一些启发~~~~
以上代码都是个人亲自敲的,执行过后都是没有问题的。如果哪位大牛觉得代码有不妥的地方,希望不吝赐教,万分感谢!
每天学习一点点,总有一天你的知识会堆积成巍峨的高山!!加油!
Oracle中如何写存储过程的更多相关文章
- oracle中函数和存储过程的区别和联系【转载竹沥半夏】
oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己 ...
- oracle中函数和存储过程的区别和联系
oracle中函数和存储过程的区别和联系 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和 ...
- Oracle中如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句?
Oracle中如何导出存储过程.函数.包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句? QQ群里有人问:如何导出一个用户下的存储过程? 麦苗答:方法有多种,可以使用DBMS_MET ...
- SQL Server 在生产环境中这样写存储过程的坑都避免了吗?
概述 最近因为业务的需求写了一段时间存储过程,发现之前写的存储过程存在一些不严谨的地方,特别是TRY...CATCH中嵌套事务的写法:虽然之前写的并没有错,但是还是埋藏着很大的隐患在里面.希望这篇文章 ...
- oracle中带参存储过程的使用
Oracle中存储过程带参分为:输入参数(in)和输出参数(out) 例如: create or replace procedure out_test(v_user in emp.user_name% ...
- oracle中怎么查看存储过程的源码
今天想找几天前写的存储过程的源码看看,发现自己熟悉的命令怎么都不好使,要不提示标示符错误要不就是提示未选定行,通过baidu得知type跟name变量要弄成大写的.. select text from ...
- oracle 中触发器增加存储过程commit问题
触发器无需commit也不能写commit触发器和触发它的DML是同一个事务DML提交了,触发器的操作也提交了,要不就一起回滚了 当然,如果你一定要在触发器里写COMMIT那就用自治事务相当于一个事务 ...
- .Net处理Oracle中Clob类型字段总结
最近在做项目中用到Clob这个字段,Clob是存储无限长字符的Oracle字段,用的时候网上找资料找了好久,内容不是很多,大部分都不能用,当然也有可以用的,测试了不同版本,整理了一下,给大家在做项目的 ...
- Oracle中创建触发器示例及注意事项
1.oracle 中创建触发器示例 CREATE TABLE "CONCEPT"."FREQUENCYMODIFYLOG" ( "FREQUENCYI ...
随机推荐
- Windows核心编程:第12章 纤程
Github https://github.com/gongluck/Windows-Core-Program.git //第12章 纤程.cpp: 定义应用程序的入口点. // #include & ...
- Asp.Net MVC EF之二:原生EF插入,更新数据的正确方法
引言 EF是相对与Dapper.NHibernate官方首推的ORM框架,其在开发过程中的方便,快捷毋庸置疑的,但由于EF本身的一些缓存机制.跟踪机制,所以在使用时有些地方需要特别注意. 下面我将自己 ...
- PKI信息安全知识点
1. 什么是X.509? X.509标准是ITU-T设计的PKI标准,他是为了解决X.500目录中的身份鉴别和访问控制问题设计的. 2. 数字证书 数字证书的意义在于回答公钥属于谁的问题,以帮助用户安 ...
- linux02
Linux Day 21.命令命令格式: chagrp chgrp命令用于变更文件或目录的所属群组. cd change directory 切换目录 格式:cd 路径 ls list 显示当前目录信 ...
- jQuery基础(2)
一.jQuery的属性操作 jQuery的属性操作分为四部分: html标签属性操作:是对html文档中的标签属性进行读取,设置和移除操作.比如attr().removeAttr(): DOM属性操作 ...
- 我的AI之路 —— 从裸机搭建GPU版本的深度学习环境
之前一直在CPU上跑深度学习,由于做的是NLP方向所以也能勉强忍受.最近在做图像的时候,实在是扛不住了...还好领导们的支持买个虚拟机先体验下.由于刚买的机器,环境都得自己摸索,瞎搞过很多次,也走过很 ...
- linux apache+php+mysql安装及乱码解决办法
1.乱码解决方法 首先确认mysql数据库字符集设置正确,php页面字符设置正确,之后修改apache配制文件http.conf 注释掉以下字符 AddDefaultCharset UTF-8 此为乱 ...
- SpringCloud之Eureka集群
前面我们介绍了SpringCloud注册中心Eureka,但是存在一个单点故障的问题,一个注册中心远远不能满足实际的生产环境,现在我们介绍一下如何搭建一个Eureka集群. 一:集群环境搭建 我们先建 ...
- postgresql-distinct on理解
PostgreSQL 的 distinct on 的理解 对于 select distinct on , 可以利用下面的例子来理解: create table a6(id integer, name ...
- 03-03 java 顺序语句结构,选择结构if语句
顺序结构: /* 流程控制语句:可以控制程序的执行流程. 分类: 顺序结构 选择结构 循环结构 顺序结构: 从上往下,依次执行. */ class ShunXuJieGouDemo { public ...