Reputation: 21
I want to create a local FUNCTION which returns result as NESTED TABLE in my PROCEDURE. Then, I wish to JOIN the nested table with another table in a SELECT query like this:
PROCEDURE TEST_DEPID (SOR IN OUT SYS_REFCURSOR) AS
TYPE TAB IS TABLE OF HR.EMPLOYEES.SALARY%TYPE
INDEX BY BINARY_INTEGER;
FUNCTION GET_SALARY (P_DEPARTMENT_ID NUMBER)
RETURN TAB
IS RETURN_TBL TAB;
BEGIN
SELECT SALARY
BULK COLLECT INTO RETURN_TBL
FROM HR.EMPLOYEES WHERE DEPARTMENT_ID = TRIM(P_DEPARTMENT_ID);
RETURN RETURN_TBL;
END GET_SALARY;
BEGIN
OPEN SOR FOR
SELECT * FROM HR.EMPLOYEES JOIN TABLE (GET_SALARY('60')) B ON A.SALARY = B.SALARY;
END;
And the errors I got are:
[1]:(Error): PLS-00231: function 'GET_SALARY' may not be used in SQL
[2]:(Error): PL/SQL: ORA-00904: : invalid identifier
[3]:(Error): PL/SQL: SQL Statement ignored
Please give me some advice.
Upvotes: 0
Views: 221
Reputation: 5614
A local function cannot be used inside a SELECT. Only global functions will work.
Oracle uses 2 engines running SQL and PL/SQL. Running your SELECT the SQL engine can access all functions, but only if they are public known. The local function is not known to the public.
Upvotes: 1