【Oracle】存储过程之完整篇
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】存储过程之完整篇的更多相关文章
- Oracle 存储过程学习
转自:http://blog.chinaunix.net/uid-20495387-id-174394.html http://www.cnblogs.com/rootq/articles/11000 ...
- Oracle存储过程知识汇总
基本语法篇: CREATE OR REPLACE PROCEDURE 存储过程名 //CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做ske ...
- oracle存储过程实例
oracle存储过程实例 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的P ...
- HIbernate Oracle存储过程
之前为了实现基于Hibernate+Oracle的存储过程调用,发现了一个又一个坑,然后一个一个的尝试解决. 需求:使用Hibernate调用Oracle的存储过程,需要支持的有动态表名.存储过程变量 ...
- oracle存储过程的例子
oracle存储过程的例子 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的 ...
- Java调用oracle存储过程通过游标返回临时表数据
注:本文来源于 < Java调用oracle存储过程通过游标返回临时表数据 > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...
- .NET Core中使用Dapper操作Oracle存储过程最佳实践
为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为OracleDbType.RefCursor,输出为:ParameterDir ...
- Oracle存储过程update受外键约束的主键值时完整性冲突解决方式
1.问题背景 尽管在数据库操作中我们并不提倡改动主键,可是确实在实际生活中有这种业务需求: 表A有主键KA,表B中声明了一个references A(KA)的外键约束.我们须要改动A中某条目KA的值而 ...
- NET Core中使用Dapper操作Oracle存储过程
.NET Core中使用Dapper操作Oracle存储过程最佳实践 为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为Or ...
随机推荐
- [html5]使用localStorage兼容低版本Safari无法使用indexeddb的情况
摘要 简单场景描述:将html5开发的app内嵌入ios app中,有部分数据,需要在本地存储,就想到使用浏览器的localstorage或者indexeddb,另外localstorage存储的方式 ...
- 读 Zepto 源码系列
虽然最近工作中没有怎么用 zepto ,但是据说 zepto 的源码比较简单,而且网上的资料也比较多,所以我就挑了 zepto 下手,希望能为以后阅读其他框架的源码打下基础吧. 源码版本 本文阅读的源 ...
- 在Windows Server 2008 R2中使用web方式修改域用户账户密码
在Windows的domain环境下,加域的客户端修改账户密码是一件很easy的事情:即使没有加域的客户端如果组织中,使用Exchange邮件系统,借助Exchange的owa也可以轻松修改账户密码. ...
- android NDK 开发环境搭建
基于 Android NDK 的学习之旅-----环境搭建 工欲善其事必先利其器 , 下面介绍下 Eclipse SDK NDK Cygwin CDT 集成开发环境的搭建. 1.Android 开发环 ...
- C标准库 二
http://www.utas.edu.au/infosys/info/documentation/C/CStdLib.html现在C语言(C99)标准库函数的24个头文件列表如下: assert.h ...
- Java Web应用软件保护方法
1 代码混淆概述目前针对Java源文件方法主要有以下几种方法:本地编译技术.数字水印技术.ClassLoader加密技术以及代码混淆技术.Java本地编译是指将Java应用程序编译成本地应用程序,如W ...
- 用Python语言写Hadoop MapReduce程序Writing an Hadoop MapReduce Program in Python
In this tutorial I will describe how to write a simple MapReduce program for Hadoop in the Python pr ...
- Maven中<dependencies>节点和<dependencyManagement>节点的区别
dependencyManagement只是插件管理,并不是真正的插件依赖,所以里面包含的插件在没有子项目使用的时候,并不会真正下载 1 .使用项目继承 利用项目继承可以将结构信息,部署信息,共同的依 ...
- 从原型模式(Prototype Pattern)到 Clone
前面提到抽象工厂的实现,这里说说抽象工厂的原型实现,与工厂方法的实现不同,原型实现有他自己的优点和缺点 原型的优点: 1. 效率:clone是native方法,比new的效率高,当使用复杂循环嵌套对象 ...
- Android UI-仿微信底部导航栏布局
现在App基本的标配除了侧滑菜单,还有一个就是底部导航栏,常见的聊天工具QQ,微信,购物App都有底部导航栏,用户可以随便切换看不同的内容,说是情怀也好,用户体验也罢.我们开发的主要的还是讲的是如何如 ...