Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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 如何使用Char in out参数调用Oracle存储过程?_Java_Oracle_Jdbc - Fatal编程技术网

Java 如何使用Char in out参数调用Oracle存储过程?

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

我需要帮助。我试图从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.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进行了尝试它工作正常,代码没有任何更改。