簡體   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