如何在 Oracle PL/SQL 中执行存储函数
How to execute stored function in Oracle PL/SQL
我要执行这个存储函数,并在tablet中插入数据
我试图找到解决方案,但没有成功
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
提前致谢
它工作得很好,但是我不推荐这种设计,因为它不是在函数内执行 DML 的好习惯。而是创建一个过程而不是函数,并使用 out 参数检索 Id。
当 table 为 empty.You 时用于测试函数的匿名块 empty.You 为 %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
我要执行这个存储函数,并在tablet中插入数据 我试图找到解决方案,但没有成功
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
提前致谢
它工作得很好,但是我不推荐这种设计,因为它不是在函数内执行 DML 的好习惯。而是创建一个过程而不是函数,并使用 out 参数检索 Id。
当 table 为 empty.You 时用于测试函数的匿名块 empty.You 为 %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