0

要查看问题:

  1. 在 Oracle 中创建一个表:

    create table ut_table_ut_service_pj (
       PATH VARCHAR(80),
       BINARY BLOB
    );
    
  2. 将以下管道粘贴到 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|

为什么会这样?

4

1 回答 1

0

NPE 是一个错误。这是从 2012-07-03 开始​​修复的。

  • 在 中ValueOfCopyOfInterpreterinterpreterContext.getCurrentNode()为空。
    • SQLProcessorInterpreterContext是在构造函数中创建的RootInterpreter
    • 解释器上下文中的第一个节点currentNodes添加在 中SQLProcessorInterpreterContext.setInput()null由 by调用RootInterpreter
    • null来自于SQLProcessor.execute()决定配置中的所有 XPath 表达式(这里只是/*)都可以流式传输,因此不需要读取文档,这没关系。
  • ValueOfCopyOfInterpreter使用该包装器:
    • 评估string(.)列表(原子化),包装列表中的每个元素。
    • 评估string(.)一个Node
  • data在这两种情况下,基于输入文档而不是 from创建包装器确实有意义Dom4jUtils.createDocument(),尽管我不确定会产生什么影响。
  • 使固定
    • 但是由于此时我们必须有一个当前节点,正如我们所说的XPathUtils.selectObjectValue()传递该当前节点,似乎将包装器的创建延迟到该点是有意义的。
    • 仍然保留wrapperas object 属性,因此我们不会不必要地重新创建包装器。

下一个错误是:Invalid sql-type attribute: blob,由于另一个错误。这是从 2012-07-03 开始​​修复的。

  • 这是由 触发的<sql:param select="/*" type="xs:base64Binary" sql-type="blob"/>
  • QueryInterpreter中,如果类型是xs:anyURI,那么我们对 BLOB 和 CLOB 使用相同的技术。
  • 但是如果类型是xs:base64Binary,如果类型是 BLOB,我们会通过异常。
    • 顺便说一句,这是 MySQL 和 Oracle 持久层存储文件时使用的。
  • 因此,当类型为 时,这样做似乎是合理的xs:base64Binary
于 2012-07-03T19:47:06.197 回答