CREATE OR REPLACE PACKAGE PY_PCKG_REFUND2 AS
------------------------------------------------------------------------
-- Oracle 包
-- 游标定义:
--
-- 存储过程定义:
-- PY_WEBREFUND_VISA_PREPARE : VISA退款准备
-- 最后修改人:dougq
-- 最后修改日期:2010.4.15
------------------------------------------------------------------------
PROCEDURE PY_WEBREFUND_VISA_PREPARE (
in_serialNoStr IN VARCHAR2, --用"|"隔开的一组网上退款申请流水号
in_session_operatorid IN VARCHAR2, --业务操作员
out_return_code OUT VARCHAR2, --存储过程返回码
out_visaInfoStr OUT VARCHAR2
);
END PY_PCKG_REFUND2;
/
CREATE OR REPLACE PACKAGE BODY PY_PCKG_REFUND2 AS
PROCEDURE PY_WEBREFUND_VISA_PREPARE (
in_serialNoStr IN VARCHAR2, --用"|"隔开的一组网上退款申请流水号
in_session_operatorid IN VARCHAR2,--业务操作员
out_return_code OUT VARCHAR2, --存储过程返回码
out_visaInfoStr OUT VARCHAR2
) IS
--变量声明
v_serialno VARCHAR2(20);--网上退款申请流水号
v_refserialno VARCHAR2(20);--支付交易流水号
v_tobankOrderNo VARCHAR2(30);--上送银行的订单号
v_orderDate VARCHAR2(8);--订单日期
v_businessType VARCHAR2(10);--业务类型
v_currType VARCHAR2(3);--订单类型(ET-电子机票)
v_merno VARCHAR2(15);--商户号
v_orderNo VARCHAR2(20);--商户订单号
v_orderState VARCHAR2(2);
v_refAmount NUMBER(15,2);--退款金额
v_tranType VARCHAR(2);--交易类型
v_bank VARCHAR2(10);--收单银行
v_date VARCHAR2 (8);--交易日期
v_time VARCHAR2 (6);--交易时间
v_datetime VARCHAR2 (14);--获取的系统时间
v_index_start NUMBER;
v_index_end NUMBER;
v_i NUMBER;
BEGIN
-- 初始化参数
out_visaInfoStr := '';
v_i := 1;
v_index_start := 1;
v_index_end := INSTR(in_serialNoStr,'|',1,1);
v_refserialno := SUBSTR(in_serialNoStr, v_index_start, v_index_end-1);
v_datetime := TO_CHAR (SYSDATE, 'yyyymmddhh24miss');
v_date := SUBSTR (v_datetime, 1, 8);
v_time := SUBSTR (v_datetime, 9, 14);
--从退款请求表中查询定单信息(商户号、商户订单号、退款金额)
WHILE v_index_end > 0 LOOP
SELECT
WEBR_MERNO,
WEBR_ORDERNO,
WEBR_AMOUNT,
WEBR_SERIALNO,
WEBR_REFUNDTYPE
INTO
v_merno,
v_orderNo,
v_refAmount,
v_serialno,
v_tranType
FROM
PY_WEB_REFUND
WHERE
WEBR_REFREQNO = v_refserialno;
--将查询到的数据组成串
out_visaInfoStr := out_visaInfoStr || v_merno || '~' || v_orderNo || '~' || v_refAmount + '|';
--为下次循环做数据准备
v_i := v_i + 1;
v_index_start := v_index_end + 1;
v_index_end := INSTR(in_serialNoStr,'|',1,v_i);
IF v_index_end > 0 THEN
v_refserialno := SUBSTR(in_serialNoStr, v_index_start, v_index_end - 1);
END IF;
--根据原支付流水号在流水表中查询该订单的信息,包括原上送银行或第三方的订单号:WTRN_TOBANKORDERNO
SELECT
WTRN_TOBANKORDERNO,
WTRN_ORDERNO,
WTRN_ORDERDATE,
WTRN_BUSINESSTYPE,
WTRN_ACCPBANK,
WTRN_TRANCURRTYPE
INTO
v_tobankOrderNo,
v_orderNo,
v_orderDate,
v_businessType,
v_bank,
v_currType
FROM PY_WEBPAY_VIEW
WHERE WTRN_SERIALNO = v_serialno;
--记录流水表(退款)
INSERT INTO PY_WEBPAY_TRAN(
WTRN_SERIALNO,
WTRN_TRANTYPE,
WTRN_ORIGSERIALNO,
WTRN_ORDERNO,
WTRN_ORDERDATE,
WTRN_BUSINESSTYPE,
WTRN_TRANCURRTYPE,
WTRN_TRANAMOUNT,
WTRN_ACCPBANK,
WTRN_TRANSTATE,
WTRN_TRANTIME,
WTRN_TRANDATE,
WTRN_MERNO,
WTRN_TOBANKORDERNO
)VALUES(
v_refserialno, --和申请表的流水号相同,作为参数传人
v_tranType,
v_serialno, --原交易流水号,查询退款申请表得到
v_orderNo,
v_orderDate,
v_businessType,
v_currType,
v_refAmount,
v_bank,
'1',
v_time,
v_date,
v_merno,
v_tobankOrderNo --上送银行的订单号,查询流水表得到
);
--更新网上退款申请表
UPDATE PY_WEB_REFUND
SET
WEBR_IFDISPOSED = '1',
WEBR_DISPOSEDOPR = in_session_operatorid,
WEBR_DISPOSEDDATE = v_datetime
WHERE
WEBR_REFREQNO = v_refserialno;
--更新定单表
IF v_tranType = '2' THEN
v_orderState := '7';
ELSE
v_orderState := '10';
END IF;
UPDATE PY_ORDER
SET
ORD_ORDERSTATE = v_orderState
WHERE
ORD_ORDERNO = v_orderNo
AND ORD_ORDERDATE = v_orderDate
AND ORD_BUSINESSTYPE = v_businessType;
END LOOP;
-- 异常处理
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
out_return_code := '14001';
RETURN;
END;
END PY_PCKG_REFUND2;
/
分享到:
相关推荐
在本例中,我们将讨论如何使用 Oracle 存储过程编译,特别是使用 PL/SQL 语言编写的存储过程。 标题:Oracle 存储过程编译 描述:Oracle 存储过程编译 标签:Oracle 部分内容: 在上面的代码中,我们定义了一个...
通过以上对Oracle存储过程、游标和函数的详细介绍,我们可以看到这些特性为Oracle数据库提供了一种强大而灵活的方式来处理数据。掌握这些技术对于开发高效的应用程序至关重要。在未来的学习和实践中,我们应该不断...
根据提供的文件信息,我们可以归纳出以下Oracle存储过程的相关知识点: ### Oracle存储过程基础概念 - **存储过程**:是在数据库中存储的一组SQL语句和控制流语句的集合,可以接受输入参数、返回单个值、返回多个...
在本例中,我们看到两个具体的存储过程`writeCount`和`testSandyInSert`,它们展示了如何创建和使用Oracle存储过程。 1. 创建包(Package): 在Oracle中,存储过程通常被组织到包(Package)中,以便更好地管理和...
在IT领域,特别是数据库操作与Java开发中,利用ibatis框架调用Oracle存储过程是一个常见的需求,这不仅能够提升代码的执行效率,还能增强应用程序的安全性。本文将深入解析ibatis如何与Oracle数据库中的存储过程进行...
在本例中,“Oracle存储过程实例使用显示游标”着重展示了如何在存储过程中调用函数,并通过游标来处理和更新数据。 首先,我们需要了解存储过程的基本结构。一个存储过程通常包含以下部分: 1. **声明部分**:在...
在Java中调用Oracle存储过程,我们需要使用JDBC(Java Database Connectivity),这是Java标准库提供的一组接口和类,用于与各种数据库进行通信。首先,我们需要添加Oracle JDBC驱动到项目中,例如ojdbc.jar。 1. *...
### JAVA调用ORACLE存储过程知识点详解 #### 一、背景与概述 在现代软件开发过程中,集成多种技术栈是常态。特别是在企业级应用中,Java 和 Oracle 数据库的组合非常常见。通过 Java 调用 Oracle 存储过程不仅能够...
在本例中,我们探讨了如何使用数组存储过程进行批量插入和删除。数组在Oracle中的使用通常涉及定义PL/SQL类型,这允许我们创建索引数组以存储特定数据类型。 首先,我们创建一个名为`MSGPAG`的包,其中定义了一个名...
Oracle存储过程是数据库管理系统Oracle中的一个重要特性,它允许开发者编写一系列复杂的SQL和PL/SQL语句,形成可重用的代码块。存储过程在数据库中预先编译,提高了执行效率,降低了网络通信量,同时也提供了更好的...
Oracle 分页存储过程是数据库管理中的一个重要概念,它允许用户以特定的页面大小获取数据,而不是一次性获取所有数据,这有助于提高性能并减轻服务器负担。在Oracle中,可以通过创建存储过程来实现这一功能,尤其在...
Oracle数据库是企业级广泛使用的数据库管理系统,其强大的功能之一就是支持存储过程的创建、管理和使用。存储过程是一组为了完成特定任务而预编译的SQL语句集合,它可以提高应用程序的性能和效率,同时减少网络流量...
本节以一个具体的GPS车辆监控系统为例,介绍如何在Visual C++开发环境下,使用ADO技术调用Oracle存储过程。 ##### 1. 开发环境与工具 本案例基于Visual C++ 6.0开发平台,利用ADO(ActiveX Data Object)技术实现...
总之,Oracle存储过程是数据库开发中的关键组件,它们提供了结构化的方法来组织和执行复杂的数据库操作,同时提高了系统的安全性和性能。正确地设计和使用存储过程能够极大地提升数据库应用的效率和质量。
### Oracle自动执行存储过程 #### 一、背景与需求 在很多实际应用场景中,我们可能会遇到需要定时执行某些任务的情况,比如数据清理、备份、统计分析等。在Oracle数据库环境中,可以通过创建定时任务来实现对特定...
首先,我们需要理解Oracle存储过程的概念。存储过程是预编译在数据库服务器上的SQL和PL/SQL代码集合,可以接收参数,执行特定任务并返回结果。调用存储过程可以提高性能,减少网络流量,并封装业务逻辑。 在Java中...
但是,如何将List类型参数传递给Oracle存储过程,实现批量插入数据却是一个棘手的问题,本文将给大家介绍Mybatis传List参数调用Oracle存储过程的解决方法。 使用Mybatis传List参数调用Oracle存储过程的解决方法 在...
### Oracle存储过程详解 在Oracle数据库管理中,存储过程是一种重要的数据库对象,它允许开发者将一组SQL和PL/SQL语句封装在一起,作为单一单元在数据库服务器上存储和执行。这种封装不仅提高了代码的重用性和维护...
本文将对这一主题进行深入探讨,以帮助开发者理解如何有效地在Java中调用Oracle存储过程。 首先,我们来看一个无返回值的存储过程的例子。Oracle存储过程`adddept`用于向`dept`表中插入新的部门记录。在Java中,...