2017-12-14 15 views
1

PLSQLで1つのXMLファイルを解析中に問題が発生しました。私はいくつかの他のXMLファイルでコードに問題はないが、特にこのコードで問題はないと言いたい。 このXMLファイルで問題を引き起こす原因を調べるために、いくつかのリードを待っています。ここでPLSQLでxmlファイルを解析しています

はPLSQLのコードです:

DBMS_XMLPARSER.parseBuffer(myParser,ficContent); 

Oracleエラー:

ORA-06502 : PL/SQL : numeric or value error 

何私についての任意のアイデア

filename := 'name_of_my_file.xml'; 
myParser := DBMS_XMLPARSER.newParser; 
ficContent := DBMS_XSLPROCESSOR.Read2Clob(directoryWhereToFindTheFile, filename , '0'); 

そしてここでは、問題が発生したラインであります見るべき?

注:私は別のものを追加する必要があります。

この特定のXMLファイルは、2行のみで書かれています(Read2Clobに問題があり、行が長すぎます)。ですから、私はIDEでフォーマットして、良いXMLファイルを作成しました。私はこれを使います。この問題は発生しませんが、このエラーは発生しません。あなたのXMLファイル内

+0

"作業中の" XMLのサンプルは大きな助けになるでしょう。 – g00dy

+0

内容は同じですが、 "動作していない"ものは2行、 "働く"は1行に1つのノードがあります(フォーマット済み) – mlwacosmos

+0

'PARSEBLFF'の代わりに' PARSECLOB'を使うべきだと思います。これはあなたの問題かもしれません。現在のケースでは、VARCHAR2を解析しています。これは、「作業中の」XMLの場合、VARCHAR2(4kまたは32k、サイズに応じて)のサイズ制限を下回る可能性があります。それ以外の場合は、とにかくVARCHAR2に暗黙的にキャストされるCLOBを渡します。 – g00dy

答えて

0

コード - XML後に次のコード行を記述します。

あなたのコードは次のようになります。

filename := 'name_of_my_file.xml'; 
myParser := DBMS_XMLPARSER.newParser; 
ficContent := DBMS_XSLPROCESSOR.Read2Clob(directoryWhereToFindTheFile, filename , '0'); 
DBMS_XMLPARSER.parseBuffer(myParser,ficContent); 

仕様についてはDBMS_XSLPROCESSOR.Read2Clob [LINK]

一方 DBMS_XMLPARSER.parseBuffer

構文

DBMS_XSLPROCESSOR.READ2CLOB(
    flocation  IN VARCHAR2, 
    fname   IN VARCHAR2, 
    csid   IN NUMBER:=0) 
    RETURN CLOB; 

限り、それが収まるように、(それは暗黙的にVARCHAR2にキャストされます)OKである、2番目の引数としてVARCHAR2を受け入れ、あなたはそこCLOBを渡していますVARCHAR2(DBのバージョンと構成に応じて、4k32kの範囲になる可能性があります)のサイズです。

現在、のサイズは4 GB - 1(4ギガバイト - 1)です。これは、最大値のVARCHAR2よりかなり大きいサイズです。

したがって、これは明らかにこの問題を解決します。

いつ使用するかparseBufferまたはparseClob - あなたはポイントがあると思います。私は、parseClob4kバイトの部分ごとにparseBufferを呼び出すと、それはがそれを受け取りますが、それはちょうど推測です(私は彼らが同じものに対して別のコードを使用しているとは想像できませんが、ねえ、それは遺産で起こります:-))。

乾杯

1

質問以下のコメントに続いて

<...XML code...> 
BEGIN 
FOR r IN (
    SELECT ExtractValue(Value(p),'/row/name/text()') as clo1 
     ,ExtractValue(Value(p),'/row/Address/State/text()') as col2 
     ,ExtractValue(Value(p),'/row/Address/City/text()') as col3 
FROM TABLE(XMLSequence(Extract(x,'/person/row'))) p 
) LOOP 
-- do whatever you want 
END LOOP; 
END; 
関連する問題