Как выполнить хранимую функцию в Oracle PL / SQL - PullRequest
0 голосов
/ 30 апреля 2020

Я хочу выполнить эту сохраненную функцию и вставить данные в таблицу t Я пытался найти решение, но безуспешно

CREATE TABLE t (id number
              , name varchar2(32)
              , time date);

CREATE OR REPLACE PACKAGE t_api AS
    FUNCTION func_ins (
        p_row IN t%rowtype
    ) RETURN 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;
END t_api;
/


declare
p_row t%rowtype;
begin
p_row.id := 1;
p_row.name := 'name';
p_row.time := sysdate;
t_api.func_ins(p_row);
end;
/

Я получил

PLS-00221

Заранее спасибо

1 Ответ

1 голос
/ 30 апреля 2020

Он отлично работает, однако я бы не рекомендовал этот дизайн, так как не рекомендуется выполнять 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...