ORA-06502 в хранимой процедуре - PullRequest
0 голосов
/ 03 мая 2020

Здравствуйте, у меня есть эта простая процедура, которая прекрасно компилируется, но после того, как я инициализирую переменные, ошибка выглядит следующим образом.

Таблица создается следующим образом

Create table vcelar_pomocky 
(
    cislo_nakupu Number(5,0) NOT NULL ,
    cislo_ula Number(5,0) NOT NULL ,
    rodne_cislo Varchar2 (30) NOT NULL ,
    datum_nakupu Date NOT NULL ,
    nazov Varchar2 (20) NOT NULL ,
    typ_polozky Varchar2 (20) NOT NULL ,
    cena_polozky Number(5,2) NOT NULL ,

    primary key (cislo_nakupu) 
) 
/

Процедура выглядит следующим образом:

CREATE OR REPLACE PROCEDURE quera_pomocky
(
v_cislo_nakupu  IN  VCELAR_POMOCKY.cislo_nakupu%TYPE,
v_nazov         OUT VCELAR_POMOCKY.nazov%TYPE,
v_cena_polozky  OUT VCELAR_POMOCKY.cena_polozky%TYPE
)
IS
BEGIN
    SELECT  nazov || ' ' || typ_polozky,cena_polozky
        INTO v_nazov,v_cena_polozky
        FROM VCELAR_POMOCKY
        WHERE v_cislo_nakupu = cislo_nakupu AND rodne_cislo = '750927/3913';
END quera_pomocky;
/

VARIABLE p_nazov VARCHAR2(20);
VARIABLE p_cena_polozky VARCHAR2(20);
EXECUTE quera_pomocky(24, :p_nazov , :p_cena_polozky);
PRINT p_nazov p_cena_polozky;

И ошибка

Ошибка запуска в строке: 65 в команде -
BEGIN quera_pomocky (24,: p_nazov,: p_cena_polozky); КОНЕЦ;

Отчет об ошибке:

ORA-06502: PL / SQL: цифра c или ошибка значения
ORA-06512: в "DOMA.QUERA_POMOCKY", строка 9
ORA-06512: в строке 1
06502. 00000 - "PL / SQL: цифра c или ошибка значения% s"
* Причина: арифметическая c, цифра c, строка произошла ошибка преобразования или ограничения. Например, эта ошибка возникает, если предпринята попытка присвоить значение NULL переменной, объявленной NOT NULL, или если сделана попытка присвоить целое число больше 99 переменной
, объявленной NUMBER (2).

* Действие: измените данные, способы их манипулирования или способ их объявления, чтобы значения не нарушали ограничения.

1 Ответ

3 голосов
/ 03 мая 2020

Вы помещаете это:

nazov || ' ' || typ_polozky

в параметр

v_nazov OUT VCELAR_POMOCKY.nazov%TYPE

, который - в таблице - объявлен как

nazov Varchar2 (20)

Итак: если длина nazov || ' ' || typ_polozky превышает 20 символов (учтите, что оба - в таблице - объявлены как varchar2(20), что делает MAX длина 41 этой конкатенации), у вас проблемы.

Я бы посоветовал вам установить OUT параметр, например,

v_nazov OUT varchar2(50)
...