简体   繁体   English

如何使用php以xml格式从Oracle获取数据

[英]How to fetch data from oracle in xml format using php

I would be very happy if anyone help me :) 如果有人帮助我,我将非常高兴:)

I am trying to write php web service that read a query from Oracle DB and display the result as XML. 我正在尝试编写从Oracle DB读取查询并将结果显示为XML的php Web服务。 I spent days in searching for solution but unfortunately it didn't work 我花了几天时间寻找解决方案,但不幸的是它没有用

Below is some queries I tried it: 以下是我尝试过的一些查询:

    <?php
  $db ="(DESCRIPTION=
         (ADDRESS_LIST=
           (ADDRESS=(PROTOCOL=TCP)(HOST=xxxx)(PORT=1530))
          )
         (CONNECT_DATA=(SID=DEV))
       )";
$c = oci_connect("uname", "pass", $db);

$q = "select dbms_xmlgen.getxml(
       'select user_name
        from fnd_user
        where user_name = 007144') xml
      from dual";

$s = oci_parse($c, $q);
oci_execute($s);
$r = oci_fetch_array($s, OCI_ASSOC);
$mylob = $r['XML']->load();   // Treat column data as a LOB descriptor

echo "<pre>";
echo htmlentities($mylob);
echo "</pre>";
?>

The second code: 第二个代码:

<?php
//File: DOM.php
$db="(DESCRIPTION=
     (ADDRESS_LIST=
       (ADDRESS=(PROTOCOL=TCP)
         (HOST=xxx)(PORT=1530)
       ) )
       (CONNECT_DATA=(SID=DEV))
 )";
 $conn = OCILogon("uname","pass",$db);
 if ($conn) {
   //echo "Successfully connected to Oracle.";  
 } else {
   $err = oci_error();
   echo "Oracle Connect Error " . $err['text'];
 }
$query = "SELECT user_name from fnd_user where user_name = '007144'";
$stmt = oci_parse($conn,$query);

if (!oci_execute($stmt, OCI_DEFAULT)) {
$err = oci_error($stmt);
trigger_error('Query failed: ' . $err['message'], E_USER_ERROR);
}
$dom = new DOMDocument('1.0', 'UTF-8');
$root = $dom->createElement('EMPLOYEES', 'Root');
$dom->appendChild($root);//$root = $dom->appendChild($root);
while ($row = oci_fetch_array($stmt, OCI_RETURN_NULLS)) 
{
$emp = $dom->createElement('EMPLOYEE', 'emp');
$emp = $root->appendChild($emp);
$emp->setAttribute('id', $row['user_name']);

/*
$emp = $dom->createElement('EMPLOYEE', '');
                $emp = $root->appendChild($emp);
                $emp->setAttribute('id', $row['user_name']);
                $ename = $dom->createElement('ENAME', $row['user_name']);
                $ename = $emp->appendChild($ename);
                $salary = $dom->createElement('SALARY', $row['user_name']);
                $salary = $emp->appendChild($salary);
*/
}
        echo $dom->saveXML();
        //$dom->save("employees.xml");
oci_close($conn); 
?>

The above code give me XML without data as the below picture! 上面的代码为我提供了没有数据的XML,如下图所示! http://i48.tinypic.com/2lnv5eo.jpg http://i48.tinypic.com/2lnv5eo.jpg

Third Code 第三码

<?php
  //File: XMLFromSQL.php
  $user = 'uname';
  $pswd = 'pass';
  $db ='(DESCRIPTION=
         (ADDRESS_LIST=
           (ADDRESS=(PROTOCOL=TCP)(HOST=xxx)(PORT=1530))
          )
         (CONNECT_DATA=(SID=DEV))
       )';

 $sql = "SELECT user_name as RESULT FROM  fnd_user 
          WHERE user_name=:deptno";
  $deptno = 007144;
 //Connect to the database and obtain info on a given department in XML format
  $conn = oci_connect($user, $pswd, $db);

 $query = oci_parse($conn, $sql);
  oci_bind_by_name($query, ":deptno", $deptno, 2);
  oci_execute($query);
  oci_fetch($query);
  $strXMLData = oci_result($query, 'RESULT');

  //Create a new DOM document and load XML into its internal XML tree
  $doc = new DOMDocument("1.0", "UTF-8");
  $doc->loadXML($strXMLData);

  //For simplicity, just print out the XML document
  print $doc->saveXML();
?>

If you have another way please help me or I will be crazy :( 如果您还有其他方法,请帮助我,否则我会发疯的:(

i tested your file : 我测试了您的文件:

with $row['user_name'] $row['user_name']

C:\Apps\PHP>php c:\temp\test.php
PHP Notice:  Undefined index: user_name in C:\temp\test.php on line 25

Notice: Undefined index: user_name in C:\temp\test.php on line 25
<?xml version="1.0" encoding="UTF-8"?>
<EMPLOYEES>Root<EMPLOYEE id="">emp</EMPLOYEE></EMPLOYEES>

with $row['USER_NAME'] $row['USER_NAME']

C:\Apps\PHP>php c:\temp\test.php
<?xml version="1.0" encoding="UTF-8"?>
<EMPLOYEES>Root<EMPLOYEE id="007144">emp</EMPLOYEE></EMPLOYEES>

does that solve your problem? 这样可以解决您的问题吗?

edit: for solution 1 (PLSQL side) 编辑:对于解决方案1(PLSQL端)

$s = oci_parse($c, $q);
oci_execute($s, OCI_DEFAULT);
$r = oci_fetch_array($s, OCI_RETURN_NULLS+OCI_RETURN_LOBS);
echo "<pre>";
echo htmlentities($r["XML"]);
echo "</pre>";

or to give more control over the names of elements 或对元素名称进行更多控制

$q = "select xmlelement(
         \"EMPLOYEES\",
         xmlagg(
           xmlelement(
             \"EMPLOYEE\", 
             xmlforest(user_name as \"EmpName\",
                       id as \"EmpID\",
                       email as \"email\"
                      )
           )
         )
       ).getclobval() xml
  from fnd_user";

$s = oci_parse($c, $q);
oci_execute($s, OCI_DEFAULT);
$r = oci_fetch_array($s, OCI_RETURN_NULLS+OCI_RETURN_LOBS);
echo "<pre>";
echo htmlentities($r["XML"]);
echo "</pre>";

example output with xmlforest version is: xmlforest版本的示例输出是:

C:\Apps\PHP>php c:\temp\test3.php
<pre>&lt;EMPLOYEES&gt;&lt;EMPLOYEE&gt;&lt;EmpName&gt;John Doe&lt;/EmpName&gt;&lt;EmpID&gt;1&lt;/EmpID&gt;&lt;email&gt;d@d.com&lt;/email&gt;&lt;/EMPLOYEE&gt;&lt;EMPLOYEE&gt;&lt;
EmpName&gt;Alan Smith&lt;/EmpName&gt;&lt;EmpID&gt;2&lt;/EmpID&gt;&lt;email&gt;e@e.com&lt;/email&gt;&lt;/EMPLOYEE&gt;&lt;/EMPLOYEES&gt;</pre>
C:\Apps\PHP>

ie: 即:

<EMPLOYEES>
    <EMPLOYEE>
        <EmpName>John Doe</EmpName>
        <EmpID>1</EmpID>
        <email>d@d.com</email>
    </EMPLOYEE>
    <EMPLOYEE>
        <EmpName>Alan Smith</EmpName>
        <EmpID>2</EmpID>
        <email>e@e.com</email>
    </EMPLOYEE>
</EMPLOYEES>

Finally, I get this XML 最后,我得到了这个XML

<?php
//File: DOM.php
$db="(DESCRIPTION=
     (ADDRESS_LIST=
       (ADDRESS=(PROTOCOL=TCP)
         (HOST=xxx)(PORT=1530)
       )
     )
       (CONNECT_DATA=(SID=DEV))
 )";
 $conn = OCILogon("uname","pass",$db);
 if ($conn) {
   //echo "Successfully connected to Oracle.";  
 } else {
   $err = oci_error();
   echo "Oracle Connect Error " . $err['text'];
 }
//$dept_id = 007144;
$query = "SELECT user_name from fnd_user where user_name = '007144'";


$stmt = oci_parse($conn,$query);
//oci_bind_by_name($stmt, ':deptid', $dept_id);
if (!oci_execute($stmt, OCI_DEFAULT)) {
$err = oci_error($stmt);
trigger_error('Query failed: ' . $err['message'], E_USER_ERROR);
}
$dom = new DOMDocument('1.0', 'UTF-8');
$root = $dom->createElement('EMPLOYEES', '');
$dom->appendChild($root);//$root = $dom->appendChild($root);
while ($row = oci_fetch_array($stmt, OCI_RETURN_NULLS)) 
{

//var_dump($row);
//$emp = $dom->createElement('EMPLOYEE', 'emp');
//$emp = $root->appendChild($emp);
//$emp->setAttribute('id', $row['EMPLOYEE_NUMBER']);

$emp = $dom->createElement('EMPLOYEE', '');
                $emp = $root->appendChild($emp);
                //$emp->setAttribute('id', $row['FULL_NAME']);
                $EmpName = $dom->createElement('EmpName', $row['FULL_NAME']);
                $EmpName = $emp->appendChild($EmpName);
                $empid = $dom->createElement('EmpID', $row['EMPLOYEE_NUMBER']);
                $empid = $emp->appendChild($empid);
                $email = $dom->createElement('email', $row['EMAIL_ADDRESS']);
                $email = $emp->appendChild($email);
}
        echo $dom->saveXML();
        $dom->save("employees.xml");
oci_close($conn); 
?>

And the result here: http://filedb.experts-exchange.com/incoming/2012/11_w47/617768/XMLinPHP4.jpg 结果在这里: http : //filedb.experts-exchange.com/incoming/2012/11_w47/617768/XMLinPHP4.jpg

Now, I will start parsing this XML and I hope it will work out in the end, otherwise i will come back and disturb you again, Sorry :( 现在,我将开始解析此XML,希望它最终可以解决,否则我会回来并再次打扰您,对不起:(

I will let you know tomorrow, Wait for me :) 明天我会让你知道的,等我:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM