import java.sql.*; import java.io.*; public class sendFile { public static void main (String args[]) throws Exception { File file = new File("a.txt"); FileInputStream fis = new FileInputStream(file); byte[] data = new byte[(int)file.length()]; fis.read(data); fis.close(); String s = new String(data, "UTF-8"); Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection("user/pwd@dbhost:dbport/dbservice.domain"); String t = "declare l_file utl_file.file_type utl_file.fopen('FOO','test.txt','w'); begin utl_file.put_line(l,?); end;"; CallableStatement cstmt = conn.prepareCall(t); cstmt.setString(1,s); cstmt.execute(); }
Large strings result in the following…
-bash-4.1$ time java sendFile Exception in thread "main" java.sql.SQLException: ORA-06502: PL/SQL: numeric or value error ORA-06512: at line 1 at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879) at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192) at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531) at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:204) at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1041) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1329) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584) at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3685) at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4714) at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1376) at sendFile.main(sendFile.java:16) real 0m32.713s user 0m2.076s sys 0m1.185s }