9

我在java中编写代码并与oracle建立数据库连接。我运行一些脚本并收到此错误。我的脚本在 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; 
}

由于 { } 括号而发生此错误。我测试它。当我删除括号时不会出错。但我需要它们,我该如何解决这个问题?

4

5 回答 5

16

这都是关于{和 的}。你不使用它们。Ojdbc 不会解析它。使用不同的令牌代替它们。

于 2012-09-05T12:36:03.203 回答
3

这可能是由于 JDBC Escape 语法(参见 JDBC 4.1 规范的第 13.4 节)。JDBC 驱动程序应处理和之间的转义,{并将}转义的标准函数、外连接等转换为数据库特定格式。

据我所知,驱动程序应该只解析出现在语句主体本身中的转义,而不是当它在语句中的文本内时(如您的示例中所示)。所以对我来说,这看起来像是驱动程序的 JDBC 转义处理中的一个错误。

于 2012-09-08T08:12:28.163 回答
1

您可以通过遵循另一个 StackOverflow 帖子的答案来解决这个问题: 使用 JDBC 在 Oracle 数据库上创建 Java

总结如下:

CallableStatement stat = conn.prepareCall(sql);
stat.setEscapeProcessing(false);
stat.execute();

中间线是你似乎缺少的东西。在我找到那个帖子之前我无法弄清楚。

于 2018-04-10T21:51:16.003 回答
0

似乎有几个 REPLACE 调用没有足够的参数。从左边数起,第一个 REPLACE 有两个参数。第二个只有一个论点。第三个有两个论点。第四个只有一个论点。第五个(最后一个)有两个参数。在 Oracle 中,REPLACE 函数至少需要两个参数。我无法确定这是否是错误的原因,因为您尚未发布完整的声明,但我当然希望 REPLACE 缺乏适当的论据是一个问题。

分享和享受。

于 2012-09-04T11:18:52.847 回答
0

在您的脚本中替换'{4}'为。CHR(123)||'4'||CHR(125)

于 2019-08-22T16:12:04.520 回答