Как обновить запись в процедуре с параметром %ROWTYPE?
Как обновить запись в процедуре с параметром %ROWTYPE?
PROCEDURE p_update (
p_id IN t.id%TYPE,
p_row IN t%rowtype) IS
BEGIN
UPDATE t SET row = p_row
WHERE id = p_id;
END p_update;
declare
t_row t%rowtype;
t_id t.id%type;
begin
t_row.name := 'TEST';
t_id := 10;
pck_api.p_update(t_row, t_id);
end;
Получаю ошибку:
PLS-00306 wrong number or types of arguments
Свободный перевод вопроса How to execute UPDATE stored procedure with %ROWTYPE от участника Pavlos04
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Причина ошибки - параметры перепутаны местами. Но это ещё не всё, все атрибуты переменной с типом %ROWTYPE изначально NULL, включая соответствующие столбцы таблицы с ограничением NOT NULL. Их надо инициализировать до обновления.
Вот пример, как это надо сделать:
create table t (id int, name varchar2 (8), dt date not null)
/
insert into t values (10, 'aaa', date'2020-08-27');
create or replace package pck_api as
function gett (id t.id%type) return t%rowtype;
procedure updt (id t.id%type, trow t%rowtype);
end;
/
create or replace package body pck_api as
function gett (id t.id%type) return t%rowtype is
ret t%rowtype;
begin
select * into ret
from t where id = gett.id for update;
return ret;
end;
procedure updt (id t.id%type, trow t%rowtype) is
begin
update t set row = trow where id = updt.id;
end;
end;
/
Так использовать:
var rc refcursor
declare
trow t%rowtype;
id t.id%type := 10;
begin
trow := pck_api.gett (id);
trow.name := 'bbb';
trow.dt := date'2020-08-28';
pck_api.updt(id, trow);
open :rc for select * from t;
end;
/
ID NAME DT
---------- -------- -------------------
10 bbb 2020-08-28 00:00:00