Как указано в документации :
Если оператор 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;