Невозможно поместить предложение WITH FUNCTION в блок BEGIN / END

Почему не компилируется приведенный ниже код:

DECLARE
c number;
BEGIN
WITH
FUNCTION calculate(i IN NUMBER) RETURN NUMBER
AS
r number;
BEGIN
  r := i*i;
  RETURN r;
END;
select calculate(1) INTO c from dual;
END;

дает следующую ошибку:

Error report -
*ORA-06550: line 5, column 10:
PL/SQL: ORA-00905: missing keyword
ORA-06550: line 4, column 1:
PL/SQL: SQL Statement ignored

в то время как:

WITH
FUNCTION calculate(i IN NUMBER) RETURN NUMBER
AS
r number;
BEGIN
  r := i*i;
  RETURN r;
END;
select calculate(1) from dual;

компилируется?

Информация о версии Oracle

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64-разрядная производственная версия
PL / SQL Release 12.1.0.2.0 - Production


person user2672165    schedule 09.01.2017    source источник
comment
Полезно включить ошибку, полученную в первой версии. Но select into не совсем то же самое, что select. Возможно, синтаксис with function ... еще не вошел в версию PL / SQL; хотя, поскольку синтаксические диаграммы даже не показывают синтаксис CTE, это трудно сказать. Вы используете 12cR1 или 12cR2 - это могло измениться между выпусками?   -  person Alex Poole    schedule 09.01.2017
comment
@AlexPoole Я добавил запрошенную вами информацию.   -  person user2672165    schedule 09.01.2017


Ответы (1)


Похоже, что эта конструкция еще не поддерживается в PL / SQL. Предположительно он будет добавлен в следующем выпуске.

А пока это неприятно, но вы можете использовать динамический SQL, который продолжает запускать ваш рабочий оператор в контексте SQL, где он понимается:

DECLARE
  c number;
BEGIN
  EXECUTE IMMEDIATE '
WITH
FUNCTION calculate(i IN NUMBER) RETURN NUMBER
AS
  r number;
BEGIN
  r := i*i;
  RETURN r;
END;
select calculate(2) from dual'
  INTO c;
  DBMS_OUTPUT.PUT_LINE(c);
END;
/

4

В документации для select into не указано, что пункт with поддерживается в PL / SQL даже для блоков подзапросов, но работает даже в более ранних версиях. Таким образом, это также не относится к новому синтаксису объявления PL / SQL. Судя по экспериментам на платформе Oracle Live SQL, работающей под управлением 12.2.0.1, она также не поддерживается в 12cR2.

person Alex Poole    schedule 09.01.2017
comment
Кажется, согласуется с предложением в oracle-base.com/articles / 12c / - person user2672165; 10.01.2017
comment
Хммм, мне интересно, основано ли это в будущем выпуске на чем-то официальном или на надежде / предположении. (Вероятно, верно; я ожидал бы, что он наверстает упущенное в какой-то момент.) Я ничего не видел об этом на сайтах Oracle или MOS - хотя я вполне мог что-то пропустить. - person Alex Poole; 10.01.2017