初出茅庐,不知原来存储过程还可以写得如此复杂,而且还竟然可以调试!

好吧,得整理一下存储过程的一些语法,以备以后用到时可以查阅。

使用数据库:Oracle

数据库工具:PL/SQL Developer

在Oracle中使用存储过程可以声明单个存储过程,也可以使用包的方式一个存储过程包(PACKAGE)包含许多存储过程。

编写单个存储过程的格式可以参考下面这个例子,这是最简单的存储过程例子:

CREATE OR REPLACE PROCEDURE PROC_TEST IS
/* 声明变量 */
count number;
BEGIN
/* SQL代码 */
select * from dual;
/* 异常处理 */
EXCEPTIOIN
WHEN NO_DATA_FOUND THEN
--处理代码
WHEN OTHERS THEN
--处理代码
END PROC_TEST; --这里也可以直接写成: "END;"

如果有许多存储过程,那么你可能需要用到存储过程包。在Oracle中使用存储过程包首先要先创建package声明存储过程,之后创建package body写存储过程的具体内容。

存储过程的package相当于Java中的接口,而package body就相当于Java中实现该接口的类。

1.声明存储过程

CREATE OR REPLACE PACKAGE PACK_ZOO IS
/* 不带参数的存储过程 */
PROCEDURE WATCH_MONKEY;
/* 带参数的存储过程 */
PROCEDURE FEED_MONKEY(p_food IN VARCHAR2, p_amount IN NUMBER);
END PACK_ZOO;

①在oracle的存储过程中,形式参数(形参)声明用IN关键字。上面代码[p_food IN VARCHAR2] 中,p_food为变量名,IN为关键字,VARCAHR2为变量类型。

②在存储过程中声明参数,则是直接变量名后跟上变量类型,如下面代码中的name参数:[name VARCAHR2(12)]

2.编写存储过程内容

CREATE OR REPLACE PACKAGE BODY PACK_ZOO IS
/*
* 不带参数的存储过程
*/
PROCEDURE WATCH_MONKEY IS
/* 参数声明 */
name VARCHAR2(12);
BEGIN
/* 处理体 */
SELECT * FROM DUAL;
/* 异常处理 */
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('无数据记录');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('异常代码:' + sqlcode); --sqlcode代表异常代码
DBMS_OUTPUT.PUT_LINE('异常信息:' + sqlerrm); --sqlerrm代表异常信息
   END WATCH_MONKEY;
/*
*带参数的存储过程
*/
PROCEDURE FEED_MONKEY(p_food IN VARCHAR2, p_amount IN NUMBER) IS
/* 参数声明 */
name VARCHAR2(12);
BEGIN
/* 处理体 */
name := 'Hello Oracle!';
/* 异常处理 */
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('CATCH EXCEPTIOIN');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('异常代码:' + sqlcode); --sqlcode代表异常代码
DBMS_OUTPUT.PUT_LINE('异常信息:' + sqlerrm); --sqlerrm代表异常信息
END FEED_MONKEY;
END PACK_ZOO;

在方法体里要给一个变量赋值,应该使用符号 "  :=  ",如:"  name := 'Hello Oracle!'  "

这里用到的语法是PLSQL语法,想了解更多关于PLSQL语法的知识,可以看我的另一篇文章:PL/SQL基础语法

Oracle 存储过程包(Package、Package Body)的更多相关文章

  1. Oracle 中包(Package)

    一.什么要使用包?        在一个大型项目中,可能有很多模块,而每个模块又有自己的过程.函数等.而这些过程.函数默认是放在一起的(如在PL/SQL中,过程默认都是放在一起 的,即Procedur ...

  2. oracle 存储过程 包 【转】

    一.为什么要用存储过程? 如果在应用程序中经常需要执行特定的操作,可以基于这些操作简历一个特定的过程.通过使用过程可以简化客户端程序的开发和维护,而且还能提高客户端程序的运行性能. 二.过程的优点? ...

  3. Oracle 存储过程包

    create or replace package body cuttoship_lots is procedure prod_run(p_w_day date) as begin delete cu ...

  4. Oracle 包(Package)

    引用这位大大的: http://www.cnblogs.com/lovemoon714/archive/2012/02/29/2373695.html 1.为什么要使用包?       答:在一个大型 ...

  5. (转)Oracle 包(Package)

    本文转载自:http://www.cnblogs.com/lovemoon714/archive/2012/02/29/2373695.html 1.为什么要使用包?       答:在一个大型项目中 ...

  6. oracle 存储过程,函数和包

    创建存储过程: 语法:create [or replace] PROCEDURE 过程名(参数列表)  AS PLSQL子程序体: 调用 存储过程的方式 两种1.execute(exec)     - ...

  7. oracle 存储过程,存储函数,包,

    http://heisetoufa.iteye.com/blog/366957 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过 ...

  8. oracle 学习(五)pl/sql语言存储过程&包

    首先搞清楚俩概念 存储过程(procedure)&程序包(package) 存储过程:数据库对象之一,可以理解为数据库的子程序,在客户端和服务器端可以直接调用它.触发器是与表直接关联的特殊存储 ...

  9. [UML]UML系列——包图Package

    系列文章 [UML]UML系列——用例图Use Case       [UML]UML系列——用例图中的各种关系(include.extend)       [UML]UML系列——类图Class   ...

随机推荐

  1. 瓜子IM智能客服系统的数据架构设计(整理自现场演讲)

    本文由ITPub根据封宇在[第十届中国系统架构师大会(SACC2018)]现场演讲内容整理而成. 1.引言 瓜子业务重线下,用户网上看车.预约到店.成交等许多环节都发生在线下.瓜子IM智能客服系统的目 ...

  2. node 连接 mysql 数据库三种方法------笔记

    一.mysql库 文档:https://github.com/mysqljs/mysql mysql有三种创建连接方式 1.createConnection 使用时需要对连接的创建.断开进行管理 2. ...

  3. 在新的电脑上的Git本地库 与远程库关联前的一些设置

    由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置: 第1步:创建SSH Key.在用户主目录下(user/...),看看有没有.ssh目录,如果有,再看看这个目 ...

  4. 【洛谷5008】逛庭院(Tarjan,贪心)

    [洛谷5008]逛庭院(Tarjan,贪心) 题面 洛谷 题解 如果图是一个\(DAG\),我们可以任意选择若干个不是入度为\(0\)的点,然后把它们按照拓扑序倒序删掉,不难证明这样一定是合法的. 现 ...

  5. 易优CMS:关于assign你知道多少

    [基础用法] 名称:assign 功能:模板文件中定义变量,可在其他标签里使用该变量 语法: {eyou:assign name='typeid' value='5' /} 文件: 无 参数: nam ...

  6. Taro多端自定义导航栏Navbar+Tabbar实例

    运用Taro实现多端导航栏/tabbar实例 (H5 + 小程序 + React Native) 最近一直在捣鼓taro开发,虽说官网介绍支持编译到多端,但是网上大多数实例都是H5.小程序,很少有支持 ...

  7. andriod8.1.0源码编译中的一个坑-package com.sun.javadoc does not exist

    这里记录编译过程中的一个坑!!! 编译过程中出现了下面的报错 external/doclava/src/com/google/doclava/ClassInfo.java:20: error: pac ...

  8. netcore之RabbitMQ入门

    简介 RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息中间件,基于Erlang语言编写. AMQP是什么 AMQP 0-9-1(高级消息队列协议)是一种消息传递协议,它允许一致的客户端应 ...

  9. rabbitmq pika(python)订阅发布多客户端消费场景简单使用

    发布端: import pika import time credentials = pika.credentials.PlainCredentials('root', 'root',erase_on ...

  10. [Go] golang实时监控日志文件的包tail

    在linux中有一个tail命令,tail -f可以实时的监控文件新增加的内容,如果用代码实现这个逻辑,可以下载使用这个包go get github.com/hpcloud/tail/... 测试代码 ...