CREATE OR REPLACE FUNCTION lab( f_name IN VARCHAR2 )
RETURN test%ROWTYPE
IS
total NUMBER := 0;
CURSOR c_app IS
SELECT count(*),LISTAGG(s.sname,',') WITHIN GROUP (ORDER BY s.sname)
FROM APPLICANT a INNER JOIN SPOSSESSED s ON a.A# = s.A#
WHERE a.fname = f_name;
rec_app c_app%ROWTYPE;
BEGIN
OPEN c_app;
LOOP
FETCH c_app into rec_app;
EXIT WHEN c_app%NOTFOUND;
END LOOP;
CLOSE c_app;
RETURN rec_app;
END lab;
/
编译失败时出现expression wrong type
错误?
是否可以使用rowtype
结果返回?
例如我运行此功能
select lab(fname) from position where fname='PETER';
所以结果将显示为
PETER : aaaa,bbbb,cccc
答案 0 :(得分:1)
您已将回复声明为test%rowtype
,然后尝试返回rec_app
,这被声明为c_app%rowtype
- 因此类型不匹配。你不能这样做。
c_app
仅在此函数的范围内,因此对任何调用者都没有任何意义,并且您不能将其用作返回类型。您可以返回实际为test%rowtype
的内容,假设test
是一个表,但不是任意的不同类型。目前还不清楚光标及其行类型和test
表之间是否存在任何关系。
您还可以循环播放以获取多行,但只返回最后一行(或尝试,无论如何),这可能不是您的意思。
将所有游标行返回给调用者的最简单方法是使用引用游标:
CREATE OR REPLACE FUNCTION lab( f_name IN VARCHAR2 )
RETURN SYS_REFCURSOR
IS
ref_cur SYS_REFCURSOR;
BEGIN
OPEN ref_cur FOR
SELECT count(*),LISTAGG(s.sname,',') WITHIN GROUP (ORDER BY s.sname)
FROM APPLICANT a INNER JOIN SPOSSESSED s ON a.A# = s.A#
WHERE a.fname = f_name;
RETURN ref_cur;
END lab;
/
如果您创建了外部类型,则可以使用PIPELINED
,但这里似乎没有必要。但是,他们都没有使用%rowtype
。如果您的表中包含要返回的列,则只能返回%rowtype
。