2009-06-15 3 views
3

データ移行クエリを作成して、実績データベースのテーブルに追加する新しい列の値を既存のレコードに設定することは、おそらく不可能です。テーブルは200,000行のオーダーのどこかにあります。クエリで多くの行が返されたときにOracleのextractValueが失敗する

値のソースは、データベースに格納されているXMLの一部です。私は、私が望む値を引き出すいくつかのXPathを持っています。そして、値を取得するためにextractValueを使用することは、クエリによって更新されるレコードの数が私のテストDBにある数よりも大きくなるまで、すべて良いようです。

レコードセットがランダムなサイズ(約500行程度)になったら、「ORA-19025:EXTRACTVALUEは1ノードのみの値を返します」というエラーが発生します。 XPathで一意の結果がなかったデータベースに何らかの奇妙な行があることがわかったので、クエリのレコードを制限して、不良レコードを分離しようとしました。しかし、私がレコードセットを縮小するとすぐに、エラーは消えました。実際には、このXPathクエリに複数の値を返す行はありません。それは、extractValueで何か起きているようなものです。

誰もがこれについて何か知っていますか?私はSQLの専門家ではなく、OracleよりもSQL Serverに多くの時間を費やしています。だから私はこれを動作させることができない場合、私はカーソルや何かを混乱させるために残っていると思う。

アドバイス/ヘルプ?役立つなら、サーバー上で10gを実行しています。ありがとう!

+0

可能であれば、いくつかのコード(サンプル行、xpath、...)を追加すると、問題のデバッグに役立ちます – jitter

+1

このエラーは、extractvalueが単一の値で動作しない場合にのみ発生します。あなたはextractvalueの代わりにextractvalueを使用することができます。出力をデバッグします。 – jitter

+0

あなたのXMLに悪いデータがあると思いませんか?(i-e:少なくとも2つの値が抽出されます) –

答えて

4

ソースXMLを含むテーブルの少なくとも1つの行に無効な値が含まれていることはほとんど確実です。クエリを試して書き直してください。

たとえば、2番目の位置にノードを与えるXMLPath述語を使用します(私は現在、XMLオブジェクトを持つデータベースにアクセスできないため、構文上完全であるとは保証できません):

SELECT SourceKey 
     , EXTRACTVALUE(SourceXML, '/foo/bar/baz[1]') 
     , EXTRACTVALUE(SourceXML, '/foo/bar/baz[2]') 
    FROM SourceTable 
    WHERE EXTRACTVALUE(SourceXML, '/foo/bar/baz[2]') IS NOT NULL; 
+0

ありがとう、それは便利なクエリです。なぜ私はそれについて最初に考えなかったのか分からない。 しかし、XPathの結果が複数あることを示唆した皆さんには、エラーの意味が理解できますが、これが元の投稿で取り組もうとしていたものです。 私はSteveの提案を考えなかったので、問題の行を見つけるためにタイムスタンプを作成してレコードのリストを絞り込んでいました。タイムスタンプをフィルタリングする際に矛盾があったため、問題を引き起こす特定の行がないことが明らかになりました。 –

+0

フォローアップ - 私はそれを再使用してカーソルを使用し、正常に実行されました。 Steveのクエリを実行して結果が得られるかどうかを確認します。このデータを実行するのに時間がかかります。 –

関連する問題