我有一個功能和程式。一個程序呼叫一個函式。當我使用創建或替換將該函式和程序創建為架構物件時,一切正常:
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: : 無效識別符號
那是什么原因呢?
uj5u.com熱心網友回復:
您已經在 PL/SQL 范圍內宣告了該函式;它只能在 PL/SQL 中使用,在 SQL 范圍內不可見。
您可以:
- 使用
CREATE FUNCTION;在 SQL 中宣告它 - 使用
CREATE PACKAGE;在包中宣告它 或者 - 如果您使用的是 Oracle 12 或更高版本,請在 SQL 查詢中將其宣告為行內
WITH FUNCTION ...。
uj5u.com熱心網友回復:
那是因為函式必須在 SQL 級別創建 - 要么通過CREATE OR REPLACE FUNCTION is_highest_paid(正如您已經向我們展示的那樣),要么在包內。
如果它是一個本地函式,它就不會作業(從 SQL 陳述句呼叫它)- 本地到您的匿名 PL/SQL 塊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/371575.html
