Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java到plsql varchar2(1)的单个字符串导致';字符串缓冲区太小';_Java_Oracle_Jdbc_Plsql_Varchar - Fatal编程技术网

从java到plsql varchar2(1)的单个字符串导致';字符串缓冲区太小';

从java到plsql varchar2(1)的单个字符串导致';字符串缓冲区太小';,java,oracle,jdbc,plsql,varchar,Java,Oracle,Jdbc,Plsql,Varchar,我必须从jdbc接口调用Oracle存储过程。过程采用记录类型参数,该参数包括VARCHAR(2)字段: 我的jdbc查询字符串声明记录类型变量并将值分配给状态字段,其中右侧是一个查询参数。然后,调用过程 p_cust_account_rec.status := :IN_insert_status; someprocedure(p_cust_account_rec); Java查询调用设置IN_insert_状态参数的值: callableStatement.setString("IN_

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

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

p_cust_account_rec.status   := :IN_insert_status;

someprocedure(p_cust_account_rec);
Java查询调用设置IN_insert_状态参数的值:

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

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

  p_cust_account_rec.status   := 'I';
它起作用了


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

我有解决方案。事实上,问题出在别处。 我发现,使用OracleJDBC驱动程序时,我需要按照SQL中出现的顺序设置查询参数值(java),即使我使用了命名参数,不是吗?我明白了

所以,我有一个类似的查询片段

p_cust_account_rec.account_name      := :IN_account_name;  -- VARCHAR2(240)
p_cust_account_rec.status            := :IN_insert_status; -- VARCHAR2(1) 
和Java调用,如(订单重要)

它以IN_account_name=“I”和IN_insert_statis=“Some account name”结尾,由于insert_status VARCHAR2(1)的性质,这导致了“字符缓冲区大小错误”


对于oracle jdbc,我不能100%确认这一点,因为我只是在阅读反编译代码,但也提到了这个问题。但是,它解决了我的问题。

我被禁止对数据库进行任何更改。这是一个外部数据库,从这个角度来看,它对我来说是“只读”的,
  p_cust_account_rec.status   := 'I';
p_cust_account_rec.account_name      := :IN_account_name;  -- VARCHAR2(240)
p_cust_account_rec.status            := :IN_insert_status; -- VARCHAR2(1) 
callableStatement.setString("IN_insert_status", "I");
callableStatement.setString("IN_account_name", "Some Account Name");