2016-12-01 11 views
0

私が達成しようとしていることは、darがフェッチされたとは思わない。XMLのデータをOracleのテーブルとして取得する

私は、テーブルに変換してクエリで使用するXML文字列をプロシージャに渡そうとしていますが、XMLをテーブルに変換する際に問題があります。

は、これまでのところ、これは私はこれが動作するはずだと思う私は

DECLARE 
    xmlVar CLOB := '<DocumentElement><XML_Result><GSID>22271</GSID><FROMCITY>LAREDO</FROMCITY><FROMSTATE>TX</FROMSTATE><FROMPOSTAL>78040</FROMPOSTAL><FROMCOUNTRY>US</FROMCOUNTRY><TOCITY>RAMOSARIZPE</TOCITY><TOSTATE>CU</TOSTATE><TOPOSTAL>25000</TOPOSTAL><TOCOUNTRY>MX</TOCOUNTRY><TOTALMILES>194.9</TOTALMILES></XML_Result></DocumentElement>'; 
BEGIN 

with routes AS (
    Select extractvalue(column_value, '/XML_Result/GSID') GSID, 
     extractvalue(column_value, '/XML_Result/FROMCITY') FROMCITY, 
     extractvalue(column_value, '/XML_Result/FROMSTATE') FROMSTATE, 
     extractvalue(column_value, '/XML_Result/FROMPOSTAL') FROMPOSTAL, 
     extractvalue(column_value, '/XML_Result/FROMCOUNTRY') FROMCOUNTRY, 
     extractvalue(column_value, '/XML_Result/TOCITY') TOCITY, 
     extractvalue(column_value, '/XML_Result/TOSTATE') TOSTATE, 
     extractvalue(column_value, '/XML_Result/TOPOSTAL') TOPOSTAL, 
     extractvalue(column_value, '/XML_Result/TOCOUNTRY') TOCOUNTRY, 
     extractvalue(column_value, '/XML_Result/TOTALMILES') TOTALMILES 
    FROM TABLE(XMLSequence(XMLTYPE(xmlVar).extract('//XML_Result'))) 
) Select * from routes ; 

END; 

を持っているもの、それ。私はまた、両方のコードは私にこのエラーが返されます

declare 
    xmlClob CLOB; 
begin 

    xmlClob := '<DocumentElement><XML_Result><GSID>22271</GSID><FROMCITY>LAREDO</FROMCITY><FROMSTATE>TX</FROMSTATE><FROMPOSTAL>78040</FROMPOSTAL><FROMCOUNTRY>US</FROMCOUNTRY><TOCITY>RAMOSARIZPE</TOCITY><TOSTATE>CU</TOSTATE><TOPOSTAL>25000</TOPOSTAL><TOCOUNTRY>MX</TOCOUNTRY><TOTALMILES>194.9</TOTALMILES></XML_Result></DocumentElement>'; 

    Select * from xmltable(
    '//XML_Result' 
    PASSING xmltype.createxml(xmlClob) 
    COLUMNS GSID VARCHAR(100) PATH 'GSID', 
     FROMCITY VARCHAR(100) PATH 'FROMCITY', 
     FROMSTATE VARCHAR(100) PATH 'FROMSTATE', 
     FROMPOSTAL VARCHAR(100) PATH 'FROMPOSTAL', 
     FROMCOUNTRY VARCHAR(100) PATH 'FROMCOUNTRY', 
     TOCITY VARCHAR(100) PATH 'TOCITY', 
     TOSTATE VARCHAR(100) PATH 'TOSTATE', 
     TOPOSTAL VARCHAR(100) PATH 'TOPOSTAL', 
     TOCOUNTRY VARCHAR(100) PATH 'TOCOUNTRY', 
     TOTALMILES VARCHAR(100) PATH 'TOTALMILES') xms; 

end; 

をテストし

PLS-00428:INTO句このSELECT文で期待されている 06550. 00000 - 「行%sの、列%sを:\ n%s " *原因:通常、PL/SQLのコンパイル・エラーです。 *アクション:

しかし、私はこれをどうやって得るのか分かりません。また、私はテーブルや一時的なものを作成することができません、クライアントは私ができることとできないことをたくさん制限します。

私の意図した結果を達成するためのアイデアはありますか?

PS:私はちょうど私が「として、私は、私の意図を達成しています。この

with routes AS (
    Select extractvalue(column_value, '/XML_Result/GSID') GSID, 
     extractvalue(column_value, '/XML_Result/FROMCITY') FROMCITY, 
     extractvalue(column_value, '/XML_Result/FROMSTATE') FROMSTATE, 
     extractvalue(column_value, '/XML_Result/FROMPOSTAL') FROMPOSTAL, 
     extractvalue(column_value, '/XML_Result/FROMCOUNTRY') FROMCOUNTRY, 
     extractvalue(column_value, '/XML_Result/TOCITY') TOCITY, 
     extractvalue(column_value, '/XML_Result/TOSTATE') TOSTATE, 
     extractvalue(column_value, '/XML_Result/TOPOSTAL') TOPOSTAL, 
     extractvalue(column_value, '/XML_Result/TOCOUNTRY') TOCOUNTRY, 
     extractvalue(column_value, '/XML_Result/TOTALMILES') TOTALMILES 
    FROM TABLE(XMLSequence(XMLTYPE('<DocumentElement><XML_Result><GSID>22271</GSID><FROMCITY>LAREDO</FROMCITY><FROMSTATE>TX</FROMSTATE><FROMPOSTAL>78040</FROMPOSTAL><FROMCOUNTRY>US</FROMCOUNTRY><TOCITY>RAMOSARIZPE</TOCITY><TOSTATE>CU</TOSTATE><TOPOSTAL>25000</TOPOSTAL><TOCOUNTRY>MX</TOCOUNTRY><TOTALMILES>194.9</TOTALMILES></XML_Result><XML_Result><GSID>24102</GSID><FROMCITY>DELRIO</FROMCITY><FROMSTATE>TX</FROMSTATE><FROMPOSTAL>78840</FROMPOSTAL><FROMCOUNTRY>US</FROMCOUNTRY><TOCITY>REYNOSA</TOCITY><TOSTATE>TM</TOSTATE><TOPOSTAL>88787</TOPOSTAL><TOCOUNTRY>MX</TOCOUNTRY><TOTALMILES>325.4</TOTALMILES></XML_Result><XML_Result><GSID>23131</GSID><FROMCITY>BROWNSVL</FROMCITY><FROMSTATE>TX</FROMSTATE><FROMPOSTAL>78521</FROMPOSTAL><FROMCOUNTRY>US</FROMCOUNTRY><TOCITY>EAGLEPS</TOCITY><TOSTATE>TX</TOSTATE><TOPOSTAL>78852</TOPOSTAL><TOCOUNTRY>US</TOCOUNTRY><TOTALMILES>326.3</TOTALMILES></XML_Result><XML_Result><GSID>21011</GSID><FROMCITY>EAGLEPS</FROMCITY><FROMSTATE>TX</FROMSTATE><FROMPOSTAL>78852</FROMPOSTAL><FROMCOUNTRY>US</FROMCOUNTRY><TOCITY>BROWNSVL</TOCITY><TOSTATE>TX</TOSTATE><TOPOSTAL>78521</TOPOSTAL><TOCOUNTRY>US</TOCOUNTRY><TOTALMILES>326.2</TOTALMILES></XML_Result></DocumentElement>').extract('//XML_Result'))) 
) Select * from routes; 

をテストし

:XMLは、私が

EDITで働いているかの小さな作品です私はテーブルの別のカップルでサブクエリで照会することができますが、問題は、XMLはこれほど短くはありません。私の現在のxml文字列は4000文字以上ですので、完全に使用できるように変数に格納する必要があります。

XMLのチャンクを一度に5つのレジスタに送信し、XMLの各チャンクでクエリを実行し、その結果をC#のDataTableに追加することを考えています。一度XML全体を返すと

答えて

0

エラーはXMLとは関係ありません:PLSQLブロック内からはselect ... from ...はできませんが、結果をある変数に取り込む必要があります。例えば

SQL> select 1 from dual; 

     1 
---------- 
     1 

SQL> begin 
    2  select 1 from dual; 
    3 end; 
    4/
    select 1 from dual; 
    * 
ERROR at line 2: 
ORA-06550: line 2, column 5: 
PLS-00428: an INTO clause is expected in this SELECT statement 


SQL> declare 
    2  vN number; 
    3 begin 
    4  select 1 into vN from dual; 
    5  dbms_output.put_line(vN); 
    6 end; 
    7/
1 

PL/SQL procedure successfully completed. 

SQL> 
+0

まあ、私は変数に格納することはできません、私は表形式でそれを必要とする、と私は原因クライアントの制約のためにテーブルを作成することはできません – CJLopez

+0

だから、あなたが何をすべき結果?それをファイルにスプールしたり、出力パラメータを返したりする必要がありますか? – Aleksej

+0

別のサブクエリで使用するには、このXMLからテーブルを取得する必要があります。私は自分の意向をより深く理解するために質問を更新しました – CJLopez

関連する問題