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 年 7 月 3 日時点で修正されています。

  • では、ValueOfCopyOfInterpreternullinterpreterContext.getCurrentNode()です。
    • これSQLProcessorInterpreterContextは のコンストラクタで作成されRootInterpreterます。
    • インタプリタ コンテキストの最初のノードcurrentNodesが に追加されSQLProcessorInterpreterContext.setInput()、 によって呼び出さnullRootInterpreterます。
    • これは、config 内のすべての XPath 式 (ここでは のみ) をストリーミングできるため、ドキュメントを読み取る必要がないと判断したことにnull由来します。これは問題ありません。SQLProcessor.execute()/*
  • ValueOfCopyOfInterpreterそのラッパーを使用して:
    • リスト (原子化) で評価string(.)し、リスト内のすべての要素をラップします。
    • 評価string(.)するNode
  • どちらの場合も、ラッパーがdataからではなく、入力ドキュメントに基づいて作成されることは確かに理にかなっていますDom4jUtils.createDocument()が、影響がどうなるかは正確にはわかりません。
  • 修理
    • しかし、その時点で現在のノードが必要なので、XPathUtils.selectObjectValue()その現在のノードを渡すことを呼び出しているため、その時点までラッパーの作成を遅らせることは理にかなっているようです。
    • as object 属性は引き続き保持されるため、wrapper不必要にラッパーを再作成することはありません。

次のエラー: Invalid sql-type attribute: blob、別のバグによる。これは2012 年 7 月 3 日時点で修正されています。

  • これは によってトリガーされ<sql:param select="/*" type="xs:base64Binary" sql-type="blob"/>ます。
  • ではQueryInterpreter、タイプが の場合、xs:anyURIBLOB と CLOB の両方に同じ手法を使用します。
  • ただし、型がxs:base64Binaryの場合、型が BLOB の場合は例外が発生します。
    • ところで、これは、MySQL および Oracle 永続層によってファイルを格納するときに使用されているものです。
  • したがって、型が の場合も同じことを行うのが妥当と思われますxs:base64Binary
于 2012-07-03T19:47:06.197 に答える