oracle 函数

本文介绍了一个用于计算Oracle数据库中代理商酬金的函数MXL_GET_SMSUNIT_ACCOUNT及一个更新代理商月酬金的过程MXL_UPDATE_CBM_REWARD_ACCOUNT。通过这两个自定义函数和过程,可以实现根据不同业务类型和区域自动计算并更新代理商的酬金。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我自己写的Oracle函数:

CREATE OR REPLACE Function MXL_GET_SMSUNIT_ACCOUNT(BusinessCode In varchar2,areacode In Integer,SmsUnitMoney In Integer) Return Integer Is retMoney Integer;
-- BusinessCode: 代理商酬金类型:  短信营业厅代理商酬金:SMS_UNIT_MONEY 手机营业厅代理商酬金
-- areacode:  区域编码: 城区:700 乡镇:701 村庄:702
-- SmsUnitMoney 代理商收费金额: 代理商在月统计中实际收费金额
type_cur Sys_Refcursor;
emp_rec cbm_rewardrule%Rowtype;
Begin
   -- dbms_output.put_line('select * from cbm_rewardrule where cbusiness_code= '''|| BusinessCode || ''' And  carea_code= ' || areacode || ' Order By end_value Desc');
    retMoney:=0;
    Open type_cur For 'select * from cbm_rewardrule where cbusiness_code= '''|| BusinessCode || ''' And  carea_code= ' || areacode || ' Order By end_value Desc';
    Loop
        fetch type_cur into emp_rec; exit When type_cur%notfound;
      Begin
   --     dbms_output.put_line(emp_rec.end_value);
          If emp_rec.end_value Is Null Then             --判断酬金规则当中没有最高额限制的一项。
             Begin
               If SmsUnitMoney>emp_rec.begin_value Then          --如果用户的收费总额大于系统最高额的限制。计算该范围内的金额
                 retMoney:=(SmsUnitMoney- emp_rec.begin_value)*emp_rec.nrewardrull;
               End If;
              End;
        End If;
            
         If SmsUnitMoney>=emp_rec.begin_value Then        --判断代理商收费金额大于收费规则中开始值的
           Begin
              If SmsUnitMoney>emp_rec.end_value Then          --判断代理商收费金额大于结束值时:规则结束值-开始值 X 酬金比例
                 retMoney := retMoney+((emp_rec.end_value-emp_rec.begin_value)*emp_rec.nrewardrull);
              Elsif SmsUnitMoney<=emp_rec.end_value Then   --判断代理商收费金额小于结束值是:收费金额-开始值 X 酬金比例        
                  retMoney := retMoney+((SmsUnitMoney-emp_rec.begin_value)*emp_rec.nrewardrull);  
             End If;  
           End; 
         End If;
      End;
      --Case When  Then
      
     -- dbms_output.put_line();
    End Loop;
   
   
    Return retMoney;
End;
 

 

 

 

 

 

下面是我第二个:

create or replace procedure MXL_UPDATE_CBM_REWARD_ACCOUNT(rewardmonth in varchar2,businesscode in varchar2,userid in varchar2 ,retnum out integer ) as
--统计代理商月收费酬金
-- rewardmonth. 统计代理商酬金的帐期
-- businesscode: 业务类型 短信营业厅统计:SMS_UNIT_MONEY 手机营业厅: MONILE_UNIT_MONEY
sys_cur Sys_Refcursor;
changesum cbm_charge_sum%rowtype;
reward cbm_reward%rowtype;
money integer;

begin
        
     retnum:=0;    
          select count(*) into retnum from cbm_charge_sum where cperiod=rewardmonth and cchannel_type=businesscode and cfiled1=1;
     IF retnum>0 Then    
         open sys_cur for select * from cbm_charge_sum where cperiod=rewardmonth and cchannel_type=businesscode and cfiled1=1;
         loop
             fetch sys_cur into changesum; exit When sys_cur %notfound;
   
                    --取得代理商所在的区域:市区、城区、乡镇、村庄
                    --select * from cbm_unti where cnote3=changesum.cunit_id
                   money:=MXL_GET_SMSUNIT_ACCOUNT(businesscode,700,changesum.n_real_fee);
           
                   select * into reward from cbm_reward where CUNIT_CODE=changesum.cunit_code;
               
                      if SQL%notfound then--判断是否已经存在代理商酬金信息
                        begin
                            insert into cbm_reward_account (nserial, cunit_code, cuser_id, cchannel_type,
                            creward_type, nreward_bef, nreward, nreward_af, cperiod, dtdate_cal, cuserid_cal,
                             baudit, cuserid_audit, dtdate_audit, ncancel_serial, nbcancel_fee, cccancel_userid,
                              dtcancel, ctitle, cnote, cfiled1, cfiled2, cfiled3 )
                            values(SEQ_CBM_REWARD_ACCOUNT.Nextval, changesum.cunit_code,
                            changesum.cuser_id,changesum.cperiod,'',0,money,money,changesum.cperiod,sysdate,userid,
                            0,'','','',0,'','','','','','','');
                        end ;
                      else
                        begin
                            insert into cbm_reward_account (nserial, cunit_code, cuser_id, cchannel_type,
                            creward_type, nreward_bef, nreward, nreward_af, cperiod, dtdate_cal, cuserid_cal,
                             baudit, cuserid_audit, dtdate_audit, ncancel_serial, nbcancel_fee, cccancel_userid,
                              dtcancel, ctitle, cnote, cfiled1, cfiled2, cfiled3 )
                            values(SEQ_CBM_REWARD_ACCOUNT.Nextval, changesum.cunit_code,
                            changesum.cuser_id,changesum.cperiod,'',reward.nreward_cur,money,reward.nreward_cur+ money,changesum.cperiod,sysdate,userid,
                            0,'','','',0,'','','','','','','');  
                        end; 
                    end if;
                   
         end loop;
     End if;
     commit;
     exception
     when no_data_found then
          dbms_output.put_line('dddddddddddddddd');
         
end;

 

### Oracle 数据库函数使用说明与示例 #### 1. 基础概念 Oracle 函数是一种 PL/SQL 块,能够执行特定的计算或操作并返回值。可以通过 `CREATE OR REPLACE FUNCTION` 创建自定义函数,并通过 SQL 或 PL/SQL 进行调用[^4]。 #### 2. 字符串处理函数 字符串处理函数在数据清洗和格式化中非常常见。以下是几个常用的字符串处理函数及其示例: - **REPLACE** 将指定子字符串替换为另一个字符串。如果未找到匹配项,则返回原始字符串。 ```sql SELECT REPLACE('Hello, World!', 'World', 'Oracle') AS result FROM dual; -- 输出: Hello, Oracle! ``` - **SUBSTR** 提取字符串的一部分,基于起始位置和长度。 ```sql SELECT SUBSTR('Hello, Oracle!', 8, 7) AS result FROM dual; -- 输出: Oracle! ``` - **INSTR** 返回子字符串首次出现的位置。如果没有找到子字符串,则返回 0。 ```sql SELECT INSTR('Hello, Oracle!', 'Oracle') AS position FROM dual; -- 输出: 8 ``` #### 3. 数学运算函数 数学函数用于数值计算,支持四舍五入、绝对值等操作。 - **ROUND** 对数字进行四舍五入到指定位数。 ```sql SELECT ROUND(123.456, 2) AS rounded_value FROM dual; -- 输出: 123.46 ``` - **ABS** 计算给定数字的绝对值。 ```sql SELECT ABS(-123.456) AS absolute_value FROM dual; -- 输出: 123.456 ``` #### 4. 聚合函数 聚合函数用于对一组记录进行统计分析。 - **AVG** 计算某一列的平均值。 ```sql SELECT AVG(salary) AS average_salary FROM employees; ``` - **COUNT** 统计满足条件的行数。 ```sql SELECT COUNT(*) AS total_employees FROM employees WHERE department_id = 10; ``` - **SUM** 计算某一列的总和。 ```sql SELECT SUM(salary) AS total_salary FROM employees; ``` #### 5. 自定义函数示例 创建一个简单的自定义函数来计算两个整数之和: ```sql CREATE OR REPLACE FUNCTION add_numbers (num1 NUMBER, num2 NUMBER) RETURN NUMBER IS result NUMBER; BEGIN result := num1 + num2; RETURN result; END; / SELECT add_numbers(10, 20) AS sum_result FROM dual; -- 输出: 30 ``` #### 6. 错误处理注意事项 在使用聚合函数时需要注意分组规则。例如,在 `GROUP BY` 子句中使用的列必须显式声明,或者作为聚合函数的结果存在[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值