要查看问题:
在Oracle中创建一个表:
create table ut_table_ut_service_pj (
PATH VARCHAR(80),
BINARY BLOB
);
将以下管道粘贴到XPL沙箱中,您可以在http://localhost:8080/orbeon/sandbox-transformations/xpl/
上访问,在您的系统上替换相应的数据库URI,用户名和密码:
<p:config xmlns:p="http://www.orbeon.com/oxf/pipeline"
xmlns:oxf="http://www.orbeon.com/oxf/processors"
xmlns:xforms="http://www.w3.org/2002/xforms"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:sql="http://orbeon.org/oxf/xml/sql"
xmlns:odt="http://orbeon.org/oxf/xml/datatypes"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:exist="http://exist.sourceforge.net/NS/exist">
<p:processor name="oxf:url-generator">
<p:input name="config">
<config>
<url>test.pdf</url>
<mode>binary</mode>
</config>
</p:input>
<p:output name="data" id="document"/>
</p:processor>
<p:processor name="oxf:sql">
<p:input name="datasource">
<datasource>
<driver-class-name>oracle.jdbc.OracleDriver</driver-class-name>
<uri>jdbc:oracle:thin:@//localhost:1522/globaldb</uri>
<username>orbeon</username>
<password>password</password>
</datasource>
</p:input>
<p:input name="data" href="#document"/>
<p:input name="config">
<sql:config>
<sql:connection>
<sql:execute>
<sql:update debug="write">
insert into ut_table_ut_service_pj
values('test.pdf',
<sql:param select="/*"
type="xs:base64Binary" sql-type="blob"/>
)
</sql:update>
</sql:execute>
</sql:connection>
</sql:config>
</p:input>
</p:processor>
</p:config>
这会导致以下异常:
|----------------------------------------------------------------------------------------------------------------------|
|Exception: java.lang.NullPointerException |
|----------------------------------------------------------------------------------------------------------------------|
|org.orbeon.oxf.processor.sql.interpreters.ValueOfCo|<init> |ValueOfCopyOfInterpreter.java | 48|
|org.orbeon.oxf.processor.sql.SQLProcessor$Interpret|addAllDefaultElementHandlers |SQLProcessor.java | 476|
|org.orbeon.oxf.processor.sql.interpreters.ConfigInt|start |ConfigInterpreter.java | 32|
|org.orbeon.oxf.processor.sql.SQLProcessor$Interpret|startElement |SQLProcessor.java | 503|
|org.orbeon.oxf.processor.sql.SQLProcessor$RootInter|startElement |SQLProcessor.java | 280|
为什么会这样?
答案 0 :(得分:0)
ValueOfCopyOfInterpreter
中,interpreterContext.getCurrentNode()
为空。
SQLProcessorInterpreterContext
是在RootInterpreter
。currentNodes
中的第一个节点添加在SQLProcessorInterpreterContext.setInput()
中,null
通过RootInterpreter
调用{。}}。null
来自SQLProcessor.execute()
,决定配置中的所有XPath表达式(此处只是/*
)都可以进行流式传输,因此无需读取文档,没关系。ValueOfCopyOfInterpreter
使用该包装器:
string(.)
(雾化),包装列表中的每个元素。string(.)
Node
data
输入文档创建包装器确实有意义,而不是来自Dom4jUtils.createDocument()
,尽管我不确定它会产生什么影响。 XPathUtils.selectObjectValue()
传递当前节点,似乎延迟创建包装器直到那一点是有意义的。wrapper
保留为对象属性,因此我们不会不必要地重新创建包装器。由于另一个bug,下一个错误是Invalid sql-type attribute: blob
。截至2012-07-03,这是fixed。
<sql:param select="/*" type="xs:base64Binary" sql-type="blob"/>
。QueryInterpreter
中,如果类型为xs:anyURI
,那么我们对BLOB和CLOB使用相同的技术。xs:base64Binary
,如果类型是BLOB,我们会通过异常。
xs:base64Binary
时,执行相同操作似乎是合理的。