【问题标题】:Oracle 12c: Multiple functions in a SELECT statement's WITH clauseOracle 12c:SELECT 语句的 WITH 子句中的多个函数
【发布时间】:2017-01-09 01:14:00
【问题描述】:
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。 有人知道这个新特性是否允许多个函数声明,如果允许,如何实现?

【问题讨论】:

    标签: sql oracle oracle12c


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 2010-10-27
      • 2016-12-30
      • 1970-01-01
      相关资源
      最近更新 更多