`

oracle存储过程示例

阅读更多

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 存储过程示例

    oracle的一个简单存储过程实例

    Oracle存储过程是数据库管理系统中的一种重要特性,它允许开发者编写包含一系列SQL语句和PL/SQL块的可重用代码段。在这个“Oracle的一个简单存储过程实例”中,我们可以看到如何在Oracle环境中创建、调用和管理存储...

    java调用oracle存储过程示例+分页示例

    ### Java调用Oracle存储过程与分页示例详解 #### 一、无返回值的存储过程调用 在Java中调用Oracle存储过程时,若该过程无返回值,主要利用`CallableStatement`对象来执行。以下是一个具体的示例: ##### 存储过程...

    oracle存储过程学习经典(实例)

    Oracle存储过程是数据库管理系统Oracle中的一个重要特性,它允许开发者编写一系列的SQL和PL/SQL语句,形成一个可重用的代码块。这个"Oracle存储过程学习经典(实例)"资源显然是为初学者设计的,旨在帮助他们掌握如何...

    Python使用cx_Oracle调用Oracle存储过程的方法示例

    本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法。分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL。 首先,在数据库端创建简单的存储过程。 create or replace ...

    oracle存储过程解锁

    以下是对“oracle存储过程解锁”这一主题的深入解析。 ### 标题:“oracle存储过程解锁” #### 解析: 在Oracle数据库中,存储过程是一种预先编译并存储在数据库中的SQL代码块,用于执行复杂的业务逻辑或数据处理...

    oracle存储过程写法

    根据提供的Oracle存储过程示例,我们可以详细解析其中的关键知识点,包括存储过程的创建、游标的使用、临时表的创建及数据处理等。 ### 存储过程的创建与使用 存储过程是在数据库中编写的SQL代码块,它可以接受...

    oracle存储过程-帮助文档

    `oracle procedure.chm`是一个帮助文件,通常包含详细的参考信息、示例和教程,供用户学习和查询Oracle存储过程的用法。CHM(Compiled HTML Help)格式是一种微软提供的离线帮助文档格式,用户可以通过搜索和导航来...

    oracle 存储过程 函数 dblink

    ### Oracle存储过程、函数与DBLink详解 #### 一、Oracle存储过程简介 在Oracle数据库中,存储过程是一种预编译好的SQL代码集合,它可以接受输入参数、返回单个值或多个值,并能够执行复杂的数据库操作。存储过程...

    hibernate query调用oracle存储过程

    以下是一个简单的示例,展示了如何调用一个不带参数的Oracle存储过程: ```java Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); session....

    用callabledStatement调用oracle存储过程实用例子(IN OUT 传游标)

    本示例展示了如何使用 CallabledStatement 来调用 Oracle 存储过程,并实现 IN OUT 参数和游标类型参数的使用。这种方法可以提高应用程序的性能和安全性。同时,游标类型参数的使用可以实现数据的批量处理,提高应用...

    ORACLE存储过程最全教程

    Oracle存储过程是数据库管理系统Oracle中的一个关键特性,它允许开发者编写一组预编译的SQL和PL/SQL语句,以实现特定的...教程中的20篇文档将覆盖这些知识点的详细解释和示例,帮助你逐步成为Oracle存储过程的专家。

    Oracle存储过程返回结果集

    在Oracle存储过程中,`IN`参数用于传递数据到过程,`OUT`参数则允许过程向调用者返回数据。而`SYS_REFCURSOR`是Oracle提供的一种特殊类型,它允许存储过程动态地打开一个游标(即结果集)并将其作为`OUT`参数返回。 ...

    oracle 存储过程批量提交

    ### Oracle存储过程批量提交知识点详解 在Oracle数据库中,存储过程是一种重要的数据库对象,它可以包含一系列SQL语句和控制流语句,用于实现复杂的业务逻辑处理。存储过程不仅可以提高应用程序性能,还可以确保...

    springboot整合mybatis调用oracle存储过程

    本文将深入探讨如何在Spring Boot项目中整合MyBatis,实现调用Oracle存储过程并处理游标返回的数据。 首先,我们需要在Spring Boot项目中引入相关的依赖。在`pom.xml`文件中添加Oracle JDBC驱动(ojdbc66-oracle...

    润乾报表调用oracle存储过程案例说明

    在实际的业务场景中,有时我们需要调用数据库中的存储过程来获取或处理数据,本篇将详细介绍如何在润乾报表中调用Oracle存储过程。 首先,我们要在Oracle数据库中创建存储过程。以下是一个简单的存储过程示例,名为...

    oracle 事务 回滚 存储过程

    ### Oracle存储过程 存储过程是在数据库中预编译的一组SQL语句,用于执行复杂的业务逻辑或数据操作。它们可以接受输入参数,执行一系列数据库操作,并返回结果。在Oracle中,存储过程使用PL/SQL编写,可以在数据库...

    Oracle存储过程基本语法及示例

    ### Oracle存储过程基本语法及示例 在Oracle数据库中,存储过程是一种强大的工具,用于封装一组SQL语句或PL/SQL代码块,以便在数据库服务器上执行特定的任务。存储过程可以提高应用程序性能、确保数据完整性并简化...

Global site tag (gtag.js) - Google Analytics