2012-01-15 10 views
0

次のようにします。データベースからすべてのデータを読み込むためのストアドプロシージャを作成します。しかし、これはOracleでは機能しません。 私はこのようなことをしたいので少し違ってやる必要があるかもしれません: 私はデータのXML表現を返すプロシージャを持っています: ここで私はXML文書を作成するために使用しているコードです私はこのコードを使用してストアドプロシージャからデータを送信できるので、それを変更する方法です。Oracleストアドプロシージャを読み込んでXMLとして表現する

コード:XMLを作るための

require_once('test_xml.php'); 
$library = array(
    'book' => array(
     array(
      'authorFirst' => 'Mark', 
      'authorLast' => 'Twain', 
      'title' => 'The Innocents Abroad' 
     ), 
     array(
      'authorFirst' => 'Charles', 
      'authorLast' => 'Dickens', 
      'title' => 'Oliver Twist' 
     ) 
    ) 
); 
$ArrayToXml=new ArrayToXml(); 
echo $ArrayToXml->toXml($library); 

とクラス:

class ArrayToXML 
{ 
    /** 
    * The main function for converting to an XML document. 
    * Pass in a multi dimensional array and this recrusively loops through and builds up an XML document. 
    * 
    * @param array $data 
    * @param string $rootNodeName - what you want the root node to be - defaultsto data. 
    * @param SimpleXMLElement $xml - should only be used recursively 
    * @return string XML 
    */ 
    public static function toXml($data, $rootNodeName = 'data', &$xml=null) 
    { 
     // turn off compatibility mode as simple xml throws a wobbly if you don't. 
     if (ini_get('zend.ze1_compatibility_mode') == 1) 
     { 
      ini_set ('zend.ze1_compatibility_mode', 0); 
     } 

     if (is_null($xml)) 
     { 
      $xml = simplexml_load_string("<".key($data)."s/>"); 
     } 

     // loop through the data passed in. 
     foreach($data as $key => $value) 
     { 
      // if numeric key, assume array of rootNodeName elements 
      if (is_numeric($key)) 
      { 
       $key = $rootNodeName; 
      } 

      // delete any char not allowed in XML element names 
      $key = preg_replace('/[^a-z0-9\-\_\.\:]/i', '', $key); 

      // if there is another array found recrusively call this function 
      if (is_array($value)) 
      { 
       // create a new node unless this is an array of elements 
       $node = ArrayToXML::isAssoc($value) ? $xml->addChild($key) : $xml; 

       // recrusive call - pass $key as the new rootNodeName 
       ArrayToXML::toXml($value, $key, $node); 
      } 
      else 
      { 
       // add single node. 
       $value = htmlentities($value); 
       $xml->addChild($key,$value); 
      } 

     } 
     // pass back as string. or simple xml object if you want! 
     return $xml->asXML(); 
    } 

    // determine if a variable is an associative array 
    public static function isAssoc($array) { 
     return (is_array($array) && 0 !== count(array_diff_key($array, array_keys(array_keys($array))))); 
    } 
} 

私は、ストアドプロシージャのSELECT *声明にこれを実装する方法が分からない助けてください。

ありがとうございました

+1

DBMS_XMLGENを調べると、クエリをXMLに変換できます。次に例を示します。 'select dbms_xmlgen.getxml( 'select * from dual')from dual;'。 –

+0

お返事ありがとうございます。結果としてXMLを返信したいだけです。他のすべては正常のままです。したがって、データベースからの通常の読み込みは、例えばXMLへのデータ配列を表し、それを表すクラスを持っています。ちょうど私が変換できるデータの配列を返すストアドプロシージャからどのようにわからない。 – Denonth

+0

私はあなたの質問に直接答えなかったと思います。私の提案は、SQLを使用してデータをXMLに変換し、それをCLOBとして渡すことでした。私は全体を "ビジネスロジックをどこに保存するのか"を始めたいとは思っていません。とにかくストアドプロシージャを使用しようとするならば、あなたのロジックの大部分をその中に入れてもよいでしょう。 –

答えて

0

すべてのデータはデータベース全体から読み取ることができます。各テーブルに対して別々の「選択」ステートメントを作成する必要があります。

+0

さて、今はテストとして1つのテーブルだけ試してみたいです。 – Denonth

関連する問題