一般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'。