0

データベース列 (file_output) にロードされた XML 出力からユーザー名の値を抽出しようとしています。クエリが null 値を返し、期待どおりに実行されません。あなたの助けに感謝します。

XML 出力:

    <soap:Envelope xmlns:ones="http://onesource.gmtorque.com" xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <soap:Header>
        <wsse:Security>
          <wsse:UsernameToken>
            <wsse:Username>username_prod</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>
          </wsse:UsernameToken>
        </wsse:Security>
      </soap:Header>
</soap:Envelope>

クエリ:

SELECT DISTINCT 
RR.file_output
ExtractValue (file_output, '/soap:Envelope/soap:Header/wsse:Security/wsse:UsernameToken/wsse:Username') AS"Username"
FROM schema.Records
WHERE create_DTM >'2015-10-25';

期待される値は username_prod です

4

3 に答える 3

0

私も同じ問題に遭遇しました。

ただし、「必要な xml の部分を抽出する」の使用に納得できない場合は、MYSQL Server バージョン 5.6 以降に移行できます。この問題/バグは、バージョン 5.6 以降で修正されています。

それはあなたの問題を解決するはずです。

于 2016-04-27T08:52:44.157 に答える
0

あなたが直面している問題は、MySQL のバグです。解析しようとしている XML が長すぎる可能性があります。このバグに関連していると確信しています: https://bugs.mysql.com/bug.php?id=62429。このバグを回避するには、ナビゲートしようとしている XML の部分を抽出するか、別の方法を使用して探している値を抽出します。とにかく、私が選んだ解決策は、XPath をナビゲートしようとしていた XML を抽出し、提供された XPath クエリを使用して結果を抽出することでした。

SELECT DISTINCT RR.consumer_ID
    , RR.file_output
    , RR.response_message
    , RR.external_ID
    , RR.create_DTM
    , E.client_license_ID
    , ExtractValue(CONCAT(LEFT(RR.file_output, (INSTR(LEFT(RR.file_output,1000), "</soap:Header>") + 14)),"</soap:Envelope>"), '//wsse:Security/wsse:UsernameToken/wsse:Username') AS Username
FROM kettle_data_transfer.Records RR
    JOIN kettle_data_transfer.Event_Mappings EM ON RR.event_mapping_ID = EM.event_mapping_ID AND RR.data_transfer_ID = EM.data_transfer_ID
    JOIN efn.Events E on EM.event_ID = E.event_ID
WHERE 0=0
    AND RR.data_transfer_ID = 43
    AND RR.failure_code = 0
    AND RR.mode = 'production'
    AND RR.`ignore` = 0
    AND RR.create_DTM > '2015-10-25';

とにかく、それはあなたの問題を解決するはずです。

于 2015-11-02T15:07:18.697 に答える