2012-01-15 3 views
0

Je veux faire ce qui suit: Faire la procédure stockée Oracle pour lire toutes les données de la base de données que j'essayais avec la base SELECT * FROM; Mais cela ne fonctionne pas avec Oracle. Mais peut-être que je dois le faire un peu plus différent parce que je veux faire quelque chose comme ceci: Je veux avoir Procédure qui me retournera la représentation XML des données: Voici le code que j'utilise pour faire un document XML, ET mon questions est de savoir comment le changer afin que je puisse utiliser ce code pour envoyer des données à partir de la procédure stockée.Lire la procédure stockée Oracle et le représenter comme XML

code:

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); 

et classe pour la réalisation XML:

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))))); 
    } 
} 

S'il vous plaît aider Je ne sais pas comment mettre en œuvre cette instruction SELECT * dans la procédure stockée.

Merci

+1

Vous pouvez regarder dans DBMS_XMLGEN, qui peut convertir n'importe quelle requête en XML. Par exemple: 'select dbms_xmlgen.getxml ('select * from dual') à partir du dual; –

+0

Salut merci pour la réponse. Je veux juste renvoyer XML comme résultat. Tout le reste reste normal. Donc, la lecture normale de la base de données, puis représenter par exemple un tableau de données en XML, et j'ai classe pour représenter cela. Je ne sais pas comment à partir de la procédure stockée renvoyer tableau de données que je peux convertir. – Denonth

+0

Je suppose que je n'ai pas répondu directement à votre question; Ma suggestion était d'utiliser SQL pour convertir les données en XML, qui pourrait ensuite être passé en tant que CLOB. Je ne veux pas commencer un tout "où puis-je stocker la logique métier?" discussion, mais si vous utilisez une procédure stockée de toute façon, vous pourriez aussi bien y mettre la plus grande partie de votre logique. –

Répondre

0

Vous pouvez lire toutes les données de la base de données. Vous devez créer des instructions "select" distinctes pour chaque table.

+0

Bon, maintenant je veux l'essayer pour une seule table comme test. – Denonth

Questions connexes