【问题标题】:Oracle Jdbc CallableStatement fails with plsql contains CR ("\r")Oracle Jdbc CallableStatement 失败,plsql 包含 CR ("\r")
【发布时间】:2016-03-23 00:18:56
【问题描述】:

我制作了一个简单的 java 程序来从文本文件中读取 plsql 块,然后通过CallableStatement 执行它。

如果文本文件同时使用 CRLF ("\r\n"),则执行失败并出现 ORA-06550PLS-00103(遇到符号 "")。

同时,如果文本文件只使用LF,它也可以正常工作。

NG:

BEGIN\r\nNULL;\r\nEND;

好的:

BEGIN\nNULL;\nEND;

【问题讨论】:

    标签: java oracle jdbc plsql carriage-return


    【解决方案1】:

    *nux 与 Windows 换行符,打赌您的服务器是 *nix,它会将 \r 视为语句的一部分。

    【讨论】:

    • 我不负责数据库管理,所以我使用SELECT PRODUCT, VERSION FROM SYS.PRODUCT_COMPONENT_VERSION;检查数据库信息,它显示TNS for 64-bit Windows: 10.2.0.5.0。我猜它是一个 Windows 服务器。
    【解决方案2】:

    文件与示例不匹配,或者文本在发送到 Oracle 之前必须由其他进程翻译。无论版本和操作系统如何,这两个示例都可以在 Oracle 上正常运行。将命令构建为字符串并在SELECT 语句中使用DUMP 以查看发送到Oracle 的确切字符可能会有所帮助。

    下面的代码运行没有错误,表明换行和回车的任何组合都足以分隔关键字。

    declare
        lf varchar2(1) := chr(10);
        cr varchar2(1) := chr(13);
    begin
        execute immediate 'begin'||lf||'null;'||lf||'end;';
        execute immediate 'begin'||cr||lf||'null;'||cr||lf||'end;';
        execute immediate 'begin'||cr||'null;'||cr||'end;';
    end;
    /
    

    【讨论】:

    • 感谢您的回复。您是正确的,CRLF 和 LF 在直接在 Oracle 上执行时都可以正常工作,但我的问题与 JDBC 的 CallableStatement 有关
    • 但是这些错误消息来自 Oracle,而不是 Java。我认为程序没有发送你认为它正在发送的字符串。
    • 您再次认为正确,这就是我在帖子中提出的问题(oracle jdbc CallableStatement 的问题)。
    【解决方案3】:

    我遇到了同样的问题,通过在使用文件内容之前替换所有换行符解决了它:

    plsqlText = plsqlText.replace("\r\n", " ");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 2015-11-11
      • 2019-05-06
      • 2012-12-07
      • 1970-01-01
      相关资源
      最近更新 更多