ORA-00923: FROM keyword not found where expected
网上搜索这类错误还是挺多的,只提供我遇到的一种情景。
本地数据库环境: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 within 为 Oracle11g 后引入的,在 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的更多相关文章
- [Err] ORA-00923: FROM keyword not found where expected 与rownum
关于oracle的nownum 如果我想查询表的全部信息,并且前面加上行号,sql如下 select ROWNUM,* from tableA 会报下面的错误 [Err] ORA-00923: FR ...
- 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 ...
- robotframework出现错误:Keyword 'AppiumLibrary.Open Application' expected 1 to 2 non-keyword arguments,got 5.
robotframework官网: http://robotframework.org/#introduction -------------- 出现的场景: 由于一开始不了解robotframewo ...
- ORA-00923: FROM keyword not found where expected(单双引号)
1.前提 在学习oracel的过程中遇到的一个关于单双引号的问题 备注一下 2.学习过程中创建表语句是这样的 create table DEPT_DML --部门表( DEPT_NO NUMBER(8 ...
- Oracle ORA-00923: FROM keyword not found where expected
不同于 MySQL,请检查 from 之前显示的字段,尤其是 AS 命名符号的引用. 在 Oracle 中单引 AS 'XXX’ 是错误的,需要修改为双引 "XXX" 或者是干脆去 ...
- [20181015]12C SQL Translation Framework.txt
[20181015]12C SQL Translation Framework.txt --//12c提供一个dba改写sql语句的可能性,实际上10g,11g之前也有一个包DBMS_ADVANCED ...
- How to Resize a Datafile (文档 ID 1029252.6)
APPLIES TO: Oracle Database - Enterprise Edition - Version 9.2.0.1 and laterInformation in this docu ...
- Oracle之别名小结
今天在写一个简单的SQL语句并执行时抛出了如下图所示的一个错误提示信息! 恩,此异常信息很明显,在SQL语句中标示符的长度过长了,简短一些就应该没问题了,我查看了一下我的SQL语句发现是我的查询字段的 ...
- SQL[Err]ORA-00XXX: missing 相关
1.[Err]ORA-00936: missing expression 造成这个错误的原因是:选取的最后一个字段与from之间有逗号 解决方法:将字段与from之间的逗号去掉. 2.[Err] OR ...
随机推荐
- 《Interest Rate Risk Modeling》阅读笔记——第三章:拟合期限结构
目录 第三章:拟合期限结构 思维导图 扩展 第三章:拟合期限结构 思维导图 扩展 NS 模型的变种
- UVA 583 分解质因数
Webster defines prime as:prime (prim) n. [ME, fr. MF, fem. of prin first, L primus; akin to L prior] ...
- ReentrantLock和Condition实现生产者和消费者
一个生产者和一个消费者 public class ConditionTest { private static ReentrantLock lock = new ReentrantLock(); pr ...
- sql server报【从varchar数据类型到datetime数据类型的转换产生一个超出范围的值】错误的解决办法
产生这个错误的原因是在使用convert函数将给定的日期字符串转换为日期类型的时候,因为datetime这个数据类型有时间数值的范围限定,当超出时间范围时就抛出这个错误. 如果类型是[datetime ...
- Failed to instantiate [org.elasticsearch.client.transport.TransportClient]
Springboot 集成 ElasticSearch,springboot报错如下: Error starting ApplicationContext. To display the auto-c ...
- day11——函数名的使用、f格式化、迭代器、递归
day11 函数名的第一类对象及使用 1.可以当作值被赋值给变量 def func(): print(1) print(func) a = func a() 2.当作元素存放在容器中 def func ...
- 自动化部署Ruby on Rails应用(docker + jenkins)
docker安装参考链接docker官网jenkins中文官网 我的博客网站已经迁移到了https://johnnyting.github.io/,如果有兴趣的可以关注下.下面文章格式可能有点乱,可以 ...
- MediaWiki上传文件大小设置
一.概述 MediaWiki默认最大上传文件大小为2M,碰到文件较大需要修改这个限制,需要改为8M. 二.修改php.ini 使用docker运行的MediaWiki,默认是没有php.ini这个文件 ...
- notepad++格式化代码,自动对齐
Notepad++本身没有快捷命令格式化JavaScript代码,需要通过安装扩展插件来实现快捷格式化JS代码的功能.本文主要介绍如何通过安装JStool插件来实现格式化JS代码的功能. 在插件列表中 ...
- .Net IOC框架入门之——Autofac
一.简介 Autofac是.NET领域最为流行的IOC框架之一,传说是速度最快的一个 目的 1.依赖注入的目的是为了解耦.2.不依赖于具体类,而依赖抽象类或者接口,这叫依赖倒置.3.控制反转即IoC ...