ExistsNode - 出了什么问题

时间:2017-11-21 18:17:57

标签: oracle oracle11g xmltype

我在oracle中创建了一个像这样的表:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ntokozo.taxicalculator">

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.SMS_DELIVER_ACTION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity android:name=".Logo">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>


    <activity android:name=".Main2Activity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

        </intent-filter>
    </activity>
    <activity android:name=".MainActivity">
        <supports-screens android:compatibleWidthLimitDp="320" />

    </activity>

</application>

当我选择CREATE TABLE XML_TEMP ( XML_DATA CLOB ); INSERT INTO XML_TEMP(XML_DATA) VALUES(' <envCFe versao="0.07" xmlns="http://www.fazenda.sp.gov.br/sat"> <tpAmb>1</tpAmb> <idLote>4095</idLote> <cUF>35</cUF> <LoteCFe> </LoteCFe> <nSeg></nSeg> <dhEnvio>20171101101517</dhEnvio> </envCFe> '); 返回0

existsNode

我不会说错了什么,有人可以提供帮助。

链接http://sqlfiddle.com/#!4/c2b9e/5/0包含SQLFiddle

2 个答案:

答案 0 :(得分:1)

您的根节点有一个命名空间,因此您需要使用the optional third argument指定:

SELECT ExistsNode(XMLTYPE(XML_DATA), '/envCFe',
    'xmlns="http://www.fazenda.sp.gov.br/sat"') HAS, XML_DATA
FROM XML_TEMP;

       HAS XML_DATA                                                                        
---------- --------------------------------------------------------------------------------
         1                                                                                 
               <envCFe versao="0.07" xmlns="http://www.fazenda.sp.gov.br/sat">             
                   <tpAmb>1</tpAmb>                                                        
                   <idLote>4095</idLote>                                                   
                   <cUF>35</cUF>                                                           
                   <LoteCFe>                                                               
                   </LoteCFe>                                                              
                   <nSeg></nSeg>                                                           
                   <dhEnvio>20171101101517</dhEnvio>                                       
               </envCFe>                                                                   

SQL Fiddle

如果您打算使用ExistsNode来过滤结果,并且由于该功能已弃用,您可以使用the XMLExists operator替代该方案:

SELECT XML_DATA
FROM XML_TEMP
WHERE XMLExists(
  'declare namespace ns="http://www.fazenda.sp.gov.br/sat"; (: :)
  /ns:envCFe'
  PASSING XMLTYPE(XML_DATA)
);

SQL Fiddle

但是,当你的当前查询正在进行时,你无法将结果作为查询结果的一部分得到。

答案 1 :(得分:0)

您需要将名称空间添加到existsNode函数:

SELECT ExistsNode(XMLTYPE(XML_DATA), '/envCFe', 'xmlns="http://www.fazenda.sp.gov.br/sat"') HAS, XML_DATA FROM XML_TEMP;