从 java 到 plsql varchar2(1) 的单个字符串导致 'character string buffer too small'

Single character string from java to plsql varchar2(1) causes 'character string buffer too small'

我必须从 jdbc 接口调用 Oracle 存储过程。过程采用记录类型参数,其中包括 VARCHAR(2) 字段:

TYPE cust_account_rec_type IS RECORD (
    ... , status VARCHAR2(1), ... );

我的jdbc查询字符串声明了记录类型变量并将值赋给状态字段,其中右侧是查询参数。然后,调用程序。

p_cust_account_rec.status   := :IN_insert_status;

someprocedure(p_cust_account_rec);

Java 查询调用设置 IN_insert_status 参数的值:

callableStatement.setString("IN_insert_status", "I");
// callableStatement is type of java.sql.CallableStatement

在 callableStatement.execute() 之后我得到了

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

消息指向符合这个单字符 varchar 变量的行。但是,当我将 sql 查询字符串中的值硬编码为:

  p_cust_account_rec.status   := 'I';

有效。

在 java 中传递单个字符串有什么问题,或者我缺少什么?

我有办法。其实问题出在别处。 我发现使用 oracle jdbc 驱动程序时,我应该以与在 SQL 中出现的顺序相同的顺序设置查询参数值(在 java 中),即使我使用了命名参数, 不是 ?索引。

所以,我有这样的查询片段

p_cust_account_rec.account_name      := :IN_account_name;  -- VARCHAR2(240)
p_cust_account_rec.status            := :IN_insert_status; -- VARCHAR2(1) 

和Java 来电(重要顺序)

callableStatement.setString("IN_insert_status", "I");
callableStatement.setString("IN_account_name", "Some Account Name");

并以 IN_account_name = "I" 和 IN_insert_statis = "Some Account Name" 结束,由于 insert_status VARCHAR2( 1) 自然。

我不能 100% 确认 oracle jdbc 因为我只是阅读反编译代码,但也提到了这个问题 http://info.michael-simons.eu/2012/07/23/oracle-jbdc-callablestatements-and-named-parameters/。但是,它解决了我的问题。