【问题标题】:expression is of wrong type for function表达式的函数类型错误
【发布时间】: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


【解决方案1】:

在函数声明中,你说

RETURN EMP.ENAME%TYPE

我假设表 EMP 中列 ENAME 的数据类型是某种字符串(VARCHAR2(40) 或类似的) - 对吧?

在声明部分,您声明数据类型为name_table 的变量names。您没有向我们展示 name_table 类型的定义(必须在函数之外给出,而不是在其中);我们可能可以假设它是某种嵌套表。正确的? [编辑 - 我收回;您确实在问题的末尾向我们展示了您对name_table 的定义。]

最后,您的函数返回names。类型为name_table。但是您说该函数返回其他内容:EMP.ENAME%TYPE。特别是,您说该函数返回一个标量数据类型,但您返回的是一个集合。

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

(而且,当表中包含三个记录时更是如此!)

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

RETURN NAME_TABLE

(在顶部,在函数声明中)

【讨论】:

  • 谢谢!就是这样。我在主要代码块之后显示了 name_table 的定义,几乎是我要说的最后一件事。非常感谢!
  • @ΗλίαςΚαλερίδης - 是的,我现在看到了。我编辑了答案以澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
相关资源
最近更新 更多