警告:使用编译错误创建的函数

时间:2017-03-26 15:53:18

标签: sql database oracle

表EMP将ENAME作为属性。以下函数给出错误:

SET SERVEROUTPUT ON
SET ECHO ON
CREATE OR REPLACE FUNCTION count_emp(e_name varchar(20))
RETURN integer IS 
total integer;
BEGIN 
SELECT count(*) into total 
FROM DEPARTMENTS
where ENAME = e_name;
RETURN total; 
END; 
/ 
  

警告:使用编译错误创建的函数。

2 个答案:

答案 0 :(得分:1)

您可以运行show errors;来查看编译错误。

应该指定参数的数据类型,不带长度。另外,请使用varchar2代替varchar

来自Oracle site

  

VARCHAR数据类型与VARCHAR2数据类型同义。为避免可能的行为更改,请始终使用VARCHAR2数据类型来存储可变长度的字符串。

试试这个:

CREATE OR REPLACE FUNCTION count_emp(e_name varchar2) -- here
RETURN integer IS 
total integer;
BEGIN 
SELECT count(*) into total 
FROM DEPARTMENTS
where ENAME = e_name;
RETURN total; 
END; 
/ 

答案 1 :(得分:0)

如果你关心表EMP,你应该在函数中使用它。

我会把它写成:

CREATE OR REPLACE FUNCTION count_emp (
    in_e_name varchar2
)
RETURN integer IS 
    v_total integer;
BEGIN 
    SELECT COUNT(*) into v_total 
    FROM EMP e
    WHERE e.ENAME = in_e_name;

    RETURN v_total; 
END; 

注意:

  • 即使对象尚未存在,Oracle也会编译函数和存储过程。这被视为"功能"。
  • 使用命名约定来区分参数和变量与列。这是使用in_作为输入参数,v_作为局部变量。
  • 限定所有列名引用。这进一步降低了变量和列名称之间发生冲突的可能性。
  • 您不需要varchar2()输入的长度(优于varchar(),但也许有一天,Oracle会达到标准)。