2012-01-15 3 views
0

다음과 같이하고 싶습니다. 데이터베이스에서 모든 데이터를 읽도록 저장 프로 시저를 만듭니다. SELECT * FROM base; 그러나 이것은 오라클과 함께 작동하지 않습니다. 하지만 어쩌면이 작업을 좀 더 다르게해야 할 필요가 있습니다. XML의 데이터 표현을 반환하는 프로 시저가 있습니다. XML 문서를 만드는 데 사용하는 코드는 다음과 같습니다. 질문은 저장 프로 시저에서 데이터를 보내기 위해이 코드를 사용할 수 있도록 변경하는 방법입니다.오라클 저장 프로 시저를 읽고 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

모든 쿼리를 XML로 변환 할 수있는 DBMS_XMLGEN을 살펴볼 수 있습니다. 예를 들면 다음과 같습니다 :'select dbms_xmlgen.getxml ('select * from dual') from dual; –

+0

안녕하세요. 답장을 보내 주셔서 감사합니다. 결과로 XML을 다시 보내고 싶습니다. 다른 모든 것은 정상적으로 유지됩니다. 그래서 정상적인 데이터베이스에서 읽은 다음 예를 들어 XML로 데이터 배열을 대표하고, 그것을 대표하는 클래스가 있습니다. 저장 프로 시저에서 변환 할 수있는 데이터 배열을 다시 보내는 방법을 모르겠습니다. – Denonth

+0

나는 당신의 질문에 직접적으로 대답하지 않았다고 생각한다; 내 제안은 SQL을 사용하여 데이터를 XML로 변환 한 다음 CLOB로 전달할 수 있다는 것입니다. 나는 "비즈니스 논리를 어디에 저장해야합니까?" 토론,하지만 만약 당신이 어쨌든 저장 프로 시저를 사용하려고한다면 당신은 또한 당신의 논리의 대부분을 넣을 수 있습니다. –

답변

0

전체 데이터베이스에서 모든 데이터를 읽을 수 있습니다. 각 테이블에 대해 별도의 "선택"문을 작성해야합니다.

+0

좋아요, 지금은 테스트로 하나의 테이블 만 사용해 보려고합니다. – Denonth

관련 문제