将空 sql 数组发送到 oracle 过程
Sending empty sql Array into oracle procedure
我正在尝试将 sql.Array 发送到过程中,但不知何故它在 oracle 过程中变空了。
我的 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);
我看到在用空 o_ext_acc 执行此错误后显示此消息我将其重定向到其他过程
java.sql.SQLException: ORA-20000:
20000: o_ext_acc -
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:205)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1043)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1336)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3613)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3714)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4755)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1378)
at com.uzb.bank.demo.service.impl.GenerateIntoXmlImpl.accountStatement(GenerateIntoXmlImpl.java:414)
at com.uzb.bank.demo.controller.Controller.accountStatement(Controller.java:72)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
UPD
当我进入调试模式以查看 arr 发生了什么时,我注意到这个 data.Which 意味着数组不从中获取值并且它显示问号而不是它。
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 sending array element here is empty. Here
should be element of sending array/ORA-06512: на
"IBS.RAISE_ERROR", line 74 ORA-06512: на "IBS.BSS_ACC", line 30
ORA-06512: на line 1
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447) at
oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) at
oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951) at
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
我无法在过程中发送 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 );
String [] name = new String[]{"20206643799002684001","20206643799002684001"};
ArrayDescriptor arrDec = ArrayDescriptor.createDescriptor("ARRAY_VARCHAR2",oconnection);
ARRAY arr = new ARRAY(arrDec,oconnection,name);
/*
* Or
* ARRAY arr = oconnection.createARRAY("ARRAY_VARCHAR2", name);
*/
OracleCallableStatement callableStatement
= (OracleCallableStatement) oconnection.prepareCall("{call bss_acc.ACC_STATEMENT(?,?,?,?)}");
callableStatement.setDate(1,date);
callableStatement.setDate(2,dateL);
callableStatement.setARRAY(3,arr);
callableStatement.setString(4,this.branchId);
callableStatement.execute();
经过两天的搜索主要问题是 datumnArray 是 ???。这意味着 oracld db 和 jdbc 与添加此代码的 characterset.After 不匹配。
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>
这对我有用。我认为他们两个都对解决 problem.At 下图的开头起着至关重要的作用。
我正在尝试将 sql.Array 发送到过程中,但不知何故它在 oracle 过程中变空了。
我的 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);
我看到在用空 o_ext_acc 执行此错误后显示此消息我将其重定向到其他过程
java.sql.SQLException: ORA-20000: 20000: o_ext_acc - at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951) at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227) at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531) at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:205) at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1043) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1336) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3613) at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3714) at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4755) at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1378) at com.uzb.bank.demo.service.impl.GenerateIntoXmlImpl.accountStatement(GenerateIntoXmlImpl.java:414) at com.uzb.bank.demo.controller.Controller.accountStatement(Controller.java:72) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908) at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
UPD 当我进入调试模式以查看 arr 发生了什么时,我注意到这个 data.Which 意味着数组不从中获取值并且它显示问号而不是它。
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 sending array element here is empty. Here should be element of sending array/ORA-06512: на "IBS.RAISE_ERROR", line 74 ORA-06512: на "IBS.BSS_ACC", line 30 ORA-06512: на line 1
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951) at 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
我无法在过程中发送 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 );
String [] name = new String[]{"20206643799002684001","20206643799002684001"};
ArrayDescriptor arrDec = ArrayDescriptor.createDescriptor("ARRAY_VARCHAR2",oconnection);
ARRAY arr = new ARRAY(arrDec,oconnection,name);
/*
* Or
* ARRAY arr = oconnection.createARRAY("ARRAY_VARCHAR2", name);
*/
OracleCallableStatement callableStatement
= (OracleCallableStatement) oconnection.prepareCall("{call bss_acc.ACC_STATEMENT(?,?,?,?)}");
callableStatement.setDate(1,date);
callableStatement.setDate(2,dateL);
callableStatement.setARRAY(3,arr);
callableStatement.setString(4,this.branchId);
callableStatement.execute();
经过两天的搜索主要问题是 datumnArray 是 ???。这意味着 oracld db 和 jdbc 与添加此代码的 characterset.After 不匹配。
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>
这对我有用。我认为他们两个都对解决 problem.At 下图的开头起着至关重要的作用。