2017-07-10 12 views
0

データベースからXMLを取得するクエリを作成しましたが、XMLデータがクエリから正しく取得されています。 しかし、関数/プロシージャからXMLデータを取得するためにそのクエリをプロシージャ/関数に入れようとすると、結果にはXMLデータを含むいくつかの迷惑データが含まれます。 これは、XSLTがガベージデータで使用できないため、XMLを役に立たなくします。私は間違ってFunction/ProcedureからXML出力が正しく出力されない

SELECT XMLELEMENT(
     "department", 
     XMLFOREST(
      e.dept_id AS "dept_id", 
      d.dept_name AS "dept_name" 
     ), 
     XMLAGG(
      XMLELEMENT(
      "employee", 
      XMLFOREST(
       emp_id AS "emp_id", 
       emp_name AS "emp_name" 
      ) 
      ) 
     ) 
     ) 
FROM employees e 
     INNER JOIN departments d 
     on (e.dept_id = d.dept_id) 
WHERE e.dept_id = 1 
GROUP BY e.dept_id, d.dept_name; 

このクエリ与えたいXMLデータ

<department> 
<dept_id>1</dept_id> 
<dept_name>History</dept_name> 
</department> 
<employee> 
<emp_id>1</emp_id> 
<emp_name>Helen</emp_name> 
</employee> 
<employee> 
<emp_id>2</emp_id> 
<emp_name>Martha</emp_name> 
</employee> 
<employee> 
<emp_id>3</emp_id> 
<emp_name>John</emp_name> 
</employee> 

しかし、我々は手順でこのクエリを置くとき/それは間違ったデータをとして出て見せて機能をやっているところ

あなたがチェックしてくださいすることができ

create or replace function test_cursor  return sys_refcursor 
      is 
        c_result sys_refcursor; 
        po varchar2(20); 
      begin 

      select headerid into po from staging_orderheader where rownum=1; 

        open c_result for 
SELECT XMLELEMENT(
     "department", 
     XMLFOREST(
      e.dept_id AS "dept_id", 
      d.dept_name AS "dept_name" 
     ), 
     XMLAGG(
      XMLELEMENT(
      "employee", 
      XMLFOREST(
       emp_id AS "emp_id", 
       emp_name AS "emp_name" 
      ) 
      ) 
     ) 
     ) 
FROM employees e 
     INNER JOIN departments d 
     on (e.dept_id = d.dept_id) 
WHERE e.dept_id = 1 
GROUP BY e.dept_id, d.dept_name; 

        return c_result; 
      end; 

この手順の結果は、クエリのXMLデータですが、いくつかのg開始時には値を返します。 助けてください

+0

機能がREF_CURSORを返し、あなただけの結果を解析することはできませんカーソルをvarchar2またはclobに戻し、関数からそれを戻しますか? ref_cursorを返す関数から有効なXMLを取得するのはなぜでしょうか? – g00dy

+0

質問を、作成中の(不正な形式の)出力と、プロシージャの呼び出しに使用しているコードの例で編集してください。 – MT0

答えて

0

XMLELEMENTは、XMLの構造を格納しますが、文字列ではないXMLTYPEオブジェクトを作成します。

SQLスコープでクエリを実行すると、使用しているIDEによって暗黙的にXMLTYPEオブジェクトが文字列に変換されることがわかります。ただし、カーソルを戻すと、その変換は行われません。あなたはおそらく行う必要がありますが、明示的にそのgetStringVal()またはgetClobVal()メンバ関数のいずれかを使用してXMLTYPEオブジェクトの文字列形式を返している

create or replace function test_cursor 
return sys_refcursor 
is 
    c_result sys_refcursor; 
    po  staging_orderheader.headerid%type; 
begin 
    select headerid 
    into po 
    from staging_orderheader 
    where rownum=1; 

    open c_result for 
    SELECT XMLELEMENT(
      "department", 
      XMLFOREST(
      e.dept_id AS "dept_id", 
      d.dept_name AS "dept_name" 
      ), 
      XMLAGG(
      XMLELEMENT(
       "employee", 
       XMLFOREST(
       emp_id AS "emp_id", 
       emp_name AS "emp_name" 
       ) 
      ) 
      ) 
     ).getClobVal()     -- Add it here 
    FROM employees e 
     INNER JOIN departments d 
     on (e.dept_id = d.dept_id) 
    WHERE e.dept_id = 1 
    GROUP BY e.dept_id, d.dept_name; 

    return c_result; 
end; 
+0

申し訳ありませんが、以前と同じ結果が得られます。 – user1654571

関連する問題