Oracle Jdbc CallableStatement 失败,plsql 包含 CR ("\r")

Posted

技术标签:

【中文标题】Oracle Jdbc CallableStatement 失败,plsql 包含 CR ("\\r")【英文标题】: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;

【问题讨论】:

【参考方案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", " ");

【讨论】:

以上是关于Oracle Jdbc CallableStatement 失败,plsql 包含 CR ("\r")的主要内容,如果未能解决你的问题,请参考以下文章

java(jdbc)向oracle中插入记录

JDBC连接ORACLE

没有找到适合“jdbc:oracle:thin:@****”oracle/jdbc/driver/OracleDriver”的驱动程序;

oracle jdbc中getConnection中的参数如何配置才能获得连接,

安装数据oracle,改了实例名,使用jdbc怎么写?

使用jdbc连接oracle