Plsql下存储过程的游标使用
希望能对大家有帮助吧。
create or replace package loss is
type temp_cur is ref cursor ;
TYPE indexByTab IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER ;
procedure loss_proc(chr_PolicyNo in VARCHAR2, --** 保单号
num_DangerNo in NUMBER, --** 危险单位序号,默认1
DamageDate in date, --** 出险时间
chr_Currency in VARCHAR2, --** 赔付币种
num_SumClaim in NUMBER, --** 总估损金额
chr_BlnLargeLoss out VARCHAR2, --** 是否重大赔案:0,否;1,是
chr_BlnCashLoss out VARCHAR2 --** 是否现金赔款:0,否;1,是
);
end loss;
create or replace package body loss is
procedure loss_proc(chr_PolicyNo in VARCHAR2, --** 保单号
num_DangerNo in NUMBER, --** 危险单位序号,默认1
DamageDate in date, --** 出险时间
chr_Currency in VARCHAR2, --** 赔付币种
num_SumClaim in NUMBER, --** 总估损金额
chr_BlnLargeLoss out VARCHAR2, --** 是否重大赔案:0,否;1,是
chr_BlnCashLoss out VARCHAR2 --** 是否现金赔款:0,否;1,是
) is
cur_trail temp_cur;
chr_treatyno indexByTab;
num_ClaimShare indexByTab;
chr_ControlFlag varchar2(1);
chr_largelossflag varchar2(1);
chr_cashlossflag varchar2(1);
num_LargeLossValue number(14,2);
n_cnt number(4):=1;
begin
--根据保单号取得合约号以及其所占金额
chr_BlnLargeLoss:='0';
chr_BlnCashLoss:='0';
if not cur_trail%isopen then
open cur_trail for
select treatyno,
round(sharerate*num_SumClaim,2)
from prpCreinsTrial
where policyno = chr_PolicyNo
and dangerno = num_DangerNo
and substr(reinsmode,0,1) = 2;
end if;
--根据合约号取得其
--largelossflag(整个危险或是本公司所占份额估损标记)
--ControlFlag(共同理赔,理赔控制)
--for i in 1..fetch_status loop
loop
fetch cur_trail into
chr_treatyno(n_cnt),
num_ClaimShare(n_cnt);
--当游标指向未尾时自动退出游标
exit when(cur_trail%notfound);
select controlflag,
largelossflag,
cashlossflag,
LargeLossValue
into chr_ControlFlag,
chr_largelossflag,
chr_cashlossflag,
num_LargeLossValue
from fhtreaty
where treatyno = chr_treatyno(n_cnt);
--判断是否属于重大赔案
if chr_ControlFlag = '1' and chr_BlnLargeLoss = '0' then
if chr_largelossflag = '1'and num_ClaimShare(n_cnt) >= num_LargeLossValue then
chr_BlnLargeLoss:= '1';
end if;
else if chr_largelossflag = '0' and num_SumClaim >= num_LargeLossValue then
chr_BlnLargeLoss:= '1';
end if;
end if;
--现金赔款决断
if chr_BlnCashLoss = '0' then
if chr_cashlossflag = '1' and num_ClaimShare(n_cnt) >= num_LargeLossValue then
chr_BlnCashLoss:= '1';
end if;
else if chr_cashlossflag = '0' and num_SumClaim >= num_LargeLossValue then
chr_BlnCashLoss:= '1';
end if;
end if;
n_cnt:=n_cnt+1;
end loop;
--关闭游标
if cur_trail%isopen then
close cur_trail;
end if;
end loss_proc;
end loss;
以上是包头部分和包体部分,另外,我写了个测试程序,出贴出来吧。
package com.sinosoft.reins.exam.action;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import oracle.jdbc.OracleTypes;
import oracle.jdbc.driver.OracleCallableStatement;
import oracle.jdbc.driver.OracleDriver;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import com.sinosoft.reins.exam.Dto.OracleRe_absDto;
import com.sinosoft.reins.exam.Dto.OracleRe_paraDto;
import com.sinosoft.sysframework.web.control.BaseProcessAction;
public class Loss extends BaseProcessAction {
/**
* 调用存储过程的action,仅作为示范,应该放在bl层
* @param request http请求
* @throws Exception
*/
// public void referenceOraclePackage(HttpServletRequest request,
// HttpServletResponse response) throws Exception {
public static void main(String[] args){
try{
OracleDriver oracleDriver = new oracle.jdbc.OracleDriver();
DriverManager.registerDriver(oracleDriver);
String url="jdbc:oracle:thin^^^^^^^^;
String user="*";
String password="*";
Connection ocacleconn= DriverManager.getConnection(url,user,password);
String query = "{call loss.loss_proc(?,?,?,?,?,?,?)}";
System.out.println("==========ocacleconn的类型:============"+ocacleconn.getClass().getName()) ;
//必须用OracleCallableStatement类型才能提供比JDBC API更多的方法,以支持复杂数据结构的传递
OracleCallableStatement cstmt = (OracleCallableStatement)ocacleconn.prepareCall(query);
//设定入参类型 OracleTypes.STRUCT对应OBJECT类型;OracleTypes.ARRAY对应TABLE类型
String policyno = "1002005132006000019";
String dangerno = "1";
java.sql.Date damagedate =java.sql.Date.valueOf("2006-07-26") ;
String currency = "CNY";
String sumnopaid = "1000000000000";
String largelossflag = "0";
String cashlossflag = "0";
cstmt.setObject(1,policyno,OracleTypes.VARCHAR);
cstmt.setObject(2,dangerno,OracleTypes.VARCHAR);
cstmt.setObject(3,damagedate,OracleTypes.DATE);
cstmt.setObject(4,currency,OracleTypes.VARCHAR);
cstmt.setObject(5,sumnopaid,OracleTypes.VARCHAR);
//设定返参类型 IndexTableOutParameter对应索引表类型;OracleTypes.CURSOR对应TABLE的游标
cstmt.registerOutParameter(6,OracleTypes.VARCHAR);
cstmt.registerOutParameter(7,OracleTypes.VARCHAR);
//执行存储过程
cstmt.execute();
String largeloss = (String)cstmt.getString(6);
String cashloss = (String)cstmt.getString(7);
System.out.println("返回参数largeloss is :"+largeloss);
System.out.println("cashloss is :"+cashloss);
//以下过程是为了控制台显示
cstmt.close();
}
catch (Throwable ex){
ex.printStackTrace();
}
}
分享到:
相关推荐
oracle 存储过程示例oracle 存储过程示例oracle 存储过程示例oracle 存储过程示例oracle 存储过程示例oracle 存储过程示例oracle 存储过程示例oracle 存储过程示例
Oracle存储过程是数据库管理系统中的一种重要特性,它允许开发者编写包含一系列SQL语句和PL/SQL块的可重用代码段。在这个“Oracle的一个简单存储过程实例”中,我们可以看到如何在Oracle环境中创建、调用和管理存储...
### Java调用Oracle存储过程与分页示例详解 #### 一、无返回值的存储过程调用 在Java中调用Oracle存储过程时,若该过程无返回值,主要利用`CallableStatement`对象来执行。以下是一个具体的示例: ##### 存储过程...
Oracle存储过程是数据库管理系统Oracle中的一个重要特性,它允许开发者编写一系列的SQL和PL/SQL语句,形成一个可重用的代码块。这个"Oracle存储过程学习经典(实例)"资源显然是为初学者设计的,旨在帮助他们掌握如何...
本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法。分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL。 首先,在数据库端创建简单的存储过程。 create or replace ...
以下是对“oracle存储过程解锁”这一主题的深入解析。 ### 标题:“oracle存储过程解锁” #### 解析: 在Oracle数据库中,存储过程是一种预先编译并存储在数据库中的SQL代码块,用于执行复杂的业务逻辑或数据处理...
根据提供的Oracle存储过程示例,我们可以详细解析其中的关键知识点,包括存储过程的创建、游标的使用、临时表的创建及数据处理等。 ### 存储过程的创建与使用 存储过程是在数据库中编写的SQL代码块,它可以接受...
`oracle procedure.chm`是一个帮助文件,通常包含详细的参考信息、示例和教程,供用户学习和查询Oracle存储过程的用法。CHM(Compiled HTML Help)格式是一种微软提供的离线帮助文档格式,用户可以通过搜索和导航来...
### Oracle存储过程、函数与DBLink详解 #### 一、Oracle存储过程简介 在Oracle数据库中,存储过程是一种预编译好的SQL代码集合,它可以接受输入参数、返回单个值或多个值,并能够执行复杂的数据库操作。存储过程...
以下是一个简单的示例,展示了如何调用一个不带参数的Oracle存储过程: ```java Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); session....
本示例展示了如何使用 CallabledStatement 来调用 Oracle 存储过程,并实现 IN OUT 参数和游标类型参数的使用。这种方法可以提高应用程序的性能和安全性。同时,游标类型参数的使用可以实现数据的批量处理,提高应用...
Oracle存储过程是数据库管理系统Oracle中的一个关键特性,它允许开发者编写一组预编译的SQL和PL/SQL语句,以实现特定的...教程中的20篇文档将覆盖这些知识点的详细解释和示例,帮助你逐步成为Oracle存储过程的专家。
在Oracle存储过程中,`IN`参数用于传递数据到过程,`OUT`参数则允许过程向调用者返回数据。而`SYS_REFCURSOR`是Oracle提供的一种特殊类型,它允许存储过程动态地打开一个游标(即结果集)并将其作为`OUT`参数返回。 ...
### Oracle存储过程批量提交知识点详解 在Oracle数据库中,存储过程是一种重要的数据库对象,它可以包含一系列SQL语句和控制流语句,用于实现复杂的业务逻辑处理。存储过程不仅可以提高应用程序性能,还可以确保...
本文将深入探讨如何在Spring Boot项目中整合MyBatis,实现调用Oracle存储过程并处理游标返回的数据。 首先,我们需要在Spring Boot项目中引入相关的依赖。在`pom.xml`文件中添加Oracle JDBC驱动(ojdbc66-oracle...
在实际的业务场景中,有时我们需要调用数据库中的存储过程来获取或处理数据,本篇将详细介绍如何在润乾报表中调用Oracle存储过程。 首先,我们要在Oracle数据库中创建存储过程。以下是一个简单的存储过程示例,名为...
### Oracle存储过程 存储过程是在数据库中预编译的一组SQL语句,用于执行复杂的业务逻辑或数据操作。它们可以接受输入参数,执行一系列数据库操作,并返回结果。在Oracle中,存储过程使用PL/SQL编写,可以在数据库...
### Oracle存储过程基本语法及示例 在Oracle数据库中,存储过程是一种强大的工具,用于封装一组SQL语句或PL/SQL代码块,以便在数据库服务器上执行特定的任务。存储过程可以提高应用程序性能、确保数据完整性并简化...