Java 将空sql数组发送到oracle过程
我试图将sql.Array发送到过程中,但不知怎的,它在oracle过程中变为空Java 将空sql数组发送到oracle过程,java,arrays,oracle,jdbc,procedure,Java,Arrays,Oracle,Jdbc,Procedure,我试图将sql.Array发送到过程中,但不知怎的,它在oracle过程中变为空 oracle.jdbc.OracleConnection connection = (OracleConnection) JdbcConnection.getInstance().createConnection(); String [] name = new String[]{"20206643799002684001","20206643799002684001"};
oracle.jdbc.OracleConnection connection = (OracleConnection) JdbcConnection.getInstance().createConnection();
String [] name = new String[]{"20206643799002684001","20206643799002684001"};
ArrayDescriptor arrDec = ArrayDescriptor.createDescriptor("ARRAY_VARCHAR2",connection.unwrap(oracle.jdbc.OracleConnection.class));
Array arr = new ARRAY(arrDec,connection.unwrap(oracle.jdbc.OracleConnection.class),name);
OracleCallableStatement callableStatement = connection.prepareCall("{call bss_acc.ACC_STATEMENT(?,?,?,?)}");
callableStatement.setDate(1,date);
callableStatement.setDate(2,dateL);
((OracleCallableStatement)callableStatement).setARRAY(3,arr);
callableStatement.setString(4,this.branchId);
callableStatement.execute();
procedure ACC_STATEMENT
(
i_begin_date date,
i_end_date date,
i_ids array_varchar2,
i_mfo varchar2
)
is
o_ext_acc varchar2(20);
o_beginRest number;
o_endRest number;
o_name varchar2(100);
o_rest number;
o_type varchar2(100);
begin
FOR i IN 1.. i_ids.count LOOP
o_ext_acc := i_ids(i);
-- test
RAISE_ERROR(20000, 'o_ext_acc -' ||o_ext_acc);
我的java代码用数据填充sql.Array并尝试将其发送到过程中
oracle.jdbc.OracleConnection connection = (OracleConnection) JdbcConnection.getInstance().createConnection();
String [] name = new String[]{"20206643799002684001","20206643799002684001"};
ArrayDescriptor arrDec = ArrayDescriptor.createDescriptor("ARRAY_VARCHAR2",connection.unwrap(oracle.jdbc.OracleConnection.class));
Array arr = new ARRAY(arrDec,connection.unwrap(oracle.jdbc.OracleConnection.class),name);
OracleCallableStatement callableStatement = connection.prepareCall("{call bss_acc.ACC_STATEMENT(?,?,?,?)}");
callableStatement.setDate(1,date);
callableStatement.setDate(2,dateL);
((OracleCallableStatement)callableStatement).setARRAY(3,arr);
callableStatement.setString(4,this.branchId);
callableStatement.execute();
procedure ACC_STATEMENT
(
i_begin_date date,
i_end_date date,
i_ids array_varchar2,
i_mfo varchar2
)
is
o_ext_acc varchar2(20);
o_beginRest number;
o_endRest number;
o_name varchar2(100);
o_rest number;
o_type varchar2(100);
begin
FOR i IN 1.. i_ids.count LOOP
o_ext_acc := i_ids(i);
-- test
RAISE_ERROR(20000, 'o_ext_acc -' ||o_ext_acc);
在这个过程中,我把日志放进去,以查看在执行这个过程之后,我得到了什么值。我总是得到空的数组元素,在这个过程中出现
oracle.jdbc.OracleConnection connection = (OracleConnection) JdbcConnection.getInstance().createConnection();
String [] name = new String[]{"20206643799002684001","20206643799002684001"};
ArrayDescriptor arrDec = ArrayDescriptor.createDescriptor("ARRAY_VARCHAR2",connection.unwrap(oracle.jdbc.OracleConnection.class));
Array arr = new ARRAY(arrDec,connection.unwrap(oracle.jdbc.OracleConnection.class),name);
OracleCallableStatement callableStatement = connection.prepareCall("{call bss_acc.ACC_STATEMENT(?,?,?,?)}");
callableStatement.setDate(1,date);
callableStatement.setDate(2,dateL);
((OracleCallableStatement)callableStatement).setARRAY(3,arr);
callableStatement.setString(4,this.branchId);
callableStatement.execute();
procedure ACC_STATEMENT
(
i_begin_date date,
i_end_date date,
i_ids array_varchar2,
i_mfo varchar2
)
is
o_ext_acc varchar2(20);
o_beginRest number;
o_endRest number;
o_name varchar2(100);
o_rest number;
o_type varchar2(100);
begin
FOR i IN 1.. i_ids.count LOOP
o_ext_acc := i_ids(i);
-- test
RAISE_ERROR(20000, 'o_ext_acc -' ||o_ext_acc);
执行此错误后,我看到空o_ext_acc显示此消息,我将其重定向到其他过程中
UPD
当我设置调试模式以查看arr的运行情况时,我注意到了这些数据。这意味着数组不会从中获取值,而是显示问号
UPD
我知道我正在使用sql数组,并将其更改为oracle.sql.array,并尝试使用以下代码创建,但它再次运行为空
oracle.jdbc.OracleConnection connection = (OracleConnection) JdbcConnection.getInstance().createConnection();
String [] name = new String[]{"20206643799002684001","20206643799002684001"};
oracle.sql.ARRAY a = connection.createARRAY("ARRAY_VARCHAR2",name);
CallableStatement callableStatement = connection.prepareCall("{call bss_acc.ACC_STATEMENT(?,?,?,?)}");
callableStatement.setDate(1,date);
callableStatement.setDate(2,dateL);
((OracleCallableStatement)callableStatement).setArray(3,a);
callableStatement.setString(4,this.branchId);
callableStatement.execute();
UPD 3
oracle.jdbc.OracleConnection connection = (OracleConnection) JdbcConnection.getInstance().createConnection();
String [] name = new String[]{"20206643799002684001","20206643799002684001"};
oracle.sql.ArrayDescriptor arrayDescriptor = new ArrayDescriptor("ARRAY_VARCHAR2",connection);
oracle.sql.ARRAY a = new ARRAY(arrayDescriptor,connection,name);
OracleCallableStatement callableStatement = (OracleCallableStatement) connection.prepareCall("{call bss_acc.ACC_STATEMENT(?,?,?,?)}");
callableStatement.setDate(1,date);
callableStatement.setDate(2,dateL);
callableStatement.setARRAY(3,a);
callableStatement.setString(4,this.branchId);
callableStatement.execute();
UPD 4
在发送空的oracle.sql.Array之后,它给出了我的过程中的错误,并在打印部分显示空的sql数组元素
java.sql.SQLException:
ORA-20000:
20000:o_ext_acc:/empty此处的发送数组元素为空。在这里
应该是发送数组的元素/ORA-06512:а
“IBS上升误差”,第74行ORA-06512:ааa“IBS上升误差”,第30行
ORA-06512:1号线
位于的oracle.jdbc.driver.t4cttiore.processError(t4cttiore.java:447)
位于的oracle.jdbc.driver.t4cttiore.processError(t4cttiore.java:396)
位于的oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951)
oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513)
UPD 5
我修改它的程序
FOR i IN 1.. i_ids.count LOOP o_ext_acc := i_ids(i);
-- test
RAISE_ERROR(20000, 'date:' || i_begin_date || 'accountElement ' || o_ext_acc);
然后,我得到了以下错误,我可以看到日期,但有空的o_ext_acc
java.sql.SQLException:ORA-20000:20000:date:02.09.19accountElement
prolbem在过程中发送oracle.jdbc.Array时,我没法捕捉到,不知怎的,它是从jdbc发送到oracle过程中的,就像空数组一样,元素是空的
我从Oracle运行此过程,它运行正常,没有错误使用
Oracle.sql.ARRAY
和oracleConnection.setARRAY()
,而不是java.sql.ARRAY
和javaConnection.setARRAY()
:
Connection-Connection=JdbcConnection.getInstance().createConnection();
OracleConnection oconnection=(OracleConnection)connection.unwrap(oracle.jdbc.OracleConnection.class);
字符串[]名称=新字符串[]{“20206643799002684001”、“20206643799002684001”};
ArrayDescriptor arrDec=ArrayDescriptor.createDescriptor(“ARRAY_VARCHAR2”,occonnection);
ARRAY arr=新阵列(arrDec、occonnection、name);
/*
*或
*ARRAY arr=oconnection.createARRAY(“ARRAY_VARCHAR2”,name);
*/
OracleCallableStatement callableStatement
=(OracleCallableStatement)oconnection.prepareCall({call bss_acc.acc_STATEMENT(?,,,?)});
callableStatement.setDate(1,日期);
callableStatement.setDate(2,dateL);
setARRAY(3,arr);
callableStatement.setString(4,this.branchId);
callableStatement.execute();
另请参见:使用
oracle.sql.ARRAY
和oracleConnection.setARRAY()
而不是java.sql.ARRAY
和javaConnection.setARRAY()
:
Connection-Connection=JdbcConnection.getInstance().createConnection();
OracleConnection oconnection=(OracleConnection)connection.unwrap(oracle.jdbc.OracleConnection.class);
字符串[]名称=新字符串[]{“20206643799002684001”、“20206643799002684001”};
ArrayDescriptor arrDec=ArrayDescriptor.createDescriptor(“ARRAY_VARCHAR2”,occonnection);
ARRAY arr=新阵列(arrDec、occonnection、name);
/*
*或
*ARRAY arr=oconnection.createARRAY(“ARRAY_VARCHAR2”,name);
*/
OracleCallableStatement callableStatement
=(OracleCallableStatement)oconnection.prepareCall({call bss_acc.acc_STATEMENT(?,,,?)});
callableStatement.setDate(1,日期);
callableStatement.setDate(2,dateL);
setARRAY(3,arr);
callableStatement.setString(4,this.branchId);
callableStatement.execute();
另请参见:经过两天的搜索,主要问题是datumnArray是???。这意味着oracld db和jdbc与其字符集不匹配。添加此代码后
String s1 = new String(account.get(0).getBytes(), Charset.forName("ISO-8859-1"));
String [] name = new String[]{s1};
//oracle.sql.ArrayDescriptor arrayDescriptor = new ArrayDescriptor("ARRAY_VARCHAR2",connection);
oracle.sql.ARRAY a = connection.createARRAY("ARRAY_VARCHAR2", name);
并将这个库添加到maven中
<dependency>
<groupId>com.oracle</groupId>
<artifactId>orai18n</artifactId>
<version>11.1.0.7.0</version>
</dependency>
com.oracle
经过两天的搜索,主要问题是datumnArray是???。这意味着oracld db和jdbc与其字符集不匹配。添加此代码后
String s1 = new String(account.get(0).getBytes(), Charset.forName("ISO-8859-1"));
String [] name = new String[]{s1};
//oracle.sql.ArrayDescriptor arrayDescriptor = new ArrayDescriptor("ARRAY_VARCHAR2",connection);
oracle.sql.ARRAY a = connection.createARRAY("ARRAY_VARCHAR2", name);
并将这个库添加到maven中
<dependency>
<groupId>com.oracle</groupId>
<artifactId>orai18n</artifactId>
<version>11.1.0.7.0</version>
</dependency>
com.oracle
Mister@MT0感谢您的回答,但我将其改为oracle.sql.Array,不管怎样,它都会给出空值。@MaksimVasilovichsetARRAY(3,arr)
notsetARRAY(3,arr)
。您能看看UPD3吗?它使用ojdbc6 11.2.0版在pom xml中给出了错误。不是错误,但它发送到过程空数组,这是我正在调用的error@MaksimVasilovich“它会出错”不是建设性的。什么错误?哪里请给出完整的堆栈跟踪,并突出显示与代码段中哪一行相关的行号。Mster@MT0感谢您的回答,但我将其更改为oracle.sql.Array。无论如何,它给出的是空值。@MaksimVasilovichsetARRAY(3,arr)
notsetARRAY(3,arr)
。您能看看UPD3吗?它使用ojdbc6 11.2.0版在pom xml中给出了错误。不是错误,但它发送到过程空数组,这是我正在调用的error@MaksimVasilovich“它会出错”不是建设性的。什么错误?哪里请给出完整的堆栈跟踪,并突出显示代码段中与哪一行相关的行号。