如何修复此错误:不支持的SQL92?

11

我使用Java编写代码,并与Oracle建立数据库连接。运行某些脚本时,出现了以下错误。这些脚本在Toad中可以正常工作,但在我的项目中无法正常工作。

URL包括 .

.
.
.
.
    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; 
}

这个错误是因为 { } 括号引起的。我测试了一下,当我删除这些括号时就不会出现错误。但是我需要这些括号,那么我该如何解决这个问题呢?


展示你的查询。你的查询似乎不正确。 - devang
我的查询在Toad中可以运行,但在我的NetBeans中无法运行。 - CompEng
如果你想得到帮助,请考虑两件事情。1)url include "{2}":仅发布此作为错误消息是不够的,需要发布整个错误消息。2)在调用stmt.executeQuery(url)之前,您还应该发布url变量的值。 - bpgergo
@Ersin,仅凭它在TOAD中工作的事实,没有人能够提供帮助。请发布语句字符串。 - bpgergo
将代码中的 {} 替换为 () 并尝试运行。 - Jacob
5个回答

20

这与 {} 有关。您不能使用它们,因为 Ojdbc 无法解析它们。请使用不同的令牌代替它们。


我应该使用哪个令牌?当我使用JDBC调用一个过程时,我遇到了同样的问题。 - Jswq
你可以使用任何你想要的东西。例如,使用_xx_,先替换它,然后再重新替换以翻转。 - CompEng

3
这可能是由于JDBC转义语法(请参阅JDBC 4.1规范的第13.4节)引起的。JDBC驱动程序应处理在{}之间的转义,并将转义的标准函数、外连接等转换为数据库特定格式。
据我所知,仅当它出现在语句本身的主体中时,驱动程序才应解析转义,而不是当它位于语句中的文本内部时(就像在您的示例中那样)。因此,在我看来,这似乎是您的驱动程序中JDBC转义处理中的一个错误。

2

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

摘要如下:

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

中间那一行似乎是你所缺失的。在我找到那篇帖子之前,我无法理解它。

0

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


0

似乎有几个REPLACE调用没有足够的参数。从左边开始计数,第一个REPLACE有两个参数。第二个只有一个参数。第三个有两个参数。第四个只有一个参数。第五个(最后一个)有两个参数。在Oracle中, REPLACE函数至少需要两个参数。由于您没有发布完整的语句,我无法确定这是否是错误的原因,但我肯定期望REPLACE缺少适当的参数是一个问题。

分享并享受。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接