如何在 PLSQL 中避免这种情况

时间:2021-03-22 12:06:39

标签: oracle plsql

我正在尝试创建一个看起来像这样的函数

CREATE OR REPLACE FUNCTION get_sal
    (dep_id IN departments.department_id%TYPE)
    RETURN NUMBER IS
    v_sal employees.salary%TYPE;
BEGIN
    SELECT AVG(salary) INTO v_sal FROM Employees
    WHERE department_id = dep_id;
    RETURN v_sal;
END;

我收到一个错误提示

Error starting at line : 5 in command -
BEGIN
    SELECT AVG(salary) INTO v_sal FROM Employees
    WHERE department_id = dep_id;
    RETURN v_sal;
END;
Error report -
ORA-06550: line 3, column 27:
PL/SQL: ORA-00904: "DEP_ID": invalid identifier
ORA-06550: line 2, column 5:
PL/SQL: SQL Statement ignored
ORA-06550: line 4, column 5:
PLS-00372: In a procedure, RETURN statement cannot contain an expression
ORA-06550: line 4, column 5:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

我从 Oracle 获得了一个示例函数,看看它是否有效,但出现了同样的错误。

2 个答案:

答案 0 :(得分:1)

函数没有任何问题:

SQL> CREATE OR REPLACE FUNCTION get_sal (dep_id IN departments.department_id%TYPE)
  2     RETURN NUMBER
  3  IS
  4     v_sal  employees.salary%TYPE;
  5  BEGIN
  6     SELECT AVG (salary)
  7       INTO v_sal
  8       FROM Employees
  9      WHERE department_id = dep_id;
 10
 11     RETURN v_sal;
 12  END;
 13  /

Function created.

SQL> select get_sal(10) from dual;

GET_SAL(10)
-----------


SQL>

只要您连接的架构包含 DEPARTMENTSEMPLOYEES 表,其中包含该代码中提到的列。如果您不这样做,那么是的 - 预计会出现错误。

答案 1 :(得分:0)

由于您似乎使用 Sql Developer 20.4.0 作为 SQL 客户端,我想问题出在您在此 SQL 客户端中编译 SQL 语句的方式。

使用 SQL Developer,有两种方法可以编译 SQL 语句/执行查询。在编辑器中选择它,然后单击左侧的绿色播放按钮,如下图所示。第二种方法是在编辑器中只包含您的语句并使用执行脚本按钮,它是绿色播放按钮右侧的第二个按钮。这将执行编辑器中的所有语句。

我猜你的错误是由于在编辑器中的光标位于语句上时使用了绿色播放按钮,但语句没有被完全选中或部分选中。

您可以让 SQL Developer 遵从 Toad 的行为,或者在 SQL Developer 选项中以这种方式自定义行为。

enter image description here