我在使用oracle的java和数据库连接中编写代码。我运行一些脚本并得到此错误。我的脚本在toad中工作但在我的项目中不起作用
网址包括
.
.
.
.
DECODE
(REF.target_type_code,
'1', wf.workflow_name,
'20', reqtyp.request_type_name,
'6', prj1.project_name,
'59', trootinfo1.NAME,
'55', DECODE
(document.checked_out_by,
NULL,
REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(knta_i18n_resource.get
('DMS_REFERENCE_DETAIL_CHECKED_OUT.TXT'
),
knta_i18n_format_utils.format_date
(document.checked_in_date,
3
)
)
),
document.version_number
)
),
'{4}'
)
)
) reference_detail,
.
.
.
try {
stmt = connection.createStatement();
rset = stmt.executeQuery(url) ;
} catch (Exception e)
{
error= e.getLocalizedMessage() ;
return 4;
}
由于{}括号而发生此错误。我测试一下 当我删除括号时不要错误。但我需要它们,我该如何解决这个问题?
答案 0 :(得分:11)
全部是关于{
和}
。你不使用它们。 Ojdbc不会解析它。使用不同的令牌代替它们。
答案 1 :(得分:2)
这可能是由于JDBC Escape语法(参见JDBC 4.1规范的第13.4节)。 JDBC驱动程序应该处理{
和}
之间的转义,并将转义的标准函数,外连接等转换为特定于数据库的格式。
据我所知,驱动程序应该只解析转义,如果它出现在语句体本身中,而不是当它在语句中的文本内部时(就像在你的例子中那样)。所以对我而言,这看起来像是驱动程序的JDBC转义处理中的错误。
答案 2 :(得分:1)
您可以通过关注另一个StackOverflow帖子的答案来解决这个问题: Create Java on Oracle database with JDBC
摘要是:
CallableStatement stat = conn.prepareCall(sql);
stat.setEscapeProcessing(false);
stat.execute();
中间线是你似乎缺少的。直到我找到那个帖子,我才能弄明白。
答案 3 :(得分:0)
似乎有几个REPLACE调用没有足够的参数。从左边开始计数,第一个REPLACE有两个参数。第二个只有一个论点。第三个有两个论点。第四个只有一个论点。第五个(最后一个)有两个参数。在Oracle中,REPLACE function至少需要两个参数。我无法确定这是否是错误的原因,因为您没有发布完整的声明,但我当然希望缺少适当的REPLACE参数是一个问题。
分享并享受。
答案 4 :(得分:0)
在脚本中用'{4}'
替换CHR(123)||'4'||CHR(125)
。