2017-01-09 36 views
4

爲什麼不下面的代碼編譯無法把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 
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數據庫12c的企業版發行12.1.0.2.0 - 64位生產
  • PL/SQL發佈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聲明語法。根據運行12.2.0.1的Oracle Live SQL平臺的實驗,它在12cR2中也不受支持。

+1

似乎與https://oracle-base.com/articles/12c/with-clause-enhancements-12cr1#plsql-support – user2672165

+0

中的建議一致嗯,我想知道這個「在未來版本中應用」是基於官方或希望/假設。 (可能是有效的,我希望它在某個時候能夠趕上。)我在Oracle的網站或MOS上看不到任何關於此的信息 - 儘管我可能錯過了某些東西。 –