Oracle函数返回(id,count)格式查询结果应选择什么返回值类型?
问题解决:Oracle函数返回查询结果的正确返回类型选择
你遇到的编译错误核心是返回值类型声明与实际返回变量不匹配:你当前函数头定义的返回类型为user_tables.num_rows%TYPE,这是单个数字类型,而你实际要返回的是存储了多行两列结果的游标变量,二者类型完全不兼容。
根据你的实际需求,可选择以下两种解决方案:
方案1:返回完整结果集(所有univ_id对应的讲师数量)
如果你的需求是返回查询得到的所有(univ_id, 讲师数量)行给调用方遍历处理,直接将函数返回值类型修改为SYS_REFCURSOR即可,修正后的代码如下:
CREATE OR REPLACE FUNCTION GetMaximum (first_univer IN Integer,second_univer IN Integer,subj_name IN NVARCHAR(30)) RETURN SYS_REFCURSOR -- 修正返回类型为游标类型 AS rf_cur sys_refcursor; BEGIN OPEN rf_cur for SELECT Lec.univ_id,Count(Lec.lecturer_id) FROM D8_SUBJECT Sub JOIN D8_SUBJ_LECT SubLect ON Sub.subj_id = SubLect.subj_id JOIN D8_LECTURER Lec ON SubLect.LECTURER_ID = Lec.LECTURER_ID WHERE Sub.subj_name = subj_name AND univ_id BETWEEN first_univer AND second_univer Group BY Lec.univ_id; return rf_cur; END GetMaximum; /
调用这个函数后,你可以从返回的游标中逐行读取两个字段的值。
方案2:直接返回最大讲师数量(匹配函数名GetMaximum的语义)
如果你的函数目的是直接返回指定范围内、教指定科目的讲师数量的最大值,不需要返回完整结果集,就不需要用游标,直接查询最大值返回即可,代码如下:
CREATE OR REPLACE FUNCTION GetMaximum (first_univer IN Integer,second_univer IN Integer,subj_name IN NVARCHAR(30)) RETURN INTEGER AS max_lect_count INTEGER; BEGIN SELECT MAX(lect_count) INTO max_lect_count FROM ( SELECT Count(Lec.lecturer_id) lect_count FROM D8_SUBJECT Sub JOIN D8_SUBJ_LECT SubLect ON Sub.subj_id = SubLect.subj_id JOIN D8_LECTURER Lec ON SubLect.LECTURER_ID = Lec.LECTURER_ID WHERE Sub.subj_name = subj_name AND univ_id BETWEEN first_univer AND second_univer Group BY Lec.univ_id ); RETURN max_lect_count; END GetMaximum; /
这种方案调用后直接返回单个数字的最大值,不需要额外处理游标。
内容的提问来源于stack exchange,提问作者Миша Попов
相关产品推荐
相关产品推荐

