Oracle中如何创建账务变动函数

CREATE OR REPLACE FUNCTION FUN_ACCOUNT_CHANGE( HeadObject IN EBSHEADOBJECT,
                           InAccountNo IN PUB_ACCOUNT_INFO.ACCOUNTNO%TYPE,
                           InAccountType IN PUB_ACCOUNT_INFO.ACCOUNTTYPE%TYPE,
                           InOpMoney IN NUMBER,
                           InOpProfit IN NUMBER,
                           InFlag IN VARCHAR) RETURN VARCHAR2
IS
   DbAccountFlag        PUB_ACCOUNT_INFO.ACCOUNTFLAG%TYPE;
   DbState              PUB_ACCOUNT_INFO.STATE%TYPE;
   DbCredit             PUB_ACCOUNT_INFO.CREDIT%TYPE;
   DbCreditHLD          PUB_ACCOUNT_INFO.CREDITHLD%TYPE;
   DbProfit             PUB_ACCOUNT_INFO.PROFIT%TYPE;
   DbMacChk             PUB_ACCOUNT_INFO.MACCHK%TYPE;
   DbThresHold          PUB_ACCOUNT_INFO.THRESHOLD%TYPE;
   DbLeastCredit        PUB_ACCOUNT_INFO.LEASTCREDIT%TYPE;

   DbCredit0            PUB_ACCOUNT_INFO.CREDIT%TYPE;
   DbProfit0            PUB_ACCOUNT_INFO.PROFIT%TYPE;

   vCredit              PUB_ACCOUNT_INFO.CREDIT%TYPE;
   vProfit              PUB_ACCOUNT_INFO.PROFIT%TYPE;

   DbConnectPhone       PUB_ACCOUNT_INFO.CONNECTPHONE%TYPE;
   vMacChk              VARCHAR2(128);
   ---212001 212002 214001 214003 214005 会导致lasttime时间的更新,该项的更新原则是仅记录由代理商主动发起的交易,佣金处理不做时间点更新.
BEGIN
   --根据ACCOUNTTYPE  ACCOUNTNO 获取账号信息
    BEGIN
       SELECT  ACCOUNTFLAG,STATE,CREDIT,PROFIT,CREDITHLD,MACCHK,THRESHOLD,LEASTCREDIT ,CONNECTPHONE
       INTO DbAccountFlag,DbState,DbCredit,DbProfit,DbCreditHld,DbMacChk,DbThresHold,DbLeastCredit,DbConnectPhone
       FROM PUB_ACCOUNT_INFO
       WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=INACCOUNTTYPE;
    EXCEPTION
       --账户不存在
       WHEN NO_DATA_FOUND THEN
           RETURN '31000002';
       WHEN OTHERS THEN
           RETURN '90000001';
    END;
    IF DbState != 0 THEN
       --账务状态不正常,修改错误代码
       RETURN '31000003';
    END IF;
    --校验MAC
    SELECT RAWTOHEX(EBS_MD5(LPAD(DbCredit,16,'0')||LPAD(DbProfit,16,'0'))) INTO vMacChk FROM DUAL;
    IF vMacChk != DbMacChk THEN
       --账务非法变动,修改错误代码
       RETURN '31000004';
    END IF;

   --如果使用本金账户,则重新获取账户信息
    IF (INACCOUNTTYPE !=0) AND (DbAccountFlag !=0 )THEN
            BEGIN
               SELECT  STATE,CREDIT,PROFIT,DbCreditHld,MACCHK,THRESHOLD,LEASTCREDIT ,CONNECTPHONE
               INTO DbState,DbCredit,DbProfit0,DbCreditHld,DbMacChk,DbThresHold,DbLeastCredit,DbConnectPhone
           FROM PUB_ACCOUNT_INFO
           WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=0;
            EXCEPTION
           --账户不存在
           WHEN NO_DATA_FOUND THEN
           RETURN '31000002';
           WHEN OTHERS THEN
           RETURN '90000001';
       END ;
         IF DbState != 0 THEN
         --账务状态不正常,修改错误代码
         RETURN '31000003';
         END IF;
      --校验MAC
      SELECT RAWTOHEX(EBS_MD5(LPAD(DbCredit,16,'0')||LPAD(DbProfit0,16,'0'))) INTO vMacChk FROM DUAL;
      IF vMacChk != DbMacChk THEN
         --账务非法变动,修改错误代码
         RETURN '31000004';
      END IF;
    END IF;
        --交易类别:
    CASE InFlag
       WHEN '-' THEN
           --账户金额减少,佣金增加(适用于充值业务,佣金金额可以为负)
           IF DbCredit < INOPMONEY THEN
               --账务金额不足
               RETURN '31000001';
           END IF;
           IF DbCredit -INOPMONEY <DbLeastCredit THEN
               --最少金额控制
               RETURN '31000001';
           END IF;
           IF DbCreDit - INOPMONEY <DbThresHold THEN
               --告警阀值
               INSERT INTO BASE_SENDSMS_LOG(AGTPHONE,CORPID,OPTIME,STATE,OWNER,MESSAGE)
                   VALUES( DbConnectPhone,SUBSTR(InAccountNo,3,4),sysdate,0,HeadObject.TradeType||HeadObject.TradeCode||HeadObject.StreamId,'保证金余额不足,剩余'||DbCreDit/100||'请及时存款');
           END IF;
           --更新账户,更新佣金(如果使用本金账户,则两个账户都需要更新,佣金记录在明细账户中)
           IF (INACCOUNTTYPE !=0) AND (DbAccountFlag !=0 )THEN
                   --挂机账户
                   INSERT INTO PUB_ACCOUNT_LOG (STREAMID,ACCOUNTNO,ACCOUNTTYPE,OPTIME,OLDCREDIT,OLDPROFIT,OPMONEY,NEWCREDIT,NEWPROFIT,TRADETYPE,TRADECODE,CHNLTYPE,DEPTNO,OPERNO)
                       SELECT  HeadObject.StreamId,InAccountNo,0,sysdate,CREDIT,PROFIT,InOpMoney,CREDIT-InOpMoney,PROFIT,HeadObject.TradeType,HeadObject.TradeCode,HeadObject.ChnlType,HeadObject.DeptNo,HeadObject.OperNo
                       FROM PUB_ACCOUNT_INFO
                       WHERE ACCOUNTNO=InAccountNo AND ACCOUNTTYPE=0;
                   UPDATE PUB_ACCOUNT_INFO SET CREDIT=CREDIT-INOPMONEY ,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT-INOPMONEY,16,'0')||LPAD(PROFIT,16,'0'))) WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=0;

时间: 2024-04-25 19:27:25

Oracle中如何创建账务变动函数的相关文章

如何在oracle中手工创建数据库

oracle中手工创建数据库的步骤: 1. 创建必要的相关目录 2. 创建初始化参数文件 3. 设置环境变量Oracle_sid 4. 创建实例 5. 创建口令文件 6. 启动数据库到nomount(实例)状态 7. 执行建库脚本 8. 执行catalog脚本创建数据字典 9. 执行catproc创建package包 10.      执行pupbld 11.      由初始化参数文件创建spfile文件 12.      执行scott脚本创建scott模式 13.      用命令测试数据

oracle中如何创建轮寻机制

问题描述 oracle中如何创建轮寻机制 如何在oracle 11g创建一个轮寻机制,就是定时扫描数据表,然后如果发现未处理的数据,则提取出来进行处理,如果未处理的数据超过1000条,则每批直处理1000条,如果超过,则排队等待处理 解决方案 使用java写一个procedure Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { test.doStuff(); } }

oracle拉格朗日-哪位大神给写一个oracle中关于拉格朗日插值法的函数??大神 求指教啊

问题描述 哪位大神给写一个oracle中关于拉格朗日插值法的函数??大神 求指教啊 哪位大神给写一个oracle中关于拉格朗日插值法的函数??大神 求指教啊

Oracle中的子程序之二函数

函数是一个能够计算结果值的子程序,函数除了有一个RETURN子句之外,其它结构跟过程类似.值得 注意的是,Oracle中的函数必须提供返回值,如果你定义的子程序没有返回值,那么你不应该把它定义 成函数,而应该定义成过程. 一.函数 示例1:创建不带参数的函数 CREATE OR REPLACE FUNCTION currentTime --没有参数,不能加括号 RETURN VARCHAR2 AS BEGIN RETURN TO_CHAR(SYSDATE,'YYYY"年"MM"

oracle中如何创建用户

一.用户的概念 用户,即user,通俗的讲就是访问oracle数据库的"人".在oracle中,可以对用户的各种安全参数进行控制,以维护数据库的安全性,这些概念包括模式(schema).权限.角色.存储设置.空间限额.存取资源限制.数据库审计等.每个用户都有一个口令,使用正确的用户/口令才能登录到数据库进行数据存取. 二.用户默认表空间 表空间是信息存储的最大逻辑单位.当用户连接到数据库进行资料存储时,若未指出数据的目标存储表空间时,则数据存储在用户的默认表空间中. 比如:create

oracle中如何创建表空间

ORACLE中,表空间是数据管理的基本方法,所有用户的对象要存放在表空间中,也就是用户有空间的使用权,才能创建用户 对象.否则是不充许创建对象,因为就是想创建对象,如表,索引等,也没有地方存放,Oracle会提示:没有存储配额. 因此,在创建对象之前,首先要分配存储空间. 分配存储,就要创建表空间: 创建表空间示例如下: CREATE TABLESPACE "SAMPLE" LOGGING DATAFILE 'D:\ORACLE\ORADATA\ORA92\LUNTAN.ora' SI

oracle中dblink创建的两种方式

当用户要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据.下面讲介绍如何在本地数据库中创建dblink. 创建dblink一般有两种方式,不过在创建dblink之前用户必须有创建dblink的权限.想知道有关dblink的权限,以sys用户登录到本地数据库: select * from user_sys_privs t where t.privilege like upper(

Oracle中如何创建跟踪客户端IP地址的触发器

若果要让v$logmnr_contents中的session_info记录客户端ip,但SESSION_INFO中我们并不能直接看到IP, 不过我们还是有办法的,因为这个SESSION_INFO里面的内容其实是日志从V$SESSION视图里提取的,我们可以 在生产数据库中创建一个追踪客户端IP地址的触发器: create or replace trigger on_logon_trigger after logon on database begin dbms_application_info.

oracle中如何创建新用户

oracle数据库的权限系统分为系统权限与对象权限.系统权限( database system privilege )可以让用户执行特定的命令集.例如,create table权限允许用户创建表,grant any privilege 权限允许用户授予任何系统权限.对象权限( database object privilege )可以让用户能够对各个对象进行某些操作.例如delete权限允许用户删除表或视图的行,select权限允许用户通过select从表.视图.序列(sequences)或快照