Plsql 表达式的函数类型错误

Plsql 表达式的函数类型错误,plsql,Plsql,我得到了这个错误: 12/9 PL/SQL:忽略语句 12/16 PLS-00382:表达式类型错误 20/9 PL/SQL:忽略语句 20/16 PLS-00382:表达式类型错误 我有一个功能,试图找到薪酬最好/最差的员工。但是我得到了上面的错误。 我认为这和ROWNUM有关,但我不确定。 我认为错误指出的线不是有错误的线。 我让这个函数以不同的方式编写,错误中的行指向函数声明中的ROWNUM,您说 CREATE OR REPLACE FUNCTION k_w_b_salary(k IN N

我得到了这个错误: 12/9 PL/SQL:忽略语句 12/16 PLS-00382:表达式类型错误 20/9 PL/SQL:忽略语句 20/16 PLS-00382:表达式类型错误

我有一个功能,试图找到薪酬最好/最差的员工。但是我得到了上面的错误。 我认为这和ROWNUM有关,但我不确定。 我认为错误指出的线不是有错误的线。
我让这个函数以不同的方式编写,错误中的行指向函数声明中的ROWNUM,您说

CREATE OR REPLACE FUNCTION k_w_b_salary(k IN NUMBER, b IN BOOLEAN)
RETURN EMP.ENAME%TYPE IS 

names name_table;

BEGIN
IF (b = true) THEN
    SELECT ENAME BULK COLLECT INTO names
    FROM 
    (SELECT *
    FROM EMP
    ORDER BY SAL ASC)
    WHERE ROWNUM <= k;
    RETURN names;
ELSIF (b = false) THEN
    SELECT ENAME BULK COLLECT INTO names
    FROM
    (SELECT *
    FROM EMP
    ORDER BY SAL DESC)
    WHERE ROWNUM <= k;
    RETURN names;
END IF;
END;
我假设表EMP中列ENAME的数据类型是某种字符串VARCHAR240或类似的类型-对吗

在“声明”部分中,您将声明数据类型name_table的变量名。您没有向我们展示必须在函数外部(而不是在函数中)给出的name_表类型的定义;我们可以假设它是某种嵌套表。正当[编辑-我收回这一点;您在问题末尾向我们展示了您对名称表的定义。]

最后,函数返回名称。类型为name\u table。但是您说过该函数返回其他内容:EMP.ENAME%TYPE。特别是,您说函数返回标量数据类型,但您返回的是集合

即使集合只有一个元素,这也不起作用。具有单个记录的表与记录本身的数据类型不同,即使实际表中只有一条记录

而且,当表中有三条记录时,情况就更糟了

相反,您似乎需要一个表函数:一个返回事物表的函数。如果是这样,那么以这种方式声明函数。也许您希望函数

RETURN EMP.ENAME%TYPE

在函数声明的顶部

谢谢!就这样。我在主要代码块之后显示name_表的定义,这几乎是我最后说的。非常感谢@是的,我现在看到了。我编辑了答案以澄清问题。如果输入参数b为空,会发生什么?在这种情况下,函数不会返回任何内容,这意味着它将抛出错误,因为函数必须返回某些内容。另外-您计划在SQL中使用此函数,还是仅在PL/SQL中使用此函数?如果希望能够在SQL中调用它,则需要为b使用不同的数据类型,因为Oracle SQL与PL/SQL不同,它不支持布尔值。顺便说一句,如果b=true,则可以像b那样简单地编写。
RETURN NAME_TABLE