I'm trying to apply the Table(function) functionality in a simple example. I get the following error when using the Table(function) method from a Procedure's SELECT, WHERE statement
Error: PLS-00231: function 'GET_NUM' may not be used in SQL
Any insight on what is wrong in this code.
CREATE OR REPLACE PACKAGE BODY TEST IS
--COLLECTION DELCARATION
TYPE num_list IS TABLE OF NUMBER;
TYPE str_list IS TABLE OF NUMBER;
FUNCTION get_num(id IN NUMBER)
RETURN num_list AS
num num_list;
BEGIN
WITH xTable AS
(
SELECT 1 ID, 111 NUM, 'ABC 111' DESCP FROM DUAL
UNION ALL
SELECT 2 ID, 222 NUM, 'ABC 222' DESCP FROM DUAL
UNION ALL
SELECT 1 ID, 333 NUM, 'ABC 333' DESCP FROM DUAL
)
SELECT x.NUM
BULK COLLECT INTO num
FROM xTable x
WHERE x.ID = id;
RETURN num;
END;
PROCEDURE insert_object_id_control AS
i NUMBER:= 1;
str str_list;
BEGIN
WITH yTable AS
(
SELECT 1 ID, 111 NUM, 'ABC 111' DESCP FROM DUAL
UNION ALL
SELECT 2 ID, 222 NUM, 'ABC 222' DESCP FROM DUAL
UNION ALL
SELECT 3 ID, 333 NUM, 'ABC 333' DESCP FROM DUAL
)
SELECT y.DESCP
INTO str /*BULL COLLECT INTO GET'S SAME RESULT*/
FROM yTable y
WHERE y.NUM IN (SELECT * FROM TABLE(get_num(i)));
END insert_object_id_control;
END TEST;
Your code has some compilation issues in the procedure insert_object_id_control
; given that this procedure is not meaningful for the test, I've removed it.
If you want to use a type as a result of a function, and use this function in a query, you need a stored type.
For example:
CREATE TYPE num_list IS TABLE OF NUMBER;
CREATE OR REPLACE PACKAGE TEST IS
FUNCTION get_num(id IN NUMBER)
RETURN num_list;
END TEST;
CREATE OR REPLACE PACKAGE BODY TEST IS
FUNCTION get_num(id IN NUMBER)
RETURN num_list AS
num num_list;
BEGIN
WITH xTable AS
(SELECT 1 ID, 111 NUM, 'ABC 111' DESCP FROM DUAL UNION ALL
SELECT 2 ID, 222 NUM, 'ABC 222' DESCP FROM DUAL UNION ALL
SELECT 1 ID, 333 NUM, 'ABC 333' DESCP FROM DUAL)
SELECT x.NUM
BULK COLLECT INTO num
FROM xTable x
WHERE x.ID = id;
RETURN num;
END;
END TEST;
Whit these objects, this query will work:
SQL> SELECT test.get_num(1) FROM DUAL;
TEST.GET_NUM(1)
------------------------------------------
NUM_LIST(111, 222, 333)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.