繁体   English   中英

将函数转换为SQL语句

[英]convert a function into SQL statement

我有一个下面的函数,用于根据一些逻辑舍入金额的值-当前,我在SQL中使用此舍入函数将金额的舍入值作为f_round_value(nom_ccy_cd,tran_amt) -

但是,我当前的要求是不要使用此功能。 相反,我试图直接在SQL中实现相同的目标。 我是否应该使用case语句或其他任何方式来实现以下逻辑。

我正在使用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

任何帮助将不胜感激。

您确实知道有些货币的小数点后三位对吗? 无论如何,您不会显示CCY表的完整内容,但是如果它应该包含每种货币的小数位,那么您很幸运。 您拥有所需的一切。 这是一个示例CCY表,其中包含4种货币和一个列表,其中包含每种货币的值。

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM