Java 如何使用Char in out参数调用Oracle存储过程?
我需要帮助。我试图从java调用pl/sql函数。pl/sql函数将IN OUT CHAR参数作为参数之一。我只向它发送1个字符,并将该字符值赋给一个临时字符值。但是得到pl/sql数值错误,进一步调试显示参数的长度类似于32767。无法获得如何解决它。我正在使用Oracle12CDB和ojdbc7.jar连接到它。下面是java代码和PL/SqL代码Java 如何使用Char in out参数调用Oracle存储过程?,java,oracle,jdbc,Java,Oracle,Jdbc,我需要帮助。我试图从java调用pl/sql函数。pl/sql函数将IN OUT CHAR参数作为参数之一。我只向它发送1个字符,并将该字符值赋给一个临时字符值。但是得到pl/sql数值错误,进一步调试显示参数的长度类似于32767。无法获得如何解决它。我正在使用Oracle12CDB和ojdbc7.jar连接到它。下面是java代码和PL/SqL代码 import java.sql.Connection; import java.sql.DriverManager; import java.s
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Types;
public class TestInOutParam {
public static void main(String[] args){
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con=DriverManager.getConnection("jdbc:oracle:thin:@ragh:1521:inst1","schema1","schema1");
OracleCallableStatement procCall = (OracleCallableStatement)con.prepareCall("{? = call TEMPPROC (?,?,?,?)}");
String a = "ragh";
String b="n";
Integer c = 50;
procCall.registerOutParameter(1, Types.INTEGER);
procCall.registerOutParameter(2, Types.VARCHAR);
procCall.registerOutParameter(3, Types.CHAR, 0, 1);
procCall.registerOutParameter(4, Types.INTEGER);
procCall.registerOutParameter(5, Types.DATE);
procCall.setString(2, a);
procCall.setString(3, b);
procCall.setInt(4, c);
procCall.setDate(5, getCurrentDate());
procCall.executeUpdate();
}catch(Exception e){ System.out.println(e);}
}
private static java.sql.Date getCurrentDate() {
java.util.Date today = new java.util.Date();
return new java.sql.Date(today.getTime());
}
}
下面是PL/SQL代码
CREATE TABLE TEMP
(
MSG VARCHAR2(3000 BYTE),
DT DATE
)
/
CREATE OR REPLACE function tempproc(a in out varchar, b in out char, c in out integer, d in out date) return integer
is
errm varchar2(3000);
tempb char(32);
tempa varchar2(10);
tempc integer;
tempd date;
result integer;
begin
tempa := a;
insert into temp values('varchar value'||tempa, sysdate); commit;
tempc := c;
insert into temp values('integer value'||tempc, sysdate); commit;
tempd := d;
insert into temp values('date value', tempd); commit;
tempb := b;
insert into temp values('char value'||tempb, sysdate); commit;
commit;
return result;
exception
when others then
errm := sqlerrm;
insert into temp values ('ex'||errm, sysdate);
commit;
return 2;
end;
/
为什么要为
procCall.registerOutParameter(3,Types.CHAR,0,1)设置长度代码>但尚未对procCall.registerOutParameter(2,Types.VARCHAR)执行此操作代码>?我们正在指定char数据类型的长度,这看起来像ojdbc7中的一个bug;它似乎可以与ojdbc6配合使用。如果您给出的值小于该值,maxLength
似乎设置为4000,并且由于它是char
,所以空间填充到该长度。您的tempb
太小了。除非它是一个已知的补丁问题(和/或您想提出CR),否则您需要在PL/SQL代码中解决它?谢谢您的回复。同样的代码可以工作,如果我删除了IN-OUT规范,我发现ojdbc6也存在同样的问题,您是否尝试使用oracle 12c?使用ojdbc6.jar进行了尝试,效果很好,代码没有任何更改。为什么要为procCall.registerOutParameter(3,Types.CHAR,0,1)设置长度代码>但尚未对procCall.registerOutParameter(2,Types.VARCHAR)执行此操作代码>?我们正在指定char数据类型的长度,这看起来像ojdbc7中的一个bug;它似乎可以与ojdbc6配合使用。如果您给出的值小于该值,maxLength
似乎设置为4000,并且由于它是char
,所以空间填充到该长度。您的tempb
太小了。除非它是一个已知的补丁问题(和/或您想提出CR),否则您需要在PL/SQL代码中解决它?谢谢您的回复。同样的代码可以工作,如果我删除了IN-OUT规范,我发现ojdbc6也存在同样的问题,您是否尝试过使用oracle 12c?使用ojdbc6.jar进行了尝试它工作正常,代码没有任何更改。