创建账务变动函数

来源:互联网 发布:皇甫圣华淘宝店号 编辑:程序博客网 时间:2024/04/28 01:39
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;


                    IF INOPPROFIT !=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,InAccountType,sysdate,CREDIT,PROFIT,InOpMoney,CREDIT,PROFIT+InOpProfit,HeadObject.TradeType,HeadObject.TradeCode,HeadObject.ChnlType,HeadObject.DeptNo,HeadObject.OperNo
                                FROM PUB_ACCOUNT_INFO
                                WHERE ACCOUNTNO=InAccountNo AND ACCOUNTTYPE=InAccountType;
                            UPDATE PUB_ACCOUNT_INFO SET PROFIT=PROFIT+InOpProfit,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT,16,'0')||LPAD(PROFIT+InOpProfit,16,'0'))) WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;


                    END IF;


            ELSE
                    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+InOpProfit,HeadObject.TradeType,HeadObject.TradeCode,HeadObject.ChnlType,HeadObject.DeptNo,HeadObject.OperNo
                        FROM PUB_ACCOUNT_INFO
                        WHERE ACCOUNTNO=InAccountNo AND ACCOUNTTYPE=InAccountType;
                    UPDATE PUB_ACCOUNT_INFO SET CREDIT=CREDIT-INOPMONEY,PROFIT=PROFIT+InOpProfit,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT-INOPMONEY,16,'0')||LPAD(PROFIT+InOpProfit,16,'0'))) WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;


            END IF;
            --记录账户变动流水表


            RETURN '00000000';


        WHEN '+' THEN
            --账户金额增加,佣金减少(适用于冲正,存款等业务)


            --更新账户,更新佣金(如果使用本金账户,则两个账户都需要更新,佣金记录在明细账户中)
            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;


                    IF INOPPROFIT !=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,InAccountType,sysdate,CREDIT,PROFIT,InOpMoney,CREDIT,PROFIT-InOpProfit,HeadObject.TradeType,HeadObject.TradeCode,HeadObject.ChnlType,HeadObject.DeptNo,HeadObject.OperNo
                                FROM PUB_ACCOUNT_INFO
                                WHERE ACCOUNTNO=InAccountNo AND ACCOUNTTYPE=InAccountType;
                            UPDATE PUB_ACCOUNT_INFO SET PROFIT=PROFIT-InOpProfit ,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT,16,'0')||LPAD(PROFIT-InOpProfit,16,'0'))) WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;


                    END IF;


            ELSE
                    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-InOpProfit,HeadObject.TradeType,HeadObject.TradeCode,HeadObject.ChnlType,HeadObject.DeptNo,HeadObject.OperNo
                        FROM PUB_ACCOUNT_INFO
                        WHERE ACCOUNTNO=InAccountNo AND ACCOUNTTYPE=InAccountType;
                    UPDATE PUB_ACCOUNT_INFO SET CREDIT=CREDIT+INOPMONEY,PROFIT=PROFIT-InOpProfit,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT+INOPMONEY,16,'0')||LPAD(PROFIT-InOpProfit,16,'0'))) WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;


            END IF;
            --记录账户变动流水表
            RETURN '00000000';
        WHEN '212001' THEN
            --账户金额增加,佣金不变(存款等业务)


            --更新账户,更新佣金(如果使用本金账户,则两个账户都需要更新,佣金记录在明细账户中)
            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,CREDITTOT = CREDITTOT+INOPMONEY,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT+INOPMONEY,16,'0')||LPAD(PROFIT,16,'0'))),LASTTIME=sysdate WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=0;
            ELSE
                    INSERT INTO PUB_ACCOUNT_LOG (STREAMID,ACCOUNTNO,ACCOUNTTYPE,OPTIME,OLDCREDIT,OLDPROFIT,OPMONEY,NEWCREDIT,NEWPROFIT,TRADETYPE,TRADECODE,CHNLTYPE,DEPTNO,OPERNO)
                        SELECT  HeadObject.StreamId,InAccountNo,InAccountType,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=InAccountType;
                    UPDATE PUB_ACCOUNT_INFO SET CREDIT=CREDIT+INOPMONEY,CREDITTOT = CREDITTOT+INOPMONEY,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT+INOPMONEY,16,'0')||LPAD(PROFIT,16,'0'))),LASTTIME=sysdate WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;
            END IF;
            --记录账户变动流水表
            RETURN '00000000';
        WHEN '212002' THEN
            --账户金额减少,佣金不变(存款冲正等业务)


            --更新账户,更新佣金(如果使用本金账户,则两个账户都需要更新,佣金记录在明细账户中)
            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,CREDITTOT = CREDITTOT-INOPMONEY,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT-INOPMONEY,16,'0')||LPAD(PROFIT,16,'0'))),LASTTIME=sysdate WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=0;
            ELSE
                    INSERT INTO PUB_ACCOUNT_LOG (STREAMID,ACCOUNTNO,ACCOUNTTYPE,OPTIME,OLDCREDIT,OLDPROFIT,OPMONEY,NEWCREDIT,NEWPROFIT,TRADETYPE,TRADECODE,CHNLTYPE,DEPTNO,OPERNO)
                        SELECT  HeadObject.StreamId,InAccountNo,InAccountType,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=InAccountType;
                    UPDATE PUB_ACCOUNT_INFO SET CREDIT=CREDIT-INOPMONEY,CREDITTOT = CREDITTOT-INOPMONEY,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT-INOPMONEY,16,'0')||LPAD(PROFIT,16,'0'))),LASTTIME=sysdate WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;
            END IF;
            --记录账户变动流水表
            RETURN '00000000';


        WHEN '214001' 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'))),LASTTIME=sysdate WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=0;


                    IF INOPPROFIT !=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,InAccountType,sysdate,CREDIT,PROFIT,InOpMoney,CREDIT,PROFIT+InOpProfit,HeadObject.TradeType,HeadObject.TradeCode,HeadObject.ChnlType,HeadObject.DeptNo,HeadObject.OperNo
                                FROM PUB_ACCOUNT_INFO
                                WHERE ACCOUNTNO=InAccountNo AND ACCOUNTTYPE=InAccountType;
                            UPDATE PUB_ACCOUNT_INFO SET PROFIT=PROFIT+InOpProfit,PROFITTOT=PROFITTOT+InOpProfit ,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT,16,'0')||LPAD(PROFIT+InOpProfit,16,'0'))) ,LASTTIME=sysdate WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;


                    END IF;


            ELSE
                    INSERT INTO PUB_ACCOUNT_LOG (STREAMID,ACCOUNTNO,ACCOUNTTYPE,OPTIME,OLDCREDIT,OLDPROFIT,OPMONEY,NEWCREDIT,NEWPROFIT,TRADETYPE,TRADECODE,CHNLTYPE,DEPTNO,OPERNO)
                        SELECT  HeadObject.StreamId,InAccountNo,InAccountType,sysdate,CREDIT,PROFIT,InOpMoney,CREDIT-InOpMoney,PROFIT+InOpProfit,HeadObject.TradeType,HeadObject.TradeCode,HeadObject.ChnlType,HeadObject.DeptNo,HeadObject.OperNo
                        FROM PUB_ACCOUNT_INFO
                        WHERE ACCOUNTNO=InAccountNo AND ACCOUNTTYPE=InAccountType;
                    UPDATE PUB_ACCOUNT_INFO SET CREDIT=CREDIT-INOPMONEY,PROFIT=PROFIT+InOpProfit,PROFITTOT=PROFITTOT+InOpProfit ,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT-INOPMONEY,16,'0')||LPAD(PROFIT+InOpProfit,16,'0'))) ,LASTTIME=sysdate WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;


            END IF;
            --记录账户变动流水表


            RETURN '00000000';
        WHEN 'C214001' THEN
            --账户金额增加,佣金减少(适用于自动冲正交易)
            --更新账户,更新佣金(如果使用本金账户,则两个账户都需要更新,佣金记录在明细账户中)
            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;


                    IF INOPPROFIT !=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,InAccountType,sysdate,CREDIT,PROFIT,InOpMoney,CREDIT,PROFIT-InOpProfit,HeadObject.TradeType,HeadObject.TradeCode,HeadObject.ChnlType,HeadObject.DeptNo,HeadObject.OperNo
                                FROM PUB_ACCOUNT_INFO
                                WHERE ACCOUNTNO=InAccountNo AND ACCOUNTTYPE=InAccountType;
                            UPDATE PUB_ACCOUNT_INFO SET PROFIT=PROFIT-InOpProfit,PROFITTOT=PROFITTOT-InOpProfit ,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT,16,'0')||LPAD(PROFIT-InOpProfit,16,'0')))  WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;


                    END IF;


            ELSE
                    INSERT INTO PUB_ACCOUNT_LOG (STREAMID,ACCOUNTNO,ACCOUNTTYPE,OPTIME,OLDCREDIT,OLDPROFIT,OPMONEY,NEWCREDIT,NEWPROFIT,TRADETYPE,TRADECODE,CHNLTYPE,DEPTNO,OPERNO)
                        SELECT  HeadObject.StreamId,InAccountNo,InAccountType,sysdate,CREDIT,PROFIT,InOpMoney,CREDIT+InOpMoney,PROFIT-InOpProfit,HeadObject.TradeType,HeadObject.TradeCode,HeadObject.ChnlType,HeadObject.DeptNo,HeadObject.OperNo
                        FROM PUB_ACCOUNT_INFO
                        WHERE ACCOUNTNO=InAccountNo AND ACCOUNTTYPE=InAccountType;
                    UPDATE PUB_ACCOUNT_INFO SET CREDIT=CREDIT+INOPMONEY,PROFIT=PROFIT-InOpProfit,PROFITTOT=PROFITTOT-InOpProfit ,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT+INOPMONEY,16,'0')||LPAD(PROFIT-InOpProfit,16,'0'))) ,LASTTIME=sysdate WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;


            END IF;
            --记录账户变动流水表


            RETURN '00000000';


        WHEN '214003' THEN
            --账户冻结金额增加,佣金减少(适用于冲正业务)


            --更新账户,更新佣金(如果使用本金账户,则两个账户都需要更新,佣金记录在明细账户中)
            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,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 CREDITHLD=CREDITHLD+INOPMONEY ,LASTTIME=sysdate WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=0;


                    IF INOPPROFIT !=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,InAccountType,sysdate,CREDIT,PROFIT,InOpMoney,CREDIT,PROFIT-InOpProfit,HeadObject.TradeType,HeadObject.TradeCode,HeadObject.ChnlType,HeadObject.DeptNo,HeadObject.OperNo
                                FROM PUB_ACCOUNT_INFO
                                WHERE ACCOUNTNO=InAccountNo AND ACCOUNTTYPE=InAccountType;
                            UPDATE PUB_ACCOUNT_INFO SET PROFIT=PROFIT-InOpProfit , PROFITTOT=PROFITTOT-InOpProfit,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT,16,'0')||LPAD(PROFIT-InOpProfit,16,'0')))  ,LASTTIME=sysdate WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;


                    END IF;


            ELSE
                    INSERT INTO PUB_ACCOUNT_LOG (STREAMID,ACCOUNTNO,ACCOUNTTYPE,OPTIME,OLDCREDIT,OLDPROFIT,OPMONEY,NEWCREDIT,NEWPROFIT,TRADETYPE,TRADECODE,CHNLTYPE,DEPTNO,OPERNO)
                        SELECT  HeadObject.StreamId,InAccountNo,InAccountType,sysdate,CREDIT,PROFIT,InOpMoney,CREDIT,PROFIT-InOpProfit,HeadObject.TradeType,HeadObject.TradeCode,HeadObject.ChnlType,HeadObject.DeptNo,HeadObject.OperNo
                        FROM PUB_ACCOUNT_INFO
                        WHERE ACCOUNTNO=InAccountNo AND ACCOUNTTYPE=InAccountType;
                    UPDATE PUB_ACCOUNT_INFO SET CREDITHLD=CREDITHLD+INOPMONEY,PROFIT=PROFIT-InOpProfit, PROFITTOT=PROFITTOT-InOpProfit,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT,16,'0')||LPAD(PROFIT-InOpProfit,16,'0'))) WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;
            END IF;
            --记录账户变动流水表


            RETURN '00000000';
        WHEN '214004' THEN
            --账户冻结金额减少, 保证金增加,佣金不变(冻结金额返保证金)
            IF DbCreditHld < INOPMONEY THEN
                --账务金额不足
                RETURN '31000001';
            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,CREDITHLD=CREDITHLD-INOPMONEY  ,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT+INOPMONEY,16,'0')||LPAD(PROFIT,16,'0'))) WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=0;


            ELSE
                    INSERT INTO PUB_ACCOUNT_LOG (STREAMID,ACCOUNTNO,ACCOUNTTYPE,OPTIME,OLDCREDIT,OLDPROFIT,OPMONEY,NEWCREDIT,NEWPROFIT,TRADETYPE,TRADECODE,CHNLTYPE,DEPTNO,OPERNO)
                        SELECT  HeadObject.StreamId,InAccountNo,InAccountType,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=InAccountType;
                    UPDATE PUB_ACCOUNT_INFO SET CREDIT=CREDIT+INOPMONEY,CREDITHLD=CREDITHLD-INOPMONEY,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT+INOPMONEY,16,'0')||LPAD(PROFIT,16,'0'))) WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;
            END IF;
            --记录账户变动流水表


            RETURN '00000000';
        WHEN '214005' THEN
            --账户金额不变,冻结金额减少,佣金增加(适用于冲正取消交易,该交易不校验冻结金额余额)
            --更新账户,更新佣金(如果使用本金账户,则两个账户都需要更新,佣金记录在明细账户中)
            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,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 CREDITHLD=CREDITHLD-INOPMONEY  WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=0;


                    IF INOPPROFIT !=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,InAccountType,sysdate,CREDIT,PROFIT,InOpMoney,CREDIT,PROFIT+InOpProfit,HeadObject.TradeType,HeadObject.TradeCode,HeadObject.ChnlType,HeadObject.DeptNo,HeadObject.OperNo
                                FROM PUB_ACCOUNT_INFO
                                WHERE ACCOUNTNO=InAccountNo AND ACCOUNTTYPE=InAccountType;
                            UPDATE PUB_ACCOUNT_INFO SET PROFIT=PROFIT+InOpProfit,PROFITTOT=PROFITTOT+InOpProfit ,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT,16,'0')||LPAD(PROFIT+InOpProfit,16,'0'))) ,LASTTIME=sysdate WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;


                    END IF;


            ELSE
                    INSERT INTO PUB_ACCOUNT_LOG (STREAMID,ACCOUNTNO,ACCOUNTTYPE,OPTIME,OLDCREDIT,OLDPROFIT,OPMONEY,NEWCREDIT,NEWPROFIT,TRADETYPE,TRADECODE,CHNLTYPE,DEPTNO,OPERNO)
                        SELECT  HeadObject.StreamId,InAccountNo,InAccountType,sysdate,CREDIT,PROFIT,InOpMoney,CREDIT,PROFIT+InOpProfit,HeadObject.TradeType,HeadObject.TradeCode,HeadObject.ChnlType,HeadObject.DeptNo,HeadObject.OperNo
                        FROM PUB_ACCOUNT_INFO
                        WHERE ACCOUNTNO=InAccountNo AND ACCOUNTTYPE=InAccountType;
                    UPDATE PUB_ACCOUNT_INFO SET CREDITHLD=CREDITHLD-INOPMONEY,PROFIT=PROFIT+InOpProfit,PROFITTOT=PROFITTOT+InOpProfit ,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT,16,'0')||LPAD(PROFIT+InOpProfit,16,'0'))) ,LASTTIME=sysdate WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;


            END IF;
            --记录账户变动流水表


            RETURN '00000000';


        WHEN '215002' THEN
           --佣金转保证金的交易规定所有佣金只能转往基本账户,不能转往明细账户。
           --账户佣金金额减少, 保证金增加
            IF DbProfit < INOPPROFIT THEN
                --账务佣金金额不足
                RETURN '31000007';
            END IF;
            --更新账户,更新佣金(如果使用本金账户,则两个账户都需要更新,佣金记录在明细账户中)
            --IF (INACCOUNTTYPE !=0) AND (DbAccountFlag !=0 )THEN
            IF (INACCOUNTTYPE !=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;
                    INSERT INTO PUB_ACCOUNT_LOG (STREAMID,ACCOUNTNO,ACCOUNTTYPE,OPTIME,OLDCREDIT,OLDPROFIT,OPMONEY,NEWCREDIT,NEWPROFIT,TRADETYPE,TRADECODE,CHNLTYPE,DEPTNO,OPERNO)
                        SELECT  HeadObject.StreamId,InAccountNo,InAccountType,sysdate,CREDIT,PROFIT,InOpMoney,CREDIT,PROFIT-INOPPROFIT,HeadObject.TradeType,HeadObject.TradeCode,HeadObject.ChnlType,HeadObject.DeptNo,HeadObject.OperNo
                        FROM PUB_ACCOUNT_INFO
                        WHERE ACCOUNTNO=InAccountNo AND ACCOUNTTYPE=InAccountType;


                    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;
                    UPDATE PUB_ACCOUNT_INFO SET PROFIT=PROFIT-InOpProfit,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT,16,'0')||LPAD(PROFIT-InOpProfit,16,'0'))) WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;
            ELSE
                    INSERT INTO PUB_ACCOUNT_LOG (STREAMID,ACCOUNTNO,ACCOUNTTYPE,OPTIME,OLDCREDIT,OLDPROFIT,OPMONEY,NEWCREDIT,NEWPROFIT,TRADETYPE,TRADECODE,CHNLTYPE,DEPTNO,OPERNO)
                        SELECT  HeadObject.StreamId,InAccountNo,InAccountType,sysdate,CREDIT,PROFIT,InOpMoney,CREDIT+INOPMONEY,PROFIT-INOPPROFIT,HeadObject.TradeType,HeadObject.TradeCode,HeadObject.ChnlType,HeadObject.DeptNo,HeadObject.OperNo
                        FROM PUB_ACCOUNT_INFO
                        WHERE ACCOUNTNO=InAccountNo AND ACCOUNTTYPE=InAccountType;
                    UPDATE PUB_ACCOUNT_INFO SET CREDIT=CREDIT+INOPMONEY,PROFIT=PROFIT-InOpProfit,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT+INOPMONEY,16,'0')||LPAD(PROFIT-INOPPROFIT,16,'0'))) WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;
            END IF;


            RETURN '00000000';


        WHEN '215003' THEN
            --账户佣金金额增加
            --更新账户,更新佣金(如果使用本金账户,则两个账户都需要更新,佣金记录在明细账户中)
                    INSERT INTO PUB_ACCOUNT_LOG (STREAMID,ACCOUNTNO,ACCOUNTTYPE,OPTIME,OLDCREDIT,OLDPROFIT,OPMONEY,NEWCREDIT,NEWPROFIT,TRADETYPE,TRADECODE,CHNLTYPE,DEPTNO,OPERNO)
                        SELECT  HeadObject.StreamId,InAccountNo,InAccountType,sysdate,CREDIT,PROFIT,InOpMoney,CREDIT,PROFIT+INOPPROFIT,HeadObject.TradeType,HeadObject.TradeCode,HeadObject.ChnlType,HeadObject.DeptNo,HeadObject.OperNo
                        FROM PUB_ACCOUNT_INFO
                        WHERE ACCOUNTNO=InAccountNo AND ACCOUNTTYPE=InAccountType;
                    UPDATE PUB_ACCOUNT_INFO SET PROFIT=PROFIT+InOpProfit,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT,16,'0')||LPAD(PROFIT+INOPPROFIT,16,'0'))) WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;
            RETURN '00000000';


        WHEN '500300' THEN
            --账户金额减少,账户冻结金额增加,佣金减少(适用于金额冻结业务)
           --更新账户,更新佣金(如果使用本金账户,则两个账户都需要更新,佣金记录在明细账户中)
            IF DbCredit < INOPMONEY THEN
                --账务金额不足
                RETURN '31000001';
            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,CREDITHLD=CREDITHLD+INOPMONEY  ,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT-INOPMONEY,16,'0')||LPAD(PROFIT,16,'0'))) WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=0;


            ELSE
                    INSERT INTO PUB_ACCOUNT_LOG (STREAMID,ACCOUNTNO,ACCOUNTTYPE,OPTIME,OLDCREDIT,OLDPROFIT,OPMONEY,NEWCREDIT,NEWPROFIT,TRADETYPE,TRADECODE,CHNLTYPE,DEPTNO,OPERNO)
                        SELECT  HeadObject.StreamId,InAccountNo,InAccountType,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=InAccountType;
                    UPDATE PUB_ACCOUNT_INFO SET CREDIT=CREDIT-INOPMONEY,CREDITHLD=CREDITHLD+INOPMONEY,MACCHK=RAWTOHEX(EBS_MD5(LPAD(CREDIT-INOPMONEY,16,'0')||LPAD(PROFIT,16,'0'))) WHERE ACCOUNTNO=INACCOUNTNO AND ACCOUNTTYPE=InAccountType;
            END IF;
            --记录账户变动流水表


            RETURN '00000000';


        WHEN 'H' THEN


            --更新账户,更新佣金(如果使用本金账户,则两个账户都需要更新,佣金记录在明细账户中)


            --记录账户变动流水表


            RETURN '99999999';
        ELSE
            RETURN '99999999';
     END CASE;
     RETURN '00000000';

END;





**********本博客所有内容均为原创,如有转载请注明作者和出处!!!**********
Name:    guoyJoe

QQ:        252803295

Email:    oracledba_cn@hotmail.com

Blog:      http://blog.csdn.net/guoyJoe

ITPUB:   http://www.itpub.net/space-uid-28460966.html

OCM:     http://education.oracle.com/education/otn/YGuo.HTM
 _____________________________________________________________
加群验证问题:哪些SGA结构是必需的,哪些是可选的?否则拒绝申请!!!

答案在:http://blog.csdn.net/guoyjoe/article/details/8624392

Oracle@Paradise  总群:127149411

Oracle@Paradise No.1群:177089463(已满)

Oracle@Paradise No.2群:121341761

Oracle@Paradise No.3群:140856036