Можем ли мы использовать функцию PL SQL в предложении WITH, которое находится во внутреннем выборе? - PullRequest
0 голосов
/ 05 марта 2020

Начиная с 12 c oracle предоставляет способ определения функции в предложении WITH запроса SQL.

Но для приведенного ниже примера шаблона запроса это не удается. Есть ли способ, которым мы можем сделать это? Поскольку мы создаем представление согласно нижеуказанному формату.

SELECT * FROM ( 
WITH FUNCTION 
FUNCTION_NAME 
RETURN DATE
IS
DATE_V DATE;
BEGIN
SELECT SOMEDATE INTO 
DATE_V 
FROM SOMETABLE;
RETURN DATE_V;
END;
SELECT FUNCTION_NAME FROM 
DUAL;
);

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Вам нужно переместить объявление функции перед SELECT:

WITH 
  FUNCTION FUNCTION_NAME 
  RETURN DATE
  IS
    DATE_V DATE;
  BEGIN
    SELECT SOMEDATE INTO 
      DATE_V 
    FROM SOMETABLE;
    RETURN DATE_V;
  END;
SELECT FUNCTION_NAME 
FROM DUAL
/

Насколько я помню, требуется 12,2, недостаточно 12,1

Онлайн пример

0 голосов
/ 05 марта 2020

Вы не можете использовать WITH FUNCTION внутри оператора SELECT. Следующее может помочь вам:

SET SERVEROUTPUT ON
DECLARE
  l_sql     VARCHAR2(32767);
  l_cursor  SYS_REFCURSOR;
  l_value   NUMBER;
BEGIN
  l_sql := 'WITH
              FUNCTION test(p_id IN NUMBER) RETURN NUMBER IS
              BEGIN
                RETURN p_id;
              END;
            SELECT test(1)
            FROM   dual';
  OPEN l_cursor FOR l_sql;
  FETCH l_cursor INTO l_value;
  DBMS_OUTPUT.put_line('l_value=' || l_value);
  CLOSE l_cursor;
END;
/

Тогда вы можете использовать l_value для дальнейших действий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...