如何在 Oracle PL/SQL 中执行存储函数

Posted

技术标签:

【中文标题】如何在 Oracle PL/SQL 中执行存储函数【英文标题】:How to execute stored function in Oracle PL/SQL 【发布时间】:2020-04-29 23:51:41 【问题描述】:

我想执行这个存储的函数,并在表 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】:

它工作得很好,但是我不推荐这种设计,因为它不是在函数中执行 DML 的好习惯。而是创建一个过程而不是函数并使用 out 参数检索 Id。

当表为空时测试函数的匿名块。您为 %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

下面是用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


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

【讨论】:

非常感谢,但我无法在表格中插入您的回答 为什么不呢?你得到了什么?它实际上是做什么的?只是说你不能插入是完全没用的。 当我执行声明 t_row t%rowtype; x t.id%type;从 t 开始选择 * 进入 t_row; x := t_api.func_ins(t_row);结尾;我收到 ORA-01403 NO_DATA_FOUND 错误 我想用这个函数在表中插入数据。表是空的 现在修改代码以在表格为空时插入。在这里你给 %ROWTYPE 变量赋值然后你插入。我已经测试了代码。

以上是关于如何在 Oracle PL/SQL 中执行存储函数的主要内容,如果未能解决你的问题,请参考以下文章

PL_sql如何执行oracle存储过程

在 ASP.NET MVC Core(C#) 中执行 Oracle 存储过程 (PL/SQL)

PL/SQL学习笔记_03_存储函数与存储过程

如何在pl / sql中同时在不同会话中执行存储过程

PL-SQL 存储函数和存储过程

执行存储过程 - Oracle PL SQL