一、为什么要用存储过程?

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

二、过程的优点?

1、预编译:存储过程预先编译好放在数据库内,减少编译语句所花的时间。

2、缓存:预编译的存储过程会进入缓存,所以对于经常执行的存储过程,除了第一次执行外,其它次数的执行速度会明显提高。

3、减少网络传输:特别是对于一些处理数据的存储过程,不必像直接使用SQL语句那样多次传送数据到客户端。

4 、可维护性高:更新存储过程通常要比更改、测试和部署应用程序需要的时间和精力要少。

5、代码的重用:一个可以重用的存储过程可以应用到应用程序的多个位置。

6、增强安全性:通过对用户授权对存储过程的访问权限,它们可以提供对特定数据的访问;提高数据安全性,来防止SQL注入。

三、缺点:

1、如果需要对存储过程的输入输出参数做更改的话,还要更改程序。

2、可移植性差:因为存储过程将应用程序的业务处理绑定到数据库中,以此使用存储过程来处理业务逻辑限制了应用程序的可移植性。

四、创建存储过程

 --1、简单的存储过程
create or replace procedure procedure_test
(p_id in varchar,p_status out varchar) --p_id为输入参数 ,p_status为输出参数
as
t_name varchar2(20);
t_count number:=0;
begin
select votetitle,vatesum into t_name,t_count from votemaster where id=p_id; --注意:此处没有:来赋值
if t_count <=0 then
p_status:= t_name||':差';
elsif t_count >0 and t_count <3 then
p_status:= t_name||':良好';
else
p_status:= t_name||':优秀';
end if;
end;
--执行
declare
out_param varchar2(50);
begin
procedure_test('',out_param);
dbms_output.put_line(out_param);
end; --2、带游标的存储过程
create or replace procedure procedure_cursor_test
(p_id in varchar2,p_status out varchar2)
as
vote votemaster%rowtype; --声明一个对象(votemaster)类型的对象
cursor my_cur is select * from votemaster; --声明一个游标并填充数据
begin
open my_cur; --打开游标
loop
fetch my_cur into vote ; --循环游标,并放入对象
exit when my_cur%notfound; --如果没有数据,则直接exit
if vote.id=p_id then
p_status := vote.votetitle||':'||vote.vatesum;
--如果想终止循环,可以直接exit;
end if;
end loop;
close my_cur; --关闭游标
end;
--执行
declare
out_param varchar2(50);
begin
procedure_cursor_test('',out_param);
dbms_output.put_line(out_param);
end;

五、程序包

1、程序包:包是一组相关过程、函数、变量、游标、常量等PL/SQL程序设计元素的组合。它具有面向对象程序设计语言的特点,是对这些PL/SQL程序设计元素的封装。包类似于C++或Java程序中的类,而变量相当于类中的成员变量,过程和函数相当于方法,把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。与类相同,包中的程序元素也分为公用元素和私有元素两种,这两种元素的区别是他们允许访问的程序范围不同,即他们的作用域不同。公用元素不仅可以被包中的函数、过程调用,也可以被包外的PL/SQl块调用。而私有元素只能被该包内部的函数或过程调用。

2、使用程序包的优点:在PL/SQL设计中,使用包不仅可以使程序模块化,对外隐藏包内所使用的信息,而写程序包可以提高程序的运行效率。因为,当程序首次调用程序包内部的函数或过程时,Oracle将整个程序包调入内存,当再次调用程序包中的元素时,Oracle直接从内存中读取,而不需要进行磁盘的IO操作,从而使程序的执行效率提高。

3、一个程序包分为两部分组成:

(1)、包定义:包定义部分声明包内数据类型、变量、常量、游标、子程序和函数等元素,这些元素为包的共有元素。

(2)、包主体:包主题则定义了包定义部分的具体实现,在包主体中还可以声明和实现私有元素。

 --包定义
create or replace package t_package
is
--定义过程
procedure append_proc(t varchar2,a out varchar2);
--过程的重载
procedure append_proc(t number,a out varchar2);
--定义函数
function append_fun(t varchar2) return varchar2; end;
 --包主题
create or replace package body t_package
is
v_t varchar2(30);
--私有成员函数
function private_fun(t varchar2) return varchar2 is
begin
v_t := t||'hello';
return v_t;
end;
--实现过程
procedure append_proc(t varchar2,a out varchar2) is
begin
a := t||'hello';
end;
--过程的重载
procedure append_proc(t number,a out varchar2) is
begin
a := t||'hello';
end;
--实现函数
function append_fun(t varchar2)
return varchar2 is
begin
v_t := t||'hello';
return v_t;
end;
end;

http://zxf-noimp.iteye.com/blog/1145442

  1. CREATE OR REPLACE PROCEDURE testp(p_value IN VARCHAR2)
  2. IS
  3. TYPE ref_cursor_type IS REF CURSOR; --定义一个动态游标
  4. users ref_cursor_type;   --定义游标类型
  5. user Users%ROWTYPE; --定义变量类型
  6. vSql VARCHAR2(255);
  7. BEGIN
  8. vSql := 'select * from Users'; --要查询的sql字符串,可拼接起来
  9. OPEN users FOR vSql;  --打开游标
  10. LOOP
  11. FETCH users INTO users; --循环遍历users列表给user,user为临时对象
  12. exit when bills%notfound;
  13. -- user相当于表对象可以直接拿来用
  14. --比如要打印user对象里面的name
  15. dbms_outpt.put_line(user.name);
  16. end loop;
  17. CLOSE bills;
  18. END;
 CREATE OR REPLACE PROCEDURE PRODUCT_TEMP_UPDATE_PRC AS  --第1行表示创建存储过程,名称为PRODUCT_TEMP_UPDATE_PRC 。
PC_DELESTR VARCHAR2(50); --删除临时表记录语句 第2~7行表示声明变量。
PC_CREATESTR VARCHAR2(500); --创建临时表
TABEXT VARCHAR2(10); --用于判断临时表是否存在中间变量 CUR_CTGY PRODUCTINFO.CATEGORY%TYPE;
CUR_PRTIFO PRODUCTINFO%ROWTYPE;
--第9~11行表示创建游标cur_category;
CURSOR CUR_CATEGORY --产品表中的 产品类型 游标
IS
SELECT CATEGORY FROM PRODUCTINFO GROUP BY CATEGORY;
--第13~19行表示创建游标CUR_PROINFO;该游标带有参数,其参数代表产品类型的编码。游标根据产品的类型不同,获取产品类型中价格最低的数据。
CURSOR CUR_PROINFO(CTGY VARCHAR) IS
SELECT *
FROM (SELECT *
FROM PRODUCTINFO
WHERE CATEGORY = CTGY
ORDER BY PRODUCTPRICE ASC)
WHERE ROWNUM < 2; BEGIN
SELECT COUNT(1)--第22~25表示判断临时表productinfo_tmp是否存在。此处利用select into语句把结果放到变量tabext中,如果该表存在结果为1,否则为0.tabext变量将在第37行使用。
INTO TABEXT
FROM ALL_TABLES
WHERE TABLE_NAME = 'productinfo_tmp'; PC_DELESTR := 'delete from productinfo_tmp';
PC_CREATESTR := 'create global temporary table productinfo_tmp
(productid varchar2(10) not null,
productname varchar2 (20),
productprice number(8,2),
quantity number(10),
category varchar2(10),
desperaction varchar2(1000),
origin varchar2(10))on commit preserve rows';
--第37~44行完成分析步骤中的第一步:创建临时表productinfo_tmp。首先判断临时表是否存在,如果不存在,则创建,如果存在则删除表中数据。这里使用了execute immediate语句,利用它执行DDL语句及动态语句。
IF TABEXT = 0 THEN
--不存在临时表就创建一个
EXECUTE IMMEDIATE PC_CREATESTR;
DBMS_OUTPUT.PUT_LINE('创建临时表成功!');
ELSE
EXECUTE IMMEDIATE PC_DELESTR;
DBMS_OUTPUT.PUT_LINE('删除记录完成!');
END IF;
OPEN CUR_CATEGORY;--第45~49行表示打开游标cur_category(产品类型 游标),并进入流循环取值。当游标的%nofound属性为true时退出。
LOOP
FETCH CUR_CATEGORY
INTO CUR_CTGY;
EXIT WHEN CUR_CATEGORY%NOTFOUND;
OPEN CUR_PROINFO(CUR_CTGY);--第50~53行表示打开游标cur_proinfo,它的参数是cur_category中的结果。
FETCH CUR_PROINFO
INTO CUR_PRTIFO;
IF CUR_PROINFO%FOUND THEN
IF CUR_PRTIFO.PRODUCTPRICE < 20 THEN--第54~58行表示判断价格是否低于20,如果低于20输出到屏幕。
---产品价格低于20
DBMS_OUTPUT.PUT_LINE('产品ID' || CUR_PRTIFO.PRODUCTID || '产品名称' ||
CUR_PRTIFO.PRODUCTNAME || '产品价格' ||
CUR_PRTIFO.PRODUCTPRICE);
ELSE
--非低于20价格的产品输入到临时表productinfo_tmp 第60~69行表示如果非低于20的插入表productinfo_tmp中。
EXECUTE IMMEDIATE 'insert into productinfo_tmp(
productid,productname,productprice,quantity,category,desperaction,origin) values
(''' || CUR_PRTIFO.PRODUCTID || ''',''' ||
CUR_PRTIFO.PRODUCTNAME || ''',''' ||
CUR_PRTIFO.PRODUCTPRICE || ''',''' ||
CUR_PRTIFO.QUANTITY || ''',''' ||
CUR_PRTIFO.CATEGORY || ''',''' ||
CUR_PRTIFO.DESPERACTION || ''',''' ||
CUR_PRTIFO.ORIGIN || ''')';
END IF;
END IF;
CLOSE CUR_PROINFO;
END LOOP;
COMMIT;
CLOSE CUR_CATEGORY;
EXECUTE IMMEDIATE 'update productinfo_tmp set desperaction = ''热销产品''';--第76行表示将productinfo_tmp表中的数据修改为热销产品。
END;

【执行】

SQL>exec PRODUCT_TEMP_UPDATE_PRC ;

转自:http://www.cnblogs.com/Rainbow-G/articles/4301131.html

oracle 存储过程 包 【转】的更多相关文章

  1. Oracle 存储过程包(Package、Package Body)

    初出茅庐,不知原来存储过程还可以写得如此复杂,而且还竟然可以调试! 好吧,得整理一下存储过程的一些语法,以备以后用到时可以查阅. 使用数据库:Oracle 数据库工具:PL/SQL Developer ...

  2. Oracle 存储过程包

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

  3. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

  4. Oracle 存储过程学习

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

  5. Oracle 存储过程异常处理

    Oracle 存储过程异常处理 1.异常的优点    如果没有异常,在程序中,应当检查每个命令的成功还是失败,如  BEGIN  SELECT ...  -- check for ’no data f ...

  6. (转)oracle 存储过程 带游标作为OUT参数输出

    (转)oracle 存储过程 带游标作为OUT参数输出 存储过程返回OUT参数的游标 例子. 包中带过程 要自己定义一个type [cur_name] is ref cursor游标,返回的时候就直接 ...

  7. Oracle存储过程中异步调用的实际操作步骤

    本文标签:Oracle存储过程 我们都知道在Oracle数据库的实际应用的过程中,我们经常把相关的业务处理逻辑,放在Oracle存储过程中,客户端以通过ADO来进行相关的调用  .而有些相关的业务逻辑 ...

  8. oracle存储过程实例

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

  9. oracle存储过程分页

    1.首先在oracle中建包体,用于游标返回当前数据记录集 CREATE OR REPLACE PACKAGE pkg_query AS TYPE cur_query IS REF CURSOR; E ...

随机推荐

  1. xgboost原理及应用

    1.背景 关于xgboost的原理网络上的资源很少,大多数还停留在应用层面,本文通过学习陈天奇博士的PPT 地址和xgboost导读和实战 地址,希望对xgboost原理进行深入理解. 2.xgboo ...

  2. Activity has leaked window that was originally added

    错误: E/WindowManager: android.view.WindowLeaked: Activity com.x.x.x has leaked window com.android.int ...

  3. 5.openssl dgst

    该伪命令用于生成文件的信息摘要,也可以进行数字签名,验证数字签名. 首先要明白,要进行数字签名,需要计算出特征码即数字摘要,然后使用私钥对数字摘要进行签名.特征码使用md5,sha等计算出. 对象只能 ...

  4. iOS常用第三方框架大全

    常用第三方 今天就给大家总结一下,我们在项目中用到最多的第三方,免去了大家花时间去搜索,在这里大家进行了全面的总结. 1. 编程框架 1:基于响应式编程思想的oc 地址:https://github. ...

  5. 用R实现全排列的分类

    R 其实是个很好用的东东哦-最近写了个小函数,可以实现全排列数的枚举,代码如下: permut<-function(seq){     seq_len=length(seq);     if(s ...

  6. Struts2,Spring, Hibernate三大框架SSH的整合步骤

    整合步骤 创建web工程 引入相应的jar包 整合spring和hibernate框架 编写实体类pojo和hbm.xml文件 编写bean-base.xml文件 <!-- 1) 连接池实例 - ...

  7. java生成带logo的二维码,自定义大小,logo路径取服务器端

    package com.qishunet.eaehweb.util; import java.awt.BasicStroke; import java.awt.Graphics; import jav ...

  8. 触摸屏测试:Tslib

    触摸屏测试:Tslib(配置了一天,心累) 总结:网上有许多关于tslib的步骤/错误总结,所以这里只是提几个我觉得比较棘手的问题: 1,我明明给arm-linux-gcc配置了环境变量,为什么还是提 ...

  9. vs快捷方式

    项目相关的快捷键 Ctrl + Shift + B = 生成项目 Ctrl + Alt + L = 显示Solution Explorer(解决方案资源管理器) Shift + Alt+ C = 添加 ...

  10. HotSpot虚拟机对象介绍

    1.对象的创建 Java是一门面向对象语言,在运行过程中无时不刻不在创建对象.从语言层面,创建对象仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象仅限于普通java对象,不包含数组和Cl ...