如何使用XML创建OCI-Lob对象?

时间:2015-04-12 13:09:19

标签: php oracle clob oci xmltype

我有一个Oracle Query,它返回以下输出: -

stdClass Object
(
    [START_TIME] => 2015/01/04 06:03:07
    [END_TIME] => 2015/01/04 06:27:27
    [STATUS] => Error
    [NODE] => DEVSERVER1
    [CTRL_GROUP] => DEV_ORA
    [SERVER_NUMBER] => 1001
    [JOB_NAME] => Oracle Process
    [STEP_INFORMATION] => OCI-Lob Object
        (
            [descriptor] => Resource id #165
        )
)

在此,步骤信息来自一个getClobVal()函数,该函数存在于Oracle Query中。我通过运行以下代码来提取XML内容 -

$stmt = oci_parse($this->oraConn, $query);
oci_execute($stmt, OCI_DEFAULT);
$r = oci_fetch_array($stmt, OCI_RETURN_NULLS+OCI_RETURN_LOBS);
echo "<pre>";
echo htmlentities($r["STEP_INFORMATION"]);
echo "</pre>";
exit;

我有以下XML -

<orastep number="9">
  <ora_name>oracle_load_script</ora_name>
  <ora_selection>10089</ora_selection>
  <ora_selection_ind>3</ora_selection_ind>
</orastep>

我正在进行PHP单元测试,我需要将输入与Oracle输出相同,但不使用Oracle查询或连接到任何数据库。我已经尝试使用JSON以及在PHP中创建对象来模拟输入但我不能代表OCI-Lob对象。

我想知道如何使用上面的XML来创建OCI-Lob对象,如下所示,这样我就可以在输入中模拟它并在单元测试中传递它。

[STEP_INFORMATION] => OCI-Lob Object
(
    [descriptor] => Resource id #165
)

我在PHP中查找了几乎所有与OCI-Lob相关的线程,但没有得到我正在寻找的信息。

希望你理解我的问题。对此有任何建议将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:0)

在对此进行了大量调查之后,我终于明白了这一点。我们不能直接将XML直接转换为OCI-Lob对象。因为

&#34; Oracle调用接口(OCI)是一个应用程序编程接口(API),它允许用C编写的应用程序与一个或多个Oracle服务器进行交互。 OCI使您的程序能够执行Oracle9i数据库可能实现的所有数据库操作,包括SQL语句处理和对象操作。&#34;

如果我们在查询中有任何带有getClobVal()的XMLAGG函数,我们将其存储为&#34; Val&#34;返回OCI-Lob对象,如下所示

upload_to

下面的函数将为我们提供OCI-Lob对象[CLOB DataType]的XML内容,我在问题中已经提到过。

$Val = OCI-Lob Object
(
    [descriptor] => Resource id #130
)

现在如果我从printVar中删除load()($ row [&#39; Val&#39;] - &gt; load())并执行printVar($ row [&#39; Val&#39;])将再次返回OCI-Lob对象。

获取OCI-Lob对象我们还需要Oracle Select Query,我们可以使用getClobVal()或任何函数传递XMLAttributes / Elements。但我们无法解析XML并将其转换为OCI-Lob对象,因为它始终与Oracle数据库/服务器进行交互。

因此,为了运行PHP单元测试我所做的是,我将XML和Converted转换为OCIMockObject,它将具有所有XML值并将其解析为函数。

工作了!

此链接有助于详细了解Oracle Call Interface(OCI)

感谢。