ORA-01722: неверный номер, когда я пытаюсь выполнить процедуру сохранения. Oracle ошибка - PullRequest
0 голосов
/ 15 января 2020

Я знаю, что ORA-01722 происходит, когда я пытаюсь преобразовать недопустимый символ в число. Например: «a123». В этом случае я только пытаюсь создать условие where, где параметр является идентификатором таблицы, а параметр определяется на основе типа таблицы.

PROCEDURE SP_CPR_AGRUPAR_COMPRA(ID_SOLICITUD IN cpr_solicitud.id%type, ID_GRUPO IN cpr_solicitud.ID_GRUPO%type ) AS
BEGIN

 UPDATE cpr_solicitud
 SET ID_GRUPO=ID_GRUPO
 WHERE id=ID_SOLICITUD;

END SP_CPR_AGRUPAR_COMPRA;

Я пытаюсь отформатировать ID_SOLICITUD с функцией TO_NUMBER, но ошибка продолжается. Примерно так:

UPDATE cpr_solicitud
SET ID_GRUPO=ID_GRUPO
WHERE id=TO_NUMBER(ID_SOLICITUD);

Я сделал тест, передавая непосредственно информацию, и она работает.

UPDATE cpr_solicitud SET ID_GRUPO = 18 WHERE id = 942000;

Я провел много тестов, и пришел вывод, что ошибка связана с ID_SOLICITUD параметр. Я не знаю почему, но если я передаю ID_GRUPO и оставляю ID_SOLICITUD, это работает.

Это работает:

UPDATE cpr_solicitud
SET ID_GRUPO=ID_GRUPO
WHERE id=1

Это не работает:

UPDATE cpr_solicitud
SET ID_GRUPO=1
WHERE id=TO_NUMBER(ID_SOLICITUD);

1 Ответ

2 голосов
/ 15 января 2020

Как указано в документации :

Если оператор SQL ссылается на имя, которое принадлежит как столбцу, так и локальной переменной или формальному параметру, тогда Имя столбца имеет приоритет.

Внимание : Когда имя переменной или параметра интерпретируется как имя столбца, данные могут быть удалены, изменены или добавлены непреднамеренно.

В вашем коде

SET ID_GRUPO=ID_GRUPO

явно попадает в это предупреждение, как намекнул @Bob. Каждая строка, которая соответствует фильтру, будет обновлена ​​с ее текущим значением (т.е. ничего не меняется), а не значением, переданным в процедуру. Как вы подтвердили в комментарии, что в таблице также есть столбец с именем ID_SOLICITUD, так же:

WHERE id=ID_SOLICITUD;

Вы получаете сообщение об ошибке, поскольку оно неявно преобразует значение столбца от ID_SOLICITUD - который, предположительно, не является цифрой c - до числа, которое можно сравнить с id. Значение параметра ID_SOLICITUD не используется, поэтому его тип данных не имеет значения. Вы эффективно делаете:

UPDATE cpr_solicitud
SET cpr_solicitud.ID_GRUPO=cpr_solicitud.ID_GRUPO
WHERE cpr_solicitud.id=cpr_solicitud.ID_SOLICITUD;

, что явно не то, что вы хотели. Если вы запустите этот оператор для него, вы получите ту же ошибку.

Вы можете использовать префикс имен переменных с тем объектом, которому они на самом деле принадлежат:

PROCEDURE SP_CPR_AGRUPAR_COMPRA(ID_SOLICITUD IN cpr_solicitud.id%type, ID_GRUPO IN cpr_solicitud.ID_GRUPO%type ) AS
BEGIN

 UPDATE cpr_solicitud
 SET ID_GRUPO=SP_CPR_AGRUPAR_COMPRA.ID_GRUPO
 WHERE id=SP_CPR_AGRUPAR_COMPRA.ID_SOLICITUD;

END SP_CPR_AGRUPAR_COMPRA;

или (проще и безопасно, возможно) измените имена, например, с простым префиксом:

PROCEDURE SP_CPR_AGRUPAR_COMPRA(p_ID_SOLICITUD IN cpr_solicitud.id%type, p_ID_GRUPO IN cpr_solicitud.ID_GRUPO%type ) AS
BEGIN

 UPDATE cpr_solicitud
 SET ID_GRUPO=p_ID_GRUPO
 WHERE id=p_ID_SOLICITUD;

END SP_CPR_AGRUPAR_COMPRA;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...