jdbc调用oracle的存储过程sp,sp编译通过.存储过程:
CREATE OR REPLACE PROCEDURE ZGGF.SP(
i_xml_byte in CLOB,
o_result out VARCHAR2
)
AS
...
java代码:
CallableStatement sp = conn.prepareCall("{call ZGGF.SP(?,?)}");
byte[] xmlBytes = FileUtils.file2byte(FileUtils.getXmlFilepath("SQL.xml"));
sp.setBytes(1, xmlBytes);
sp.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);错误信息:
java.sql.SQLException: ORA-06550: 第 1 行, 第 7 列: 
PLS-00306: 调用 'SP'时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列: 
PL/SQL: Statement ignored
各位大虾,,,指点指点啊..

解决方案 »

  1.   

    个人认为是参数类型错误,因为SP要求的是CLOB类型的,而我传的是byte[],
    在不改变SP的情况,怎么修改java代码....???各位大虾,,指点迷津啊..
      

  2.   

    如果java代码修改成,
    Statement st = conn.createStatement();   
    rs = st.executeQuery("select empty_clob() as clob_field from dual");   
         if (rs.next()) {   
             oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("clob_field");   
             CallableStatement sp = conn.prepareCall("{call ZGGF.SP(?,?)}");
             byte[] xmlBytes = FileUtils.file2byte(FileUtils.getXmlFilepath("SQL.xml"));
             clob.setBytes(xmlBytes);
             sp.setClob(1, clob);
             sp.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
             sp.execute();
             ...
         } 
    红色字体处就会报数组越界异常,
    java.lang.ArrayIndexOutOfBoundsException
    at java.lang.System.arraycopy(Native Method)
    at oracle.jdbc.driver.DatumBinder.bind(OraclePreparedStatement.java:15848)
    at oracle.jdbc.driver.OraclePreparedStatement.setupBindBuffers(OraclePreparedStatement.java:2866)
    at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:2151)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3280)
    at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3390)
    at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4223)
    ...
      

  3.   

    oracle.sql.CLOB clob = oracle.sql.CLOB.getEmptyClob();...
      

  4.   

    sp.setString()呢你这个xml文件可以当作一个String来处理,为何要用bytes,图片之类的文件才用bytes
    印象里往clob中直接插入String是可以的
      

  5.   

    因为Oracle varchar 最大的长度是4m,而我要传的文件是比4m大的多了。
      

  6.   

    搞定,,// Open the sample file as a stream
    File file = new File(FileUtils.getXmlFilepath("SQL.xml"));
    FileInputStream fileInputStream = new FileInputStream(file);CallableStatement sp = conn.prepareCall("{call ZGGF.SP_XML_PROCESSOR(?,?)}");
    sp.setAsciiStream(1, fileInputStream, (int)file.length());
    sp.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR); 
    sp.execute();
    ...