Oracle 如何以记录类型返回多个值
我想知道如何使用记录类型的PL/SQL返回多个值 下面是我的示例代码:-Oracle 如何以记录类型返回多个值,oracle,plsql,Oracle,Plsql,我想知道如何使用记录类型的PL/SQL返回多个值 下面是我的示例代码:- CREATE OR REPLACE FUNCTION "FN_TESTING" ( TESTING1 IN VARCHAR2 ) RETURN TEST4_TEST as TEST2 TEST4_TEST%ROWTYPE; CURSOR TEST1 IS SELECT '1','2' FROM DUAL; BEGIN OPEN TEST1; FETCH TEST1 INTO TEST2;
CREATE OR REPLACE FUNCTION "FN_TESTING"
(
TESTING1 IN VARCHAR2
) RETURN TEST4_TEST as
TEST2 TEST4_TEST%ROWTYPE;
CURSOR TEST1 IS
SELECT '1','2' FROM DUAL;
BEGIN
OPEN TEST1;
FETCH TEST1
INTO TEST2;
CLOSE TEST1;
RETURN TEST2;
END FN_TESTING;
我确实检查了我的函数,它向我显示了一条警告消息:必须声明我的TEST4\u TEST
我能知道这个函数有什么问题吗?以及我如何为这个
TEST4\u TEST
进行声明?是的,我们可以从PLSQL函数/过程返回记录变量。但首先必须申报
create or replace function get_employee
(p_empl_no in employee.empl_no%type)
return employee%rowtype
as
l_cust_record employee%rowtype;
begin
select * into l_cust_record from employee
where empl_no = p_empl_no;
return(l_cust_record);
end;
/
是的,我们可以从PLSQL函数/过程返回记录变量。但首先必须申报
create or replace function get_employee
(p_empl_no in employee.empl_no%type)
return employee%rowtype
as
l_cust_record employee%rowtype;
begin
select * into l_cust_record from employee
where empl_no = p_empl_no;
return(l_cust_record);
end;
/
也可以尝试以下方法:
declare TYPE t_deptrec IS RECORD
(
name dept.dname%type,
location dept.loc%type
);
CURSOR c_emp is
select ename,deptno from emp;
r_dept t_deptrec;
function getDept(p_deptno dept.deptno%type) return t_deptrec is
r_dept t_deptrec;
begin
select dname,loc into r_dept
from dept where deptno = p_deptno;
return r_dept;
end;
BEGIN
for r_emp in c_emp
loop
r_dept := getDept(r_emp.deptno);
dbms_output.put_line(r_emp.ename || ',' || r_dept.name || ',' || r_dept.location);
end loop;
END;
也可以尝试以下方法:
declare TYPE t_deptrec IS RECORD
(
name dept.dname%type,
location dept.loc%type
);
CURSOR c_emp is
select ename,deptno from emp;
r_dept t_deptrec;
function getDept(p_deptno dept.deptno%type) return t_deptrec is
r_dept t_deptrec;
begin
select dname,loc into r_dept
from dept where deptno = p_deptno;
return r_dept;
end;
BEGIN
for r_emp in c_emp
loop
r_dept := getDept(r_emp.deptno);
dbms_output.put_line(r_emp.ename || ',' || r_dept.name || ',' || r_dept.location);
end loop;
END;
将TEST4_TEST视为一个类型为Record的变量。这个变量就像NUMBER、VARCHAR、DATE一样。唯一的区别是,这些已经由Oracle定义,但对于集合和记录,我们必须定义自己的集合和记录。 根据您的示例,您似乎希望返回一个带有2个数字值的记录,然后您应该定义如下
CREATE OR REPLACE PACKAGE TEST4_TEST1
AS
TYPE TEST4_TEST Is record
(
COL1 INTEGER,
COL2 INTEGER
);
END;
CREATE OR REPLACE FUNCTION FN_TESTING (testing1 IN VARCHAR2)
RETURN TEST4_TEST1.test4_test
AS
test3 TEST4_TEST1.test4_test;
CURSOR test2
IS
SELECT '1', '2' FROM DUAL;
A
BEGIN
OPEN test2;
FETCH test2 INTO test3;
CLOSE test2;
RETURN test3;
END fn_testing;
将TEST4_TEST视为一个类型为Record的变量。这个变量就像NUMBER、VARCHAR、DATE一样。唯一的区别是,这些已经由Oracle定义,但对于集合和记录,我们必须定义自己的集合和记录。 根据您的示例,您似乎希望返回一个带有2个数字值的记录,然后您应该定义如下
CREATE OR REPLACE PACKAGE TEST4_TEST1
AS
TYPE TEST4_TEST Is record
(
COL1 INTEGER,
COL2 INTEGER
);
END;
CREATE OR REPLACE FUNCTION FN_TESTING (testing1 IN VARCHAR2)
RETURN TEST4_TEST1.test4_test
AS
test3 TEST4_TEST1.test4_test;
CURSOR test2
IS
SELECT '1', '2' FROM DUAL;
A
BEGIN
OPEN test2;
FETCH test2 INTO test3;
CLOSE test2;
RETURN test3;
END fn_testing;
我可以知道您提到的员工是对象还是参数传入吗?现在我面临这个问题,函数GET_的编译错误员工错误:PLS-00310:对于%ROWTYPE属性,“employee”必须命名一个表,游标或游标变量行:4文本:返回员工%rowtype为错误:PL/SQL:编译单元分析终止行:1文本:创建或替换函数get_employee(F_CONTRACT_TYP在varchar2中,Hi employee是表名。表名必须存在于数据库中。我所做的是,我获取了employee类型的记录,这意味着它具有employee表的结构。并声明了一个employee类型的变量。因为我正在从employee表中选择完整的行,并获取l_cust_记录。它必须是员工类型/。创建或替换函数get_employee(dnkcategory_match_tbl.pallet_grade%type)返回dnkcategory_match_tbl%行类型为l_Custom_record dnkcategory_match_%行类型;开始从dnkcategory_match_tbl选择*到l_Custom_记录,其中pallet_grade=p_Employ_no和pallet_CODE='LPA'和grade='AE';返回(客户记录);end;我可以知道您提到的员工是对象还是参数传入了吗?现在我面临这个问题:函数GET_的编译错误员工错误:PLS-00310:使用%ROWTYPE属性,“员工”必须命名一个表、游标或游标变量行:4 Text:返回员工%ROWTYPE是错误:PL/SQL:编译单元分析终止行:1 Text:创建或替换函数get_employee(F_CONTRACT_TYP在varchar2中,Hi employee是表名。表名必须存在于数据库中。我所做的是,我获取了employee类型的记录,这意味着它具有employee表的结构。并声明了一个employee类型的变量。因为我正在从employee表中选择完整的行,并获取l_cust_记录。它必须是员工类型/。创建或替换函数get_employee(dnkcategory_match_tbl.pallet_grade%type)返回dnkcategory_match_tbl%行类型为l_Custom_record dnkcategory_match_%行类型;开始从dnkcategory_match_tbl选择*到l_Custom_记录,其中pallet_grade=p_Employ_no和pallet_CODE='LPA'和grade='AE';返回(客户记录);结束;