PL / SQL存储函数返回行类型

时间:2014-07-08 14:59:02

标签: sql oracle plsql

 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

1 个答案:

答案 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