2017-07-13 11 views
0

私はスキーマに対してXMLタイプ・ファイルを検証するPL/SQLプロシージャを作成しています。 XML文書は、Oracleデータベースに、XML_TABLEのXMLType表に、単一の列であるSYS_NC_ROWINFO$に格納されます。私が使用したいスキーマは、XMLスキーマ(CLOB)と同じOracleデータベースにも含まれており、そのURLはStructuredProductsXMLSchema0v0.1.49.xsdです。Oracle PL/SQLでXMLスキーマを使用してXML文書を検証しますか?

現時点では、可能な限り単純な方法を使用して、XMLドキュメントの1つ(したがって、以下のコードで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>」)は'関数ではなく手続きである、あなたは、返信@SudiptaMondalための変数 –

+0

のおかげで、その値を保存する必要があります - どのように私は自分のコードにこれを実装することができますか? –

答えて

1

まず、link to the docs。あなたのバージョンはわかりませんが、それほど重要ではありません。

PL/SQLファンクションisSchemaValidは、入力インスタンスが指定されたXMLスキーマに準拠しているかどうかを確認します。

したがって、これはメンバ関数であり、プロシージャではありません。だからあなたのコードはという行で失敗します。

あなたはそれを必要としません。

次に、if文を関数として使用する(正しい)引数を渡さない(動作しない)if文があります。

XMLスキーマURLが指定されておらず、XML文書がスキーマベースの場合、XMLTypeインスタンスの独自のスキーマとの適合性がチェックされます。

XMLドキュメントはスキーマベースではありません。あなたのケースではありません。

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

これはおそらく動作します。ちなみに、URLが正しいかどうかはわかりません(通常は少し違って見えますが、それを理解するにはALL_XML_SCHEMASをチェックしてください)。

+0

あなたの応答をありがとう - 手順は今実行されているようです。なぜ 'schemaValidate'のような他の関数も同じようにwokではないのでしょうか? –

+1

'schemaValidate'は関数ではなくプロシージャです。何も返さないので、あなたはそれを 'xmltype_Object.schemaValidate'という代入なしで呼び出します。 –

関連する問題