2017-07-13 157 views
0

我正在編寫一個PL/SQL過程,它將根據模式驗證XML類型文件。 XML文檔存儲在Oracle數據庫中的一個XMLType表XML_TABLE中,其中有一列SYS_NC_ROWINFO$。我希望使用的模式也包含在相同的Oracle數據庫中,如XML模式(CLOB),其URL爲StructuredProductsXMLSchema0v0.1.49.xsd使用Oracle PL/SQL中的XML Schema驗證XML文檔?

目前,我只是試圖使用最簡單的方法驗證XML文檔中的一個(因此在下面的代碼中爲rownum = 1)。下面是我創建的過程:

create or replace procedure XML_FILE_VALIDATOR is 

XDATA XMLType; 

begin 

    select SYS_NC_ROWINFO$ into XDATA 
    from XML_TABLE 
    where rownum = 1; 

    XDATA.isSchemaValid('StructuredProductsXMLSchema0v0.1.49.xsd'); 
    if XDATA.isSchemaValid = 1 then 
    dbms_output.put_line ('XML document is VALID'); 

    else 
    dbms_output.put_line ('XML document is INVALID => '||sqlerrm); 

    end if; 
end; 

不幸的是,我收到一條錯誤消息:

PLS-00221: 'ISSCHEMAVALID' 不是一個過程或未定義

任何幫助解決這個問題將不勝感激。

+0

'XDATA.isSchemaValid('<*.xsd>')'是一個函數,而不是一個過程,您將需要將其值保存在一個變量 –

+0

感謝您的回覆@SudiptaMondal - 我如何實現這個到我的代碼? –

回答

1

首先,一個link to the docs。我不知道你的版本,但它應該沒那麼重要。

PL/SQL函數isSchemaValid檢查輸入實例是否符合指定的XML模式。

所以這是一個成員函數,而不是一個過程。這就是爲什麼你的代碼在XDATA.isSchemaValid('StructuredProductsXMLSchema0v0.1.49.xsd');行失敗。

你不需要它。

然後你有一個if語句,你試圖把它作爲一個函數(正確)使用,但不傳遞參數(這不會起作用)。

如果沒有指定XML模式URL並且XML文檔是基於模式的,那麼將根據XMLType實例自己的模式檢查一致性。

這不是你的情況,因爲你的XML文檔不是基於模式的。

if XDATA.isSchemaValid('StructuredProductsXMLSchema0v0.1.49.xsd') then 
.... 
end if 

這可能會奏效。作爲一個方面說明,我不確定網址是否正確(雖然他們通常看起來有點不同,但你可以找出它,只需登錄ALL_XML_SCHEMAS)。

+0

感謝您的回覆 - 現在程序似乎正在運行。爲什麼像'schemaValidate'這樣的其他函數不會以相同的方式啓動? –

+1

'schemaValidate'不是一個函數,而是一個過程。它不會返回任何東西,所以你可以不指定它:'xmltype_Object.schemaValidate'。 –