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版本中,Oracle添加了允许直接在SQL语句顶部声明Pl/SQL函数的功能(请参阅https://oracle-base.com/articles/12c/with-clause-enhancements-12cr1)

特别是,这可能是一个非常方便的功能。在需要从用户权限限制为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
是否有人知道此新功能是否允许使用多个函数声明,如果允许,如何实现?

最佳答案

您必须在第二个功能之前删除逗号才能使其起作用。
我使用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?

关于sql - Oracle 12c : Multiple functions in a SELECT statement's WITH clause,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39266673/

10-16 06:52