Я получаю Ошибка:Oracle PL/SQL: Функция Cursor
PLS-00231: function 'GET_NUM' may not be used in SQL
, когда выполняется следующий код;
CREATE OR REPLACE PACKAGE BODY TESTJNSABC IS
-- FUNCTION IMPLEMENTATIONS
FUNCTION get_num(num IN NUMBER)
RETURN SYS_REFCURSOR AS
my_cursor SYS_REFCURSOR;
BEGIN
--
OPEN my_cursor FOR
WITH ntable AS (
SELECT 1 ID, 111 AGT, 'ABC' DESCRIP FROM DUAL
UNION ALL
SELECT 2 ID, 222 AGT, 'ABC' DESCRIP FROM DUAL
UNION ALL
SELECT 1 ID, 333 AGT, 'ABC' DESCRIP FROM DUAL
)
SELECT AGT FROM ntable WHERE ID = num;
RETURN my_cursor;
END;
-- PROCEDURE IMPLEMENTATIONS
PROCEDURE testingabc AS
BEGIN
WITH xtable AS (
SELECT 111 AGT, 'A' DESCRIP FROM DUAL
UNION ALL
SELECT 222 AGT, 'B' DESCRIP FROM DUAL
UNION ALL
SELECT 333 AGT, 'C' DESCRIP FROM DUAL
)
SELECT DESCRIP FROM xtable WHERE COD_AGT IN get_num(1);
END testingabc;
END TESTJNSABC;
Даже если я вызываю функцию, как TESTJNSABC.get_num(1)
я все еще получаю ту же ошибку. --UPDATE. Поэтому в сценарии реальной жизни я хотел бы вызвать функцию из WHERE CLAUSE; функция должна возвращать набор значений NUMBER (поэтому я использую предложение IN).
У вас есть некоторые вопросы здесь. Было бы проще помочь вам, если бы вы могли объяснить, что вы хотите, чтобы эти процедуры выполнялись. – Aleksej
Ошибка кажется довольно ясной? Вы не можете использовать свою функцию в инструкции SQL, ее можно вызывать только из других контекстов PL/SQL (по крайней мере до 12c). –
Вы не можете использовать функцию, возвращающую курсор ref таким образом. Он обычно используется в контексте передачи указателя набора результатов в PL/SQL. Вы можете приблизиться, но вам нужно будет использовать конвейерную функцию и не зная точно, что вы хотите, включая ответ, в том числе и бессмысленно. – BriteSponge