2017-01-09 7 views
4

Почему ниже код не компилируетсяНевозможно поставить спецификаторе функции в НАЧАТЬ/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 
06550. 00000 - "line %s, column %s:\n%s" 
Cause: Usually a PL/SQL compilation error. 
Action:* 

, тогда как

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 - Производство
+0

Полезно включить ошибку, которую вы получаете от первой версии. Но 'select into' не совсем то же самое, что' select'. Возможно, синтаксис 'with function ...' еще не внесён в PL/SQL-версию; хотя, поскольку синтаксические диаграммы даже не показывают синтаксис CTE, трудно сказать. Используете ли вы 12cR1 или 12cR2 - возможно, он изменился между релизами? –

+0

@AlexPoole Я добавил запрошенную вами информацию. – user2672165

ответ

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 

The documentation for select into не показывает, что положение with поддерживается в PL/SQL даже для блоков подзапросов, но это работает даже в более ранних версиях. Поэтому он также не ссылается на новый синтаксис объявления PL/SQL. Основываясь на экспериментах на платформе Oracle SQL Live, которая работает с 12.2.0.1, она также не поддерживается в 12cR2.

+1

Кажется согласным с предложением в https://oracle-base.com/articles/12c/with-clause-enhancements-12cr1#plsql-support – user2672165

+0

Хммм, интересно, будет ли это «должное в будущем выпуске» основано на чем-то официальном , или надежда/предположение. (Вероятно, действительно, я бы ожидал, что он наверстает упущенное в какой-то момент.) Я ничего не мог понять об этом на сайтах Oracle или MOS. Возможно, я что-то пропустил. –