oracle SELECT语句太长的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle SELECT语句太长的问题相关的知识,希望对你有一定的参考价值。
有个项目需要自动拼接SQL语句,因为需要根据产品分列合计展现多列所以用到了循环拼接中间查询字段部分,如:
trim(to_char(sum(case
when t.PRODUCT_NAME = 'P000000005' then
t.profit
else
0
end),
'99999999.99')) as 产品1
产品数量大致在12个左右,拼接出来的SQL语句长度是在20000字符左右,用long变量承接,在执行SQL语句是,本地WINDOWS下安装的ORACLE 10G是可以执行的,但是服务起上的LINUX下安装的ORACLE 10G下执行此语句就会报 ORA-00972:identifier is too long
请问这个ORACLE问题可以通过数据库配置解决吗?如果可以应该如何配置?
感谢大家的回答,问题原因已经找到了,其实说来很简单,是字符集的问题。因为在UTF-8和GB1232中一个中文字符的长度是不一样的,一个是占2位,一个是占三位,我两个ORACLE数据库用了不同的字符集。而ORACLE的SQL语句中,AS的字段名必须小于30位,我的产品名称中有一个12中文字的,所以在UTF-8中12个中文就变成36个字符,超过了字段名30位的最大长度。而在GB1232中是24位的长度,可以执行。顺便给自己加分,呵呵。这么奇葩的问题也只有我自己能找到原因吧。
你再仔细检查一下sql语句,和 程序的执行过程。
参考:按照这个错误的原因和解决方案。
Error:
ORA-00972: identifier is too long
Cause:
You tried to reference a table, cluster, view, index, synonym, tablespace, or username with a value that was longer than 30 characters.
Action:
The options to resolve this Oracle error are:
Names for tables, clusters, views, indexes, synonyms, tablespaces, and usernames must be 30 characters or less. You must shorten the name to no more than 30 characters for these objects. 参考技术A 应该不是总长度的问题吧。我通常都用varchar2来存贮字符,可以存储32767。
但是要注意,有时候在系统的一些函数里varchar2只支持4000,但是它本身是可以存储32767的。 参考技术B 实在没办法就想办法缩短一下SQL语句吧!
比如说用
decode替换case when
to_char(decode(t.PRODUCT_NAME,'P000000005',t.profit,0)) as 产品1 参考技术C 建议你仔细检查下SQL,看两边的是否一致,可以将SQL一段一段的放到long变量里面执行,看能否通过,一步一步排查原因。 参考技术D 一步一步测试,可以打出来看看你拼接的sql语句
以上是关于oracle SELECT语句太长的问题的主要内容,如果未能解决你的问题,请参考以下文章
oracle SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解