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

本地数据库环境: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. 编程哲理小故事:Tina的运动会方阵

    自从接到任务后,Tina一直 烦恼着如何让这群繁忙又缺乏才艺的程序员在运动会开幕式上做出一个有趣的方阵表演. 接到了运动会的方阵表演的任务 时间回到1个月前. Tina正在工位上繁忙地进行着下一期准备 ...

  2. Java代码中对IP进行白名单验证

    来自:https://www.cnblogs.com/shinubi/p/6723003.html public class ipUtil { // IP的正则,这个正则不能验证第一组数字为0的情况 ...

  3. Ext.Net GridPanel (属性|方法|配置|详细介绍)

    1.Ext.NET ---- GridPanel 主要配置项: store:表格的数据集 columns:表格列模式的配置数组,可自动创建ColumnModel列模式 autoExpandColumn ...

  4. wordcount实例

    scala的wordcount实例 package com.wondersgroup.myscala import scala.actors.{Actor, Future} import scala. ...

  5. Excel技能提升

    函数 字符串全半角之间的转换 ASC将全角英文字母转换为半角英文字母,其语法是ASC(text) WIDECHAR()将半角英文字母转换为全角英文字母,语法是=WIDECHAR(text) find( ...

  6. Django学习——全局templates引用的问题

    一.问题在构建网站的时候我们会用到全局的templates处理错误的网页,此时我们需要对urls进行一个映射,使得在使用的时候避免重复调用.在使用的时候还会产生错误代码:第一个是404界面的,第二个是 ...

  7. 《 .NET并发编程实战》实战习题集 - 4 - 如何重用一次性资源

    如何重用以下一次性资源代码呢? string text; using (var stream = new StreamReader(path)) { text = stream.ReadToEnd() ...

  8. SpringBoot 打包成war

    1.修改pom.xml文件 <packaging>war</packaging> <properties> <project.build.sourceEnco ...

  9. JavaScript学习思维导图

    JS基本概念 JS操作符 JS基本语法 JS数组 JS Date用法 JS 字符串用法 JS编程风格 JS实践

  10. javascript实现上传图片并展示

    我们也都知道上传图片的样子是这样的(选择前)是这样的(选择后). 先在HTML设置图片上传 <form action="" method=""> & ...