#oracle #plsql #stored-functions
#Oracle #plsql #сохраненные функции
Вопрос:
возможно ли обновить таблицу внутри функции? Потому что мой ничего не делает..
CREATE OR REPLACE FUNCTION rep_ort(id INT, status VARCHAR2, end_date DATE, explanation VARCHAR2)
RETURN VARCHAR2
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
UPDATE reports
SET
id = id,
status = status,
end_date = end_date,
explanation = explanation;
commit;
RETURN 'Updated';
END;
select rep_ort('5','Closed','2021-01-12 17:30','Client fault') from dual;
Комментарии:
1. Вероятно, не связано: разве вы не должны использовать идентификатор в предложении WHERE вместо предложения SET?
2. Может быть, но как это должно выглядеть? где id = id?
3. ГДЕ id = id ничего не делает…
4. Используйте имя параметра, отличное от имени столбца
5. Вы должны использовать определенную процедуру. Когда вы делаете ОБНОВЛЕНИЕ (или любой другой DML) в функции, вы не можете использовать его как
select rep_ort(...) from dual
, используйтеbegin ret:= rep_ort(...); end;
Ответ №1:
Ваш ничего не делает, потому что вы назвали параметры с тем же именем, что и столбцы, поэтому вы просто обновляете всю таблицу до тех же значений.
Переименовать параметры и, возможно, включить WHERE
предложение.
Хотя вы можете это сделать, процедуры предназначены для использования с такой целью.
CREATE OR REPLACE FUNCTION rep_ort
(p_id INT, p_status VARCHAR2, p_end_date DATE, p_explanation VARCHAR2)
RETURN VARCHAR2
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
UPDATE reports
SET
id = p_id,
status = p_status,
end_date = p_end_date,
explanation = p_explanation;
commit;
RETURN 'Updated';
END;
Комментарии:
1. Чувак, это было оно!! Мне нужно было использовать предложение WHERE, но это было все. Это освещено, большое вам спасибо. <3
2. @Trapist_e: Пожалуйста, отметьте ответ как решаемый.
3. Возможно, WHERE решил вашу непосредственную проблему, но я бы повторил комментарий @wernfried Domscheit о том, что вы не должны использовать функцию для этого. Предполагаемая цель функции — возвращать значение, а не изменять данные.