Могу ли я выполнить обновление внутри функции PL / SQL?

#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 о том, что вы не должны использовать функцию для этого. Предполагаемая цель функции — возвращать значение, а не изменять данные.