1.语法

create [or replace] procedure pro_name[(parameter1,parameter2,...)] is|as
begin
plsql_sentences;
[exception]
[dowith_sentences;]
end pro_name;

参数说明:

pro_name:存储过程名称

parameter1:参数

plsql_sentences:PL/SQL语句,它是存储过程功能实现的主体。

dowith_sentences:异常处理语句,也是PL/SQL语句。

上面的parameter1指的是存储过程被调用时候用的参数,内部变量需要在is|as关键字后边定义,并使用;号结束

2.环境准备

2.1 创建表TMP001

字段 描述 类型
id 客户编号 int
name 客户名称 varchar2(100)
gender 客户性别 varchar2(2)
age 客户年龄 int
address 客户地址 varchar2(200)

脚本:

create table TMP001(
id int not null,
name varchar2(100),
gender varchar2(2),
age int,
address varchar2(200)
)

3.具体案例

3.1创建一个简单存储过程,往表TMP001插入一条记录

/********************************************************
功能名称:用于简单存储过程测试
用途 :插入一条记录到TMP001表中 参数列表
---------------------------------------------------------
参数 IN/OUT 类型 描述
---------------------------------------------------------

--------------------------------------------------------- 版本号:1.0
---------------------------------------------------------
作者:Qinys
日期:20180915
说明:创建
---------------------------------------------------------
---------------------------------------------------------
********************************************************/
create or replace procedure proInsertTmp001 is
begin
insert into TMP001 values(1,'张三','男',29,'云南省昆明市');
commit;
dbms_output.put_line('插入记录成功!');
end proInsertTmp001;

上述存储过程放在PL/SQL Developer中编译通过后,即可调用查看结果

调用存储过程

①execute命令调用:execute  proInsertTmp001

②使用PL/SQL块

begin

  proInsertTmp001;

end;

3.2声明一个带IN模式的存储过程

/**********************************************************************
功能名称:用于测试带IN的存储过程
用途 :插入一条记录到TMP001表中 参数列表
参数列表
-----------------------------------------------------------------------
参数 IN/OUT 类型 描述
-----------------------------------------------------------------------
int_id IN INT 客户编号
var_name IN VARCHAR2 客户名称
var_gender IN VARCHAR2 客户性别
int_age IN INT 客户年龄
var_address IN VARCHAR2 客户地址
----------------------------------------------------------------------- 版本号:1.0
-----------------------------------------------------------------------
作者:Qinys
日期:20180915
说明:创建
-----------------------------------------------------------------------
-----------------------------------------------------------------------
**********************************************************************/
create or replace procedure proInsertTmp002(
int_id in int,
var_name in varchar2,
var_gender in varchar2,
int_age in int,
var_address in varchar2
) is
begin
insert into TMP001 values(int_id,var_name,var_gender,int_age,var_address);
commit;
dbms_output.put_line('插入记录成功!');
end proInsertTmp002;

调用存储过程

查看结果

3.3 声明一个带OUT模式的存储过程

/**********************************************************************
功能名称:用于测试带OUT的存储过程
用途 :调用存储过程,并返回调用结果 参数列表
-----------------------------------------------------------------------
参数 IN/OUT 类型 描述
-----------------------------------------------------------------------
int_id IN INT 客户编号
var_name IN VARCHAR2 客户名称
var_gender IN VARCHAR2 客户性别
int_age IN INT 客户年龄 默认值为:18
var_address IN VARCHAR2 客户地址 默认值为:China
flag OUT VARCHAR2 1-成功 0-失败
msg OUT VARCHAR2 返回错误代码
----------------------------------------------------------------------- 版本号:1.0
-----------------------------------------------------------------------
作者:Qinys
日期:20180915
说明:创建
-----------------------------------------------------------------------
-----------------------------------------------------------------------
**********************************************************************/
create or replace procedure proInsertTmp004(
int_id in int,
var_name in varchar2,
var_gender in varchar2,
int_age in int default 18,
var_address in varchar2 default 'China',
flag out varchar2,
msg out varchar2
) is
begin
proInsertTmp003(int_id,var_name,var_gender,int_age,var_address);
commit;
--主体程序运行完毕
flag :='1';
--异常处理
exception
when others then
rollback;
flag :=0;
msg :='错误原因'|| sqlcode || ',' || sqlerrm(sqlcode);
end proInsertTmp004;

我们正常调用存储过程proInsertTmp004

在output可以看到结果

非正常调用

output结果

3.4 声明一个带OUT模式的存储过程

/**********************************************************************
功能名称:根据flag标志,若为True,则返回平方,反之,则返回平方根
用途 : 用于测试IN OUT参数的存储过程 参数列表
-----------------------------------------------------------------------
参数 IN/OUT 类型 描述
-----------------------------------------------------------------------
num IN OUT NUMBER 输入的值
flag IN boolean 只有True与False两种类型
----------------------------------------------------------------------- 版本号:1.0
-----------------------------------------------------------------------
作者:Qinys
日期:20180915
说明:创建
-----------------------------------------------------------------------
-----------------------------------------------------------------------
**********************************************************************/
create or replace procedure pro_square(
num in out number,
flag in boolean) is i int :=2;
begin
if flag then
num:=power(num,i);
else
num:=sqrt(num);
end if;
end pro_square;

调度存储过程

declare
var_temp number;
var_num number;
bool_flag boolean;
begin
var_temp := 4;
var_num := var_temp;
bool_flag := false;
pro_square(var_num,bool_flag);
if bool_flag then
dbms_output.put_line(var_temp||'的平方是:'||var_num);
else
dbms_output.put_line(var_temp||'的平方根是:'||var_num);
end if;
end;

调度结果是:

3.5 创建带有默认值的存储过程

/**********************************************************************
功能名称:用于测试带默认值的存储过程
用途 :插入一条记录到TMP001表中 参数列表
-----------------------------------------------------------------------
参数 IN/OUT 类型 描述
-----------------------------------------------------------------------
int_id IN INT 客户编号
var_name IN VARCHAR2 客户名称
var_gender IN VARCHAR2 客户性别
int_age IN INT 客户年龄 默认值为:18
var_address IN VARCHAR2 客户地址 默认值为:China
----------------------------------------------------------------------- 版本号:1.0
-----------------------------------------------------------------------
作者:Qinys
日期:20180915
说明:创建
-----------------------------------------------------------------------
-----------------------------------------------------------------------
**********************************************************************/
create or replace procedure proInsertTmp003(
int_id in int,
var_name in varchar2,
var_gender in varchar2,
int_age in int default 18,
var_address in varchar2 default 'China'
) is
begin
insert into TMP001 values(int_id,var_name,var_gender,int_age,var_address);
commit;
dbms_output.put_line('插入记录成功!');
end proInsertTmp003;

调用存储过程

此处指传入前三个参数

4.存储过程调用传递参数

4.1使用指定名称传递的方式传递参数

4.1.1 语法

pro_name(parameter1=>value1[,parameter1=>value1]…)

4.1.2 例子

我们从数据库的得知,确实已经插入,并且字段顺序没变

4.2使用按位置的方式传递参数

4.2.1 语法

此种传递是我们最常用的,也就是值与参数一一对应

4.2.2 例子

见具体案例3.2中的调用存储过程

4.3使用按位置的方式传递参数

4.3.1 语法

上述两种传递方式混合起来,但是在某个位置使用“指定名称传递”之后,后边的参数值必须使用指定名称传递,因为参数的原始定义顺序可能已经被破坏

4.3.2 例子

【Oracle】存储过程之完整篇的更多相关文章

  1. Oracle 存储过程学习

    转自:http://blog.chinaunix.net/uid-20495387-id-174394.html http://www.cnblogs.com/rootq/articles/11000 ...

  2. Oracle存储过程知识汇总

    基本语法篇: CREATE OR REPLACE PROCEDURE 存储过程名 //CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做ske ...

  3. oracle存储过程实例

    oracle存储过程实例 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的P ...

  4. HIbernate Oracle存储过程

    之前为了实现基于Hibernate+Oracle的存储过程调用,发现了一个又一个坑,然后一个一个的尝试解决. 需求:使用Hibernate调用Oracle的存储过程,需要支持的有动态表名.存储过程变量 ...

  5. oracle存储过程的例子

    oracle存储过程的例子 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的 ...

  6. Java调用oracle存储过程通过游标返回临时表数据

    注:本文来源于 <  Java调用oracle存储过程通过游标返回临时表数据   > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...

  7. .NET Core中使用Dapper操作Oracle存储过程最佳实践

    为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为OracleDbType.RefCursor,输出为:ParameterDir ...

  8. Oracle存储过程update受外键约束的主键值时完整性冲突解决方式

    1.问题背景 尽管在数据库操作中我们并不提倡改动主键,可是确实在实际生活中有这种业务需求: 表A有主键KA,表B中声明了一个references A(KA)的外键约束.我们须要改动A中某条目KA的值而 ...

  9. NET Core中使用Dapper操作Oracle存储过程

    .NET Core中使用Dapper操作Oracle存储过程最佳实践   为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为Or ...

随机推荐

  1. Chrome在win8显示“没有注册类”的解决办法

    问题1:从任务栏和桌面快捷方式无法打开Chrome,显示错误为没有注册类问题2:无法从word等中点击打开url,无法打开html,htm方式的文件,同样显示错误为没有注册类出了这两个错误后,用起来相 ...

  2. 为iOS应用制作一个二维码

    第一步:找到你发布的ios应用的下载链接: 第二步:使用二维码转换器,将下载链接转换成 二维码.http://my.qzone.qq.com/app/100699951.html?via=appcen ...

  3. SVN环境

    SVN服务器搭建和使用(一) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...

  4. 关于DirectShow SDK 和Windows SDK,及DirectX SDK

    关于DirectShow SDK 和Windows SDK,及DirectX SDK   本文描述了DirectShow SDK ,Windows SDK,DirectX SDK ,VS200?之间的 ...

  5. Android图片加载框架最全解析(四),玩转Glide的回调与监听

    大家好,今天我们继续学习Glide. 在上一篇文章当中,我带着大家一起深入探究了Glide的缓存机制,我们不光掌握了Glide缓存的使用方法,还通过源码分析对缓存的工作原理进行了了解.虽说上篇文章和本 ...

  6. 在Mac OS X上配置Apache2

    转载:http://www.cnblogs.com/yuanyq/p/3435022.html#2821339 最近一段时间在开发面向移动设备的网页,而且是静态网页.所以很需要一个HTTP服务器,简单 ...

  7. Informatica 常用组件Filter之三 创建FIL

    在 Designer 中,切换到 Mapping Designer 并打开映射. 选择"转换-创建". 选择"过滤器转换",然后输入新的转换名称.过滤器转换的命 ...

  8. go语言基础之append函数的使用

    1.append函数的使用 作用:在原切片的末尾添加元素 示例: package main //必须有个main包 import "fmt" func main() { s1 := ...

  9. mysql数据库查询优化

    上两周一直想办法提高查询速度,取得一点效果,解决了部分问题,记下来以便将来自己查看. 由于公司没有专门的DBA,我自己对mysql数据库也不是很熟悉,而且这个JAVA开发的网络审计系统的管理系统,是经 ...

  10. 输错密码?这个 sudo 会“嘲讽”你

    导读 你在 Linux 终端中会有很多的乐趣.我今天要讲的不是在终端中跑火车.我今天要讲的技巧可以放松你的心情.你学习过如何在命令行中增加 sudo 命令的超时,今天的文章中,我会向你展示如何让 su ...