为了账号安全,请及时绑定邮箱和手机立即绑定

将空的sql数组发送到oracle过程中

将空的sql数组发送到oracle过程中

潇湘沐 2023-07-19 15:01:29
我正在尝试将 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)iso_ext_acc varchar2(20);o_beginRest number;o_endRest number;o_name varchar2(100);o_rest number;o_type varchar2(100);beginFOR i IN 1.. i_ids.count LOOPo_ext_acc := i_ids(i);-- testRAISE_ERROR(20000, 'o_ext_acc -' ||o_ext_acc);UPD 当我设置调试模式以查看 arr 发生了什么时,我注意到了这个数据。这意味着数组不从中获取值,并且它显示问号而不是它。
查看完整描述

2 回答

?
www说

TA贡献1775条经验 获得超8个赞

经过两天的搜索,主要问题是 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);

//img1.sycdn.imooc.com//64b78a75000139cf05980487.jpg

并将这个库添加到maven中


<dependency>

        <groupId>com.oracle</groupId>

        <artifactId>orai18n</artifactId>

        <version>11.1.0.7.0</version>

    </dependency>

这对我有用。我认为他们都是解决问题的关键。下面的图片开头。

//img1.sycdn.imooc.com//64b78a810001b3ba05940484.jpg

查看完整回答
反对 回复 2023-07-19
?
万千封印

TA贡献1891条经验 获得超3个赞

使用oracle.sql.ARRAYandoracleConnection.setARRAY()而不是java.sql.Arrayand 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();


查看完整回答
反对 回复 2023-07-19
  • 2 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信