Sql ORA-01830将数字转换为文字时

Sql ORA-01830将数字转换为文字时,sql,oracle,Sql,Oracle,高值是十进制格式,例如-100.10,我想把它转换成word,所以我在下面写脚本,但没有通过它执行 SELECT SYMBOL, HIGH, UPPER(TO_CHAR(TO_DATE(HIGH,'J'),'JSP')) AMT_IN_WORDS FROM BHAV; 获取错误 ORA-01830 请纠正我的错误 提前感谢您…由于您显示的高的值是一个十进制,与100.00不同,它不能隐式转换为整数,因此会出现错误。因此,它不能转换为朱利安日期 SELECT UPPER(TO_CHAR(TO

高值是十进制格式,例如-
100.10
,我想把它转换成word,所以我在下面写脚本,但没有通过它执行

SELECT SYMBOL, HIGH, UPPER(TO_CHAR(TO_DATE(HIGH,'J'),'JSP'))
AMT_IN_WORDS FROM BHAV; 
获取错误

ORA-01830

请纠正我的错误


提前感谢您…

由于您显示的
的值是一个十进制,与100.00不同,它不能隐式转换为整数,因此会出现错误。因此,它不能转换为朱利安日期

SELECT  UPPER(TO_CHAR(TO_DATE(100.10,'J'),'JSP'))AMT_IN_WORDS FROM DUAL;
这导致

ORA-01830:日期格式图片在转换整个输入之前结束 串

这可以通过将小数舍入到最接近的整数来解决

SELECT  UPPER(TO_CHAR(TO_DATE(ROUND(100.10),'J'),'JSP'))AMT_IN_WORDS FROM DUAL;

| AMT_IN_WORDS |
|--------------|
|  ONE HUNDRED |


如果您确实也需要float组件,尽管有限,您可以参考此答案的EDIT2:

您可以创建一个函数

CREATE OR REPLACE FUNCTION big_amt_in_words (p_input VARCHAR2) RETURN VARCHAR2
IS
   v_running_input NUMBER;
   v_num NUMBER;
   v_amt_in_words VARCHAR2(2000);
BEGIN
   v_running_input := P_input;
   FOR i IN (
             SELECT RPAD(1, (rownum*3)+1, 0) num_value,
                    CASE LENGTH(RPAD(1, (rownum*3)+1, 0))
                        WHEN 4 THEN 'THOUSAND'
                        WHEN 7 THEN 'MILLION'
                        WHEN 10 THEN 'BILLION'
                        WHEN 13 THEN 'TRILLION'
                        WHEN 16 THEN 'QUADRILLION'
                        WHEN 19 THEN 'QUINTILLION'
                        WHEN 22 THEN 'SEXTILLION'
                        WHEN 25 THEN 'SEPTILLION'
                        WHEN 28 THEN 'OCTILLION'
                    END place_value
              FROM DUAL
           CONNECT BY rownum < 10
             ORDER BY rownum desc)
    LOOP
        v_num := TRUNC(v_running_input/i.num_value,0);
        IF v_num > 0 THEN
            v_amt_in_words := v_amt_in_words||' '||TO_CHAR(TO_DATE(v_num,'J'), 'JSP')||' '||i.place_value;
            v_running_input := v_running_input - (v_num * i.num_value);
        END IF;
    END LOOP;
    v_amt_in_words := v_amt_in_words||' '||TO_CHAR(TO_DATE(TRUNC(v_running_input),'J'), 'JSP')
                      ||' AND '||UPPER(TO_CHAR(TO_DATE((ROUND(v_running_input-TRUNC(v_running_input),2)*100),'J'),'JSP'))||' CENTS';
    RETURN TRIM(v_amt_in_words);
END;
/

你需要大声一点,我们听不见你的声音。我救了你一命。。永远记住,提问时不要全部使用大写字母。它被认为是在叫喊。有没有其他方法可以转换文字中的值和十进制值???@N.kotadia:你是否参考了我在最后分享的链接中的答案?
SELECT BIG_AMT_IN_WORDS(65763245345658.12) amt_in_words 
  FROM DUAL;

Output
---------------------------------------------
SIXTY-FIVE TRILLION SEVEN HUNDRED SIXTY-THREE BILLION TWO HUNDRED FORTY-FIVE MILLION THREE HUNDRED FORTY-FIVE THOUSAND SIX HUNDRED FIFTY-EIGHT AND TWELVE CENTS