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-06550
和 PLS-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")的主要内容,如果未能解决你的问题,请参考以下文章
没有找到适合“jdbc:oracle:thin:@****”oracle/jdbc/driver/OracleDriver”的驱动程序;