将函数转换为SQL语句

时间:2014-05-23 09:01:43

标签: sql oracle case

我有一个以下函数,用于根据某些逻辑舍入金额的值 - 目前我在我的SQL中使用此循环函数来获取金额的舍入值 f_round_value(nom_ccy_cd,tran_amt) -

但是,我目前的要求是不使用此功能。相反,我试图直接在SQL中实现相同。我应该使用案例陈述,还是以任何其他方式来实现以下逻辑..

我正在使用oracle 10i

Function f_round_value ( in_t_ccy_cd IN CCY.ccy_cd%TYPE, in_n_amt IN NUMBER)
RETURN VARCHAR2 AS  
    ln_dec_place_cnt CCY.decimal_place_cnt%TYPE;    
    ln_out_amt       NUMBER; 
    lv_out_amt_str   VARCHAR2(30); 
    lb_decimal_reqd  BOOLEAN :=TRUE;
    lb_neg_val       BOOLEAN :=FALSE;
BEGIN  
    IF in_n_amt IS NULL THEN
        lv_out_amt_str:=NULL; 
    ELSE IF in_n_amt < 0 THEN
        lb_neg_val:=TRUE;
    END IF;
    IF in_t_ccy_cd IN (C_CCY_CD_JP, C_CCY_CD_IT, C_CCY_CD_IR, C_CCY_CD_KR) THEN 
        ln_dec_place_cnt :=0;  
        lb_decimal_reqd:=FALSE;
    ELSE
        ln_dec_place_cnt :=2;  lb_decimal_reqd:=TRUE;
    END IF;
    ln_out_amt:=ROUND(in_n_amt,ln_dec_place_cnt);
    IF lb_decimal_reqd THEN
        lv_out_amt_str:=TRIM(TO_CHAR(ln_out_amt,'S999,999,999,999,990.99'));
    ELSE
        lv_out_amt_str:=TRIM(TO_CHAR(ln_out_amt,'S999,999,999,999,999'));
    END IF;
    IF lb_neg_val THEN
        lv_out_amt_str:='('||SUBSTR(lv_out_amt_str,2)||')';
    ELSE
        lv_out_amt_str:= SUBSTR(lv_out_amt_str,2);
    END IF;
END

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

你确实知道有三位小数的货币不是吗?无论如何,你没有显示CCY表的完整内容,但如果它应该包含每种货币的小数位,那么你很幸运。你有你需要的一切。以下是包含4种货币的示例CCY表以及包含每种货币值的列表。

WITH
CCY AS(
  SELECT  'BGN' ccy_cd, '975' ccy_id, 2 DecPlaces, 'Bulgarian lev' CCY_Name, 'Bulgaria' Cntry FROM dual UNION ALL
  SELECT  'BHD', '048', 3, 'Bahraini dinar', 'Bahrain' FROM dual UNION ALL
  SELECT  'BIF', '108', 0, 'Burundian franc', 'Burundi' FROM dual UNION ALL
  SELECT  'BMD', '060', 2, 'Bermudian dollar', 'Bermuda' FROM dual
),
CcyValues as(
  SELECT  'BGN' ccy_cd, 15.852 amt FROM dual UNION ALL
  SELECT  'BHD', -15.852 FROM dual UNION ALL
  SELECT  'BIF', 15.852 FROM dual UNION ALL
  SELECT  'BMD', -15.852 FROM dual
)
SELECT  v.ccy_cd, v.amt, y.DecPlaces,
        translate( to_char( round( v.amt, y.DecPlaces ), 
          CASE y.DecPlaces
            WHEN 2 THEN 'FM999,999,999,999,990.99PR'
            WHEN 3 THEN 'FM999,999,999,999,990.999PR'
            ELSE 'FM999,999,999,999,990PR'
          END ), '<>', '()' ) Amt_Str
FROM    CcyValues v 
JOIN    CCY       y
  on    y.ccy_cd = v.ccy_cd;