如何在Oracle PL / SQL中执行存储的功能

问题描述 投票:0回答:1

我要执行此存储的功能,并在表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

提前感谢

sql oracle plsql stored-functions
1个回答
0
投票

它运行完美,但是我不推荐这种设计,因为在功能内执行DML并不是一种好的做法。而是创建一个过程而不是函数,并使用out参数检索ID。

declare 
t_row t%rowtype;
x t.id%type;
begin

select * into t_row from t;
 x :=  t_api.func_ins(t_row);
end;

下面用Procedure实现相同结果的修改代码,

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


select * into t_row from t where id = 1;
 t_api.proc_ins(t_row,x);
 dbms_output.put_line('x '||x);


end;

输出是

x 1
© www.soinside.com 2019 - 2024. All rights reserved.