【发布时间】:2020-11-22 23:55:11
【问题描述】:
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;
我得到这个错误: 12/9 PL/SQL:语句被忽略 12/16 PLS-00382:表达式类型错误 20/9 PL/SQL:语句被忽略 20/16 PLS-00382:表达式类型错误
我有这个功能,试图找到薪酬最高/最差的员工。但我收到上述错误。 我认为这与 ROWNUM 有关,但我不确定。 我认为错误指出的行不是有错误的行。 我用不同的方式编写了这个函数,错误中的行指向 ROWNUM CREATE OR REPLACE TYPE name_table IS TABLE OF VARCHAR2(10); 任何帮助表示赞赏!
【问题讨论】:
-
如果输入参数 b 为 NULL 会发生什么?在这种情况下,您的函数将不会返回任何内容(这意味着它将引发错误,因为函数 必须 返回某些内容)。另外——你打算在 SQL 中使用这个函数,还是只在 PL/SQL 中使用?如果您希望能够在 SQL 中调用它,则需要为 b 使用不同的数据类型,因为 Oracle SQL(与 PL/SQL 不同)不支持 BOOLEAN。
-
顺便说一句,
IF (b = true) THEN可以更简单地写成if b then。
标签: plsql