2016-09-01 55 views
4
select banner 
from v$version 
; 


BANNER 
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 
PL/SQL Release 12.1.0.2.0 - Production 
"CORE 12.1.0.2.0 Production" 
TNS for Solaris: Version 12.1.0.2.0 - Production 
NLSRTL Version 12.1.0.2.0 - Production 

凭借其12C释放多种功能,甲骨文已经直接在SQL语句的上部加入的功能,允许的PL/SQL函数的声明(见https://oracle-base.com/articles/12c/with-clause-enhancements-12cr1甲骨文12C:在SELECT语句的WITH子句

这可以是一个非常方便的功能,尤其是,在需要从数据库中提取数据的项目中,用户权限限于SELECT语句。

一个简单的例子:

with 
    function add_string(p_string in varchar2) return varchar2 
    is 
    --Function to add a string 
    l_buffer varchar2(32767); 
    begin 
    l_buffer := p_string || ' works!'; 
    -- 
    return l_buffer; 
    -- 
    end ; 
-- 
select add_string('Yes, it') as outVal 
from dual 
; 

--------- 
OUTVAL 
Yes, it works! 

不过,我还没有能够包括多个功能在WITH子句:

with 
    function add_string(p_string in varchar2) return varchar2 
    is 
    --Function to add a string 
    l_buffer varchar2(32767); 
    begin 
    l_buffer := p_string || ' works!'; 
    -- 
    return l_buffer; 
    -- 
    end ; 
    --  
, function doesnt_it(p_string in varchar2) return varchar2 
    is 
    l_buffer varchar2(32767); 
    begin 
    l_buffer := p_string || ' Doesnt it?'; 
    -- 
    return l_buffer; 
    -- 
    end ; 
-- 
select add_string('Yes, it') as outVal 
from dual 
; 

抛出ORA-00928: missing SELECT keyword。 有没有人知道这个新功能是否允许使用多个函数声明,如果有的话,它们是如何实现的?

回答

3

您必须在第二个函数之前删除逗号才能使其工作。 我使用TOAD,sqlDeveloper和sqlPlus进行了测试。

如果你写这样的说法,结合这两种功能:

with 
    function add_string(p_string in varchar2) return varchar2 
    is 
    --Function to add a string 
    l_buffer varchar2(32767); 
    begin 
    l_buffer := p_string || ' works!'; 
    -- 
    return l_buffer; 
    -- 
    end ; 
    --  
    function doesnt_it(p_string in varchar2) return varchar2 
    is 
    l_buffer varchar2(32767); 
    begin 
    l_buffer := p_string || ' Doesnt it?'; 
    -- 
    return l_buffer; 
    -- 
    end ; 
-- 
select doesnt_it(add_string('Yes, it')) as outVal 
from dual 
; 

你会获得:

OUTVAL 
-------- 
Yes, it works! Doesnt it? 
+0

这么简单!非常感谢! :) – silentsurfer

+0

不客气。 – abarisone