Oracle 12c 子查询的 WITH 子句中的函数

Posted

技术标签:

【中文标题】Oracle 12c 子查询的 WITH 子句中的函数【英文标题】:Oracle 12c function in the WITH clause of subquery 【发布时间】:2017-09-20 07:19:16 【问题描述】:

我对 WITH 子句中的子查询有疑问。

Oracle 版本:12c Enterprise Edition Release 12.1.0.2.0 - 64b

WITH
  FUNCTION upper_string(p_string IN VARCHAR2) RETURN VARCHAR2
  IS
  BEGIN
    RETURN UPPER(p_string);
  END;
SELECT upper_string AS ret_val
FROM dual;  

我来了

PLS-103: Encoutered 符号“文件结束”...

猜猜问题出在哪里?

提前致谢!

【问题讨论】:

【参考方案1】:

Here 你可以找到一些关于 WITH 子句增强的信息。您可以尝试使用:

WITH
  FUNCTION upper_string(p_string IN VARCHAR2) RETURN VARCHAR2
  IS
  BEGIN
    RETURN UPPER(p_string);
  END;
SELECT upper_string AS ret_val
FROM dual
/

【讨论】:

你忘记了参数:ORA-06553: PLS-306: wrong number or types of arguments in call to 'UPPER_STRING'【参考方案2】:

在您的选择中,您没有将参数传递给函数。

 SELECT upper_string('something to upper') AS ret_val
   FROM dual; 

但错误可能表明您处于旧环境中,不支持 12c 的语法。

【讨论】:

您对参数是正确的(我的错)。 “旧环境”是什么意思,我该如何理解? 可能是 oracle 客户端 9i、sqlplus 9i 或您的工具。 向函数添加参数后,我在 sqlplus 12c 和 TOAD 中运行查询没有任何问题,但在 sqlplus 11g 中它给出的错误与您的完全相同 - ORA-06553: PLS-103: Encountered the symbol "end-of-file" when expecting... 所以老版本的sqlplus才是问题的根源。非常感谢!

以上是关于Oracle 12c 子查询的 WITH 子句中的函数的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle 中使用 connect by 在 with 子句中访问子查询中的父别名

EXISTS 不适用于 WITH 子句中的子查询

oracle查询中的“WITH”子句优化

Oracle with重用子查询

如何在 Spark SQL 中的 WITH 子句中缓存子查询结果

需要帮助在 12c 中优化 Oracle 查询