2012-01-15 51 views
0

我想要做以下操作:使Oracle存储过程读取数据库中的所有数据我正在使用SELECT * FROM base;但这不适用于Oracle。 但也许我需要做得更多不同,因为我想要做这样的事情: 我想要有程序,将返回我XML数据的表示形式: 这里是我用于制作XML文档的代码,和我的问题是如何改变它,以便我可以使用此代码从存储过程发送数据。读取Oracle存储过程并将其表示为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); 

和类制作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))))); 
    } 
} 

请帮助我不知道如何落实到SELECT *存储过程的陈述这一点。

谢谢

+1

您可能想要查看DBMS_XMLGEN,它可以将任何查询转换为XML。例如:'从双选择'dbms_xmlgen.getxml('select * from dual');'。 – 2012-01-16 02:18:06

+0

嗨,感谢您的回复。我想只发送XML作为结果。一切都保持正常。因此,从数据库中正常读取,然后将数据数组表示为XML,并且我有类来表示它。只是不知道如何从存储过程发回我可以转换的数据数组。 – Denonth 2012-01-16 10:22:50

+0

我想我没有直接回答你的问题;我的建议是使用SQL将数据转换为XML,然后将其作为CLOB传递。我不想开始一整个“我在哪里存储业务逻辑?”讨论,但是如果你打算使用存储过程,你可能会把大部分的逻辑放在里面。 – 2012-01-17 03:33:32

回答

0

您可以读取整个数据库中的所有数据。您必须为每个表创建单独的“选择”语句。

+0

好吧,现在我想试试它只有一个表作为测试。 – Denonth 2012-01-15 23:35:06