网上搜索这类错误还是挺多的,只提供我遇到的一种情景。

本地数据库环境:Oracle10g

导入别人的项目后,有一段SQL查询总是报如下错误信息:

Cause: java.sql.SQLException: ORA-00923: 未找到要求的 FROM 关键字

定位到该段SQL后直接通过工具运行报同样的错误,SQL如下:

SELECT
    t.depart_id,
    listagg (t.user_name, ',') WITHIN GROUP (ORDER BY t.user_name) user_name
FROM
    depart_user_relation t
WHERE
    t.depart_id = '20'
GROUP BY
    t.depart_id

错误信息如下:

ORA-00923: FROM keyword not found where expected

原因:listagg withinOracle11g 后引入的,在 Oracle10g 中不支持。


解决方案:

1、升级到Oracle11
2、寻求替代方案

首先在寻求替代方案之前要了解该函数的作用。

该函数可以实现按条件实现列转行。 第二个参数可以灵活的选择 “ ,| - ” 等符号。

我上边那个 SQL 就是想通过 depart_id 进行分组,然后把 user_name 进行列转行。

上实图,左侧即数据库原始数据,右侧为使用 listagg 函数后的效果。

WM_CONCAT函数介绍

wm_concat 函数也可以用作字符串拼接,也是一种聚合函数,也可以用作分析函数,只是函数本身不能像 listagg 那样自由选择间隔字符,固定使用逗号分隔,但可以用其他函数(例如REPLACE)来实现分隔符的改变。唯一无法实现的是,不能自由选择排序的依据,也就是 listagg 中必须使用的 order by 子句。

WM_CONCAT用法示例

select depart_id,wm_concat(user_name) 
from depart_user_relation 
group by depart_id;

由于固定的使用逗号分隔符,所以,如果想替换的话可以使用 REPLACE 函数,具体使用如下:

select depart_id, REPLACE(wm_concat(user_name),',','|')   
from depart_user_relation 
group by depart_id;

这样就实现了 号转 | 了,当然 | 还可以为其他字符。

最后:尽管采用 wm_concat 函数替代了11g新加入的 listagg 函数,但是 wm_concat 函数并不能实现组内排序的短板,若无分组排序要求的话,两者是可以通用。

ORA-00923: FROM keyword not found where expected的更多相关文章

  1. [Err] ORA-00923: FROM keyword not found where expected 与rownum

    关于oracle的nownum 如果我想查询表的全部信息,并且前面加上行号,sql如下 select  ROWNUM,* from tableA 会报下面的错误 [Err] ORA-00923: FR ...

  2. exception ORA-00923: FROM keyword not found where expected

      exception ORA-00923: FROM keyword not found where expected CreationTime--2018年8月16日10点41分 Author:M ...

  3. robotframework出现错误:Keyword 'AppiumLibrary.Open Application' expected 1 to 2 non-keyword arguments,got 5.

    robotframework官网: http://robotframework.org/#introduction -------------- 出现的场景: 由于一开始不了解robotframewo ...

  4. ORA-00923: FROM keyword not found where expected(单双引号)

    1.前提 在学习oracel的过程中遇到的一个关于单双引号的问题 备注一下 2.学习过程中创建表语句是这样的 create table DEPT_DML --部门表( DEPT_NO NUMBER(8 ...

  5. Oracle ORA-00923: FROM keyword not found where expected

    不同于 MySQL,请检查 from 之前显示的字段,尤其是 AS 命名符号的引用. 在 Oracle 中单引 AS 'XXX’ 是错误的,需要修改为双引 "XXX" 或者是干脆去 ...

  6. [20181015]12C SQL Translation Framework.txt

    [20181015]12C SQL Translation Framework.txt --//12c提供一个dba改写sql语句的可能性,实际上10g,11g之前也有一个包DBMS_ADVANCED ...

  7. How to Resize a Datafile (文档 ID 1029252.6)

    APPLIES TO: Oracle Database - Enterprise Edition - Version 9.2.0.1 and laterInformation in this docu ...

  8. Oracle之别名小结

    今天在写一个简单的SQL语句并执行时抛出了如下图所示的一个错误提示信息! 恩,此异常信息很明显,在SQL语句中标示符的长度过长了,简短一些就应该没问题了,我查看了一下我的SQL语句发现是我的查询字段的 ...

  9. SQL[Err]ORA-00XXX: missing 相关

    1.[Err]ORA-00936: missing expression 造成这个错误的原因是:选取的最后一个字段与from之间有逗号 解决方法:将字段与from之间的逗号去掉. 2.[Err] OR ...

随机推荐

  1. for...in 、for...of 、forEach 的区别

    无论是for…in还是for…of语句都是迭代一些东西.它们之间的主要区别在于它们的迭代方式. 1.for…in 语句以原始插入顺序迭代对象的可枚举属性.2.for…of 语句遍历可迭代对象定义要迭代 ...

  2. SVN全局文件过滤规则设置

    */packages */packages/* */.vs/* */.vs */.git/* */.git *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a ...

  3. 【生活现场】从打牌到map-reduce工作原理解析(转)

    原文:http://www.sohu.com/a/287135829_818692 小史是一个非科班的程序员,虽然学的是电子专业,但是通过自己的努力成功通过了面试,现在要开始迎接新生活了. 对小史面试 ...

  4. [转载].NET Core 轻量级模板引擎 Mustachio

    .NET Core 轻量级模板引擎 Mustachio 晓晨Master 一. 前言 Mustachio 是一款轻量级且强大的模板引擎,可以用在网页渲染.代码生成器等需要模板引擎的场景.我用它是用在配 ...

  5. [Silverlight 4] 參數的傳遞方法

    Silverlight都會有一個專案叫 *.Web,有個ManagePage.aspx裝戴Silverlight元件,也是應用程式的入口 然後還會有一個專案(此處叫ManageBack),會編譯成Si ...

  6. Asp.NetCoreWebApi入门 - 从零开始新建api项目

    开发环境 打开VS,建立项目 项目结构 修改 StartUp 类代码 ConfigureServices方法 Configure方法 为开发环境和生产环境配置不同的 Startup 新建一个Contr ...

  7. 浅谈Spring解决循环依赖的三种方式

    引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...

  8. 用SWFUpload上传图片小例子

    在开发项目中,经常会用到上传图片,接下来我就用一种简单的方式给大家分享一下使用SWFUpload的方式上传图片. 1.在网站根目录下新建一个SWFUpload文件夹,把下载的组建放在SWFUpload ...

  9. 一个标准sql语句模板

    select distinct top n * from t1 inner join t2 on ... join t3 on ... where ... group by ... having .. ...

  10. 203--Remove LinkedList Elements

    package LinedList; public class RemoveLinkedListElements { //解法一:循环 public ListNode removeElements(L ...