首页 > 解决方案 > ORA-06502: PL/SQL: 数字或值错误: 包函数中的字符到数字转换错误

问题描述

我正在尝试创建一个函数,该函数返回流水线表,输入参数为 varchar2、日期或数字。我正在尝试将金额输入为 varchar2,因为我无法像处理小数点前带逗号的数字一样处理它。这是我的包函数的主体:

 FUNCTION kreiraj_reprogram_rate (p_sifra_kupca             VARCHAR2,
                                     p_id_kartice_kupca        NUMBER,
                                     p_iznos_s_pdv             VARCHAR2,
                                     p_broj_rata               NUMBER,
                                     p_frekvencija_dospijeca   NUMBER,
                                     p_datum_dospijeca         VARCHAR2,
                                     p_datum_dokumenta         VARCHAR2)
        RETURN reprogram_rate_table
        PIPELINED
    IS
        v_data              reprogram_rate_rec;
        v_user              VARCHAR2 (200) := mc__secure_context.get_context_username ();
        v_iznos_rate        NUMBER;
        v_broj_rate         NUMBER;
        v_zadnja_rata       NUMBER;
        v_datum_dokumenta   DATE;
        v_datum_dospijeca   DATE;
    BEGIN
    write_log_table ('TEST','p_iznos_s_pdv: '|| to_number(p_iznos_s_pdv));
        v_datum_dospijeca := TO_DATE (p_datum_dospijeca, 'dd.mm.yyyy');
        v_datum_dokumenta := TO_DATE (p_datum_dokumenta, 'dd.mm.yyyy');

        v_iznos_rate := ROUND (to_number(p_iznos_s_pdv) / p_broj_rata, 2);
        v_zadnja_rata :=
            p_iznos_s_pdv - ROUND ((p_broj_rata - 1) * v_iznos_rate, 2);
        v_broj_rate := 1;

        FOR r IN 1 .. p_broj_rata
        LOOP
            IF v_broj_rate = p_broj_rata
            THEN
                v_data.osnovica := ROUND ((v_zadnja_rata / 1.25), 2);
                v_data.pdv := ROUND (v_zadnja_rata * 0.2, 2);
                v_data.ukupno := v_zadnja_rata;
            ELSE
                v_data.osnovica := ROUND ((v_iznos_rate / 1.25), 2);
                v_data.pdv := ROUND (v_iznos_rate * 0.2, 2);
                v_data.ukupno := ROUND (v_iznos_rate, 2);
            END IF;

            v_data.sifra_kupca := p_sifra_kupca;
            v_data.kartica_kupca := p_id_kartice_kupca;
            v_data.broj_rate := v_broj_rate;
            v_data.datum_dokumenta := v_datum_dokumenta;
            v_data.datum_dospijeca := v_datum_dospijeca;

            PIPE ROW (v_data);

            v_broj_rate := v_broj_rate + 1;

            v_datum_dospijeca :=
                CASE
                    WHEN p_frekvencija_dospijeca = 1
                    THEN
                        ADD_MONTHS (v_datum_dospijeca, 1)
                    WHEN p_frekvencija_dospijeca = 3
                    THEN
                        ADD_MONTHS (v_datum_dospijeca, 3)
                    WHEN p_frekvencija_dospijeca = 6
                    THEN
                        ADD_MONTHS (v_datum_dospijeca, 6)
                    WHEN p_frekvencija_dospijeca = 12
                    THEN
                        ADD_MONTHS (v_datum_dospijeca, 12)
                END;
        END LOOP;
    END kreiraj_reprogram_rate;

并且错误说错误出现在我尝试将值 4159,57 转换为数字的第一行 write_log_table 上。

我尝试 select to_number('4159,57') from dual in SQL developer,它工作得很好,所以我不知道有什么问题。

有人可以帮忙吗?

谢谢。

标签: sqlplsqloracle-sqldeveloperplsql-packageoracle21c

解决方案


推荐阅读