Он отлично работает, однако я бы не рекомендовал этот дизайн, так как не рекомендуется выполнять DML внутри функции. Вместо этого создайте процедуру вместо функции и получите Id, используя параметр out.
Анонимный блок для проверки функции, когда таблица пуста. Вы присваиваете значения переменной% ROWTYPE и вставляете.
declare
t_row t%rowtype;
x t.id%type;
begin
t_row.id := 2;
t_row.name := 'Test2';
t_row.time := sysdate;
x := t_api.func_ins(t_row);
dbms_output.put_line('x '||x);
end;
Выходные данные
x 2
Ниже приведен модифицированный код с процедурой для достижения того же результата,
CREATE OR REPLACE PACKAGE t_api AS
FUNCTION func_ins (
p_row IN t%rowtype
) RETURN t.id%TYPE;
PROCEDURE proc_ins (
p_row IN t%rowtype,
l_id out t.id%TYPE
);
END t_api;
/
CREATE OR REPLACE PACKAGE BODY t_api AS
FUNCTION func_ins (
p_row IN t%rowtype
) RETURN t.id%TYPE
IS
l_id t.id%TYPE;
BEGIN
INSERT INTO t VALUES p_row RETURNING id INTO l_id;
RETURN l_id;
END func_ins;
PROCEDURE proc_ins (
p_row IN t%rowtype,
l_id out t.id%TYPE
)
IS
BEGIN
INSERT INTO t VALUES p_row RETURNING id INTO l_id;
END proc_ins;
END t_api;
/
Анонимный блок для проверки процедуры,
declare
t_row t%rowtype;
x t.id%type;
begin
t_row.id := 3;
t_row.name := 'Test3';
t_row.time := sysdate;
t_api.proc_ins(t_row,x);
dbms_output.put_line('x '||x);
end;
Выход составляет
x 3