通过 Spring 从 PL/SQL 读取 Blob
我正在尝试通过 PL/SQL、Spring 和 JDBC 检索 Blob 值。
这是我的 PL/SQL
function GETBLOB(pjobid in number)
RETURN bobrecCur
is
vbobrecCur bobrecCur;
begin
OPEN vbobrecCur FOR
SELECT jobid, filecontent
FROM TESTBULKJOBDATAFILE
WHERE jobid = pjobid;
RETURN vbobrecCur;
end GETBLOB
,我的 Java 代码是
this.getDataJdbcCall =
new SimpleJdbcCall( this.jdbcTemplate )
.withFunctionName( SQL_READ_DATA )
.withoutProcedureColumnMetaDataAccess()
.declareParameters(
new SqlOutParameter( "abc", OracleTypes.CURSOR ),
new SqlParameter( "pjobid", OracleTypes.INTEGER )
);
Map input = new HashMap();
input.put( "pjobid", 99999 );
ResultSet result = this.getDataJdbcCall.executeFunction(ResultSet.class , input );
DefaultLobHandler lob = new DefaultLobHandler();
InputStream is = lob.getBlobAsBinaryStream( result, 1 );
我收到以下异常..基本上说 Resultset 为空。
线程“main”中的异常 java.lang.NullPointerException 在org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:91) 在 org.springframework.jdbc.core.JdbcTemplate.processResultSet(JdbcTemplate.java:1120) 在org.springframework.jdbc.core.JdbcTemplate.extractOutputParameters(JdbcTemplate.java:1089) 在 org.springframework.jdbc.core.JdbcTemplate$5.doInCallableStatement(JdbcTemplate.java:996) 在 org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:935) 在 org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:984) 在org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:364) 在 org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:349) 在 org.springframework.jdbc.core.simple.SimpleJdbcCall.executeFunction(SimpleJdbcCall.java:137)
我经历了 这个问题应该对我有用。但我认为我使用 OracleLobHandler 的方式不正确。
有人能告诉我我哪里出了问题吗?
I am trying to retrieve a Blob value thorugh PL/SQL, Spring and JDBC.
Here is my PL/SQL
function GETBLOB(pjobid in number)
RETURN bobrecCur
is
vbobrecCur bobrecCur;
begin
OPEN vbobrecCur FOR
SELECT jobid, filecontent
FROM TESTBULKJOBDATAFILE
WHERE jobid = pjobid;
RETURN vbobrecCur;
end GETBLOB
And my Java code is
this.getDataJdbcCall =
new SimpleJdbcCall( this.jdbcTemplate )
.withFunctionName( SQL_READ_DATA )
.withoutProcedureColumnMetaDataAccess()
.declareParameters(
new SqlOutParameter( "abc", OracleTypes.CURSOR ),
new SqlParameter( "pjobid", OracleTypes.INTEGER )
);
Map input = new HashMap();
input.put( "pjobid", 99999 );
ResultSet result = this.getDataJdbcCall.executeFunction(ResultSet.class , input );
DefaultLobHandler lob = new DefaultLobHandler();
InputStream is = lob.getBlobAsBinaryStream( result, 1 );
I am getting the following exception.. basically saying that Resultset is null.
Exception in thread "main" java.lang.NullPointerException
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:91)
at org.springframework.jdbc.core.JdbcTemplate.processResultSet(JdbcTemplate.java:1120)
at org.springframework.jdbc.core.JdbcTemplate.extractOutputParameters(JdbcTemplate.java:1089)
at org.springframework.jdbc.core.JdbcTemplate$5.doInCallableStatement(JdbcTemplate.java:996)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:935)
at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:984)
at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:364)
at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:349)
at org.springframework.jdbc.core.simple.SimpleJdbcCall.executeFunction(SimpleJdbcCall.java:137)
I went through this question which should work for me. But I think the way I am using OracleLobHandler is not right.
Can anybody shed any light on where I am going wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
没关系,我想出了如何使用 BLOB 返回类型而不是游标来做到这一点。
在Java中我这样做了
Never mind, I figured out how to do it with a BLOB return type rather than a Cursor.
And in Java I did this