oracle存储过程

本文详细介绍了存储过程的概念及其在数据库中的应用。包括存储过程的两种类型、何时使用存储过程以提高应用程序性能、存储过程的参数类型及ORACLE存储过程的基本语法等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、什么是存储过程
存储过程是数据库服务器端的一段程序,它有两种类型。一种类似于SELECT查询,用于检索数据,检索到的数据能够以数据集的形式返回给客户。另一种类似于INSERT或DELETE查询,它不返回数据,只是执行一个动作。有的服务器允许同一个存储过程既可以返回数据又可以执行动作。

2、什么时候需要用存储过程
如果服务器定义了存储过程,应当根据需要决定是否要用存储过程。存储过程通常是一些经常要执行的任务,这些任务往往是针对大量的记录而进行的。在服务器上执行存储过程,可以改善应用程序的性能。这是因为:
[list]
[*]服务器往往具有强大的计算能力和速度。
[*]避免把大量的数据下载到客户端,减少网络上的传输量。例如,假设一个应用程序需要计算一个数据,这个数据需要涉及到许多记录。如果不使用存储过程的话,把这些数据下载到客户端,导致网络上的流量剧增。不仅如此,客户端可能是一台老掉牙的计算机,它的运算速度很慢。而改用存储过程后,服务器会很快地把数据计算出来,并且只需传递一个数据给客户端,其效率之高是非常明显的。[/list]
 
3、存储过程的参数
  要执行服务器上的存储过程,往往要传递一些参数。这些参数分为四种类型:
  第一种称为输入参数,由客户程序向存储过程传递值。
  第二种称为输出参数,由存储过程向客户程序返回结果。
  第三种称为输入/输出参数,既可以由客户程序向存储过程传递值,也可以由存储过程向客户程序返回结果。
  第四种称为状态参数,由存储过程向客户程序返回错误信息。
  要说明的是,并不是所有的服务器都支持上述四种类型的参数,例如,InterBase就不支持状态参数。

4、ORACLE存储过程的基本语法
[u][color=blue]基本结构[/color][/u]
CREATE OR REPLACE PROCEDURE 存储过程名字
(
参数1 IN NUMBER,
参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN
END 存储过程名字

[u][color=blue]SELECT INTO STATEMENT[/color][/u]
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
BEGIN
SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
EXCEPTION
WHEN NO_DATA_FOUND THEN
xxxx;
END;

[u][color=blue]无返回值的存储过程[/color][/u]
CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS
BEGIN
INSERT INTO HYQ.B_ID (I_ID,I_NAME) S (PARA1, PARA2);
END TESTA;


5、实例代码(java调用存储过程)

package procedure;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.orm.hibernate3.SessionFactoryUtils;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/**
*
* <pre>
* Title:在hibernate中用存储过程
* 只是要绕过hibernate 调用jdbc API,当然事务还是由hibernate业管理:
* 假如我们创建了以下存储过程:
* create or replace procedure batchUpdateCustomer(p_age in number) as
* begin
* update CUSTOMERS set AGE=AGE+1 where AGE> p_age;
* end;
*
*
* 存储过程中有一个参数p_age,代表客户的年龄,应用程序可按照以下方式调用存储过程:
* Description: 程序功能的描述
* </pre>
*
* @author lichunmei licm@sagessesoft.com
* @version 1.00.00
*
* <pre>
* 修改记录
* 修改后版本: 修改人: 修改日期: 修改内容:
* </pre>
*/
public class Text extends HibernateDaoSupport {
public void proceduce() {

try {
DataSource ds = SessionFactoryUtils
.getDataSource(getSessionFactory());
Connection conn = ds.getConnection();
String sql = "{call batchUpdateCustomer(?)}";
CallableStatement cstmt = conn.prepareCall(sql);
cstmt.setInt(1, 0);// 把年龄参数设置为0;
cstmt.executeUpdate();

// ResultSet rs = cstmt.executeQuery(sql);若是查询的时候
conn.commit();
// rs.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值