【问题标题】:Local function may not be used. Invalid identifier不能使用局部函数。不合法的识别符
【发布时间】:2021-12-01 10:41:01
【问题描述】:

我有一个函数和过程。一个过程调用一个函数。 当我使用创建或替换将该函数和过程创建为模式对象时,一切正常:

create or replace FUNCTION is_highest_paid (
        emp_id employees.employee_id%TYPE,
        avg_sal NUMBER
    ) RETURN CHAR AS
        is_highest CHAR(1);
    BEGIN
        SELECT 'Y'
        INTO is_highest
        FROM employees
        WHERE employee_id = emp_id
            AND salary > avg_sal;

        RETURN is_highest;
    END;
    
create or replace PROCEDURE fill_high_paid_emps AS        
        avg_sal NUMBER;
    BEGIN
        SELECT AVG(salary)
        INTO avg_sal
        FROM employees;

        INSERT INTO highest_paid_employees
        SELECT *
        FROM employees
        WHERE is_highest_paid(employees.employee_id, avg_sal) = 'Y';
    END; 
begin
    fill_high_paid_emps();
end;

但是一旦我尝试在这样的匿名块中本地使用它们:

DECLARE
    FUNCTION is_highest_paid (
        emp_id employees.employee_id%TYPE,
        avg_sal NUMBER
    ) RETURN CHAR AS
        is_highest CHAR(1);
    BEGIN
        SELECT 'Y'
        INTO is_highest
        FROM employees
        WHERE employee_id = emp_id
            AND salary > avg_sal;

        RETURN is_highest;
    END;

    PROCEDURE fill_high_paid_emps AS        
        avg_sal NUMBER;
    BEGIN
        SELECT AVG(salary)
        INTO avg_sal
        FROM employees;

        INSERT INTO highest_paid_employees
        SELECT *
        FROM employees
        WHERE is_highest_paid(employees.employee_id, avg_sal) = 'Y';
    END;
BEGIN
    fill_high_paid_emps();
END;

我得到: PLS-00231:函数 'IS_HIGHEST_PAID' 不能在 SQL 中使用

PL/SQL: ORA-00904: : 无效标识符

这是什么原因?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您已经在 PL/SQL 范围内声明了函数;它只能在PL/SQL中使用,在SQL范围内是不可见的。

    您可以:

    • 使用CREATE FUNCTION在SQL中声明它;
    • 使用CREATE PACKAGE在包中声明它;或
    • 如果您使用的是 Oracle 12 或更高版本,请在 SQL 查询 WITH FUNCTION ... 中内联声明它。

    【讨论】:

      【解决方案2】:

      这是因为函数必须在 SQL 级别创建 - 通过 CREATE OR REPLACE FUNCTION is_highest_paid(正如您已经向我们展示的那样)或在包中创建。

      如果它是一个 local 函数 - 对你的匿名 PL/SQL 块来说是本地的,它就不会工作(从 SQL 语句中调用它)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-21
        相关资源
        最近更新 更多