一般docker中安装的XE版本的oracle都会存在java.sql.SQLSyntaxErrorException: ORA-00904: "WM_CONCAT": 标识符无效。当因为oracle 版本问题导致 wm_concat 函数无法调用时可用一下语句创建实现。

注:需要使用 plsql

首先登陆 system 用户为服务配置管理系统的 oracle 用户(例如SCMS )授权:

GRANT create type to SCMS

GRANT create procedure to SCMS

然后在 plsql 登陆 SCMS 用户,在Command window窗口(每段语句后添加/,进行结束)或这SQL window窗口运行以下语句:

创建type头
create or replace type string_sum_obj as object (
--聚合函数的实质就是一个对象
 sum_string varchar2(4000),
 static function ODCIAggregateInitialize(v_self in out string_sum_obj) return number,
 --对象初始化
 member function ODCIAggregateIterate(self in out string_sum_obj, value in varchar2) return number,
 --聚合函数的迭代方法(这是最重要的方法)
 member function ODCIAggregateMerge(self in out string_sum_obj, v_next in string_sum_obj) return number,
 --当查询语句并行运行时,才会使用该方法,可将多个并行运行的查询结果聚合
 member function ODCIAggregateTerminate(self in string_sum_obj, return_value out varchar2 ,v_flags in number) return number
 --终止聚集函数的处理,返回聚集函数处理的结果.
创建type具体
create or replace type body string_sum_obj is
 static function ODCIAggregateInitialize(v_self in out string_sum_obj) return number is
 begin
 v_self := string_sum_obj(null);
 return ODCICONST.Success;
 member function ODCIAggregateIterate(self in out string_sum_obj, value in varchar2) return number is
 begin
 /* 连接,解决逗号分隔第一个字母是逗号的问题 */
 if not self.sum_string is null then
 self.sum_string := self.sum_string ||','|| value;
 self.sum_string := self.sum_string || value;
 end if;
 return ODCICONST.Success;
 /* 最大值 */
 if self.sum_string<value then
 self.sum_string:=value;
 end if;
 /* 最小值 */
 if self.sum_string>value then
 self.sum_string:=value;
 end if;
 return ODCICONST.Success;
 member function ODCIAggregateMerge(self in out string_sum_obj, v_next in string_sum_obj) return number is
 begin
 /* 连接 */
 self.sum_string := self.sum_string || v_next.sum_string;
 return ODCICONST.Success;
 /* 最大值 */
 if self.sum_string<v_next.sum_string then
 self.sum_string:=v_next.sum_string;
 end if;
 /* 最小值 */
 if self.sum_string>v_next.sum_string then
 self.sum_string:=v_next.sum_string;
 end if;
 return ODCICONST.Success;
 member function ODCIAggregateTerminate(self in string_sum_obj, return_value out varchar2 ,v_flags in number) return number is
 begin
 return_value:= self.sum_string;
 return ODCICONST.Success;
create or replace function wm_concat(value Varchar2) return Varchar2
 parallel_enable aggregate using string_sum_obj;

若拷贝的内容执行的时候提示如下错误:

解决版本:将语句拷贝到UE中查看语句中是否有隐藏的?,如果有删除后在运行就可以了。 

"WM_CONCAT"可以实现oracle中字段的合并,可以说功能很强大。但是不知何故,oracle从11g以后,屏蔽了"WM_CONCAT"函数,导致出现了不能之别"WM_CONCAT"函数。针对这个问题我提供了两种解决方案,当然,在之前要准备好三个文件:owmctab.plb\owmaggrs.plb\owmaggrb.plb。方法一:1、通过sqlplus免密码登录oracle: sqlpl... Error updating database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; 错误更新数据库。原因:java. SQL . sqlsyntaxerrorrexception:您有一个错误的SQL语法; SQL语句明明没有问题,数据也正常,却报这样的错误。如果遇到这样的问题可以考虑一下可能是当前操作的表中的字段是MySQL数据库的关键字或保留字。 如我遇到的: 解决:修改当前 @Entity@Table(name = "SUBSCRIPTIONFILE", schema = "SUBSCRIPTIONSERVICES")public class SUBSCRIPTIONFILE {@Id@GeneratedValue(strategy=GenerationType.AUTO)private Long id;private String PRODUCTSKU;privat... CURR_STR VARCHAR2(32767), STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER, MEMBER FU... 导致原因: 11gr2和12C上已经摒弃了wm_concat函数,当时我们很多程序员在程序中确使用了该函数,导致程序出现错误,为了减轻程序员修改程序的工作量,只有通过手工创建个wm_concat函数,来临时解决该问题,但是注意,及时创建了该函数,在使用的过程中,也需要用to_char(wm_concat())方式,才能完全替代之前的应用。 解决办法: sys 登录 1.解锁sys用户 alter user sys account unlock; 2.创建包,包体,函数 以sys用户登录数据库,执行下面的命令 在做一些数据查询时经常会报: java.sql.SQLSyntaxErrorException: ORA-00904: “column”: 标识符无效 或者 “[select * from T_SW_MATERIAL_DL where 1=1 order by MATERIAL_NUM desc]; nested exception is java.sql.SQLException: 列名无效... 解决 bad SQL grammar [xxx]; nested exception is java.sql.SQLSyntaxErrorException: 1. Table xxx doesn't exist 2. You have an error in your SQL syntax;3. Unknown column x in x 4.Unknown column 'xxx' in 'where clause'。