我有一个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相关的线程,但没有得到我正在寻找的信息。
希望你理解我的问题。对此有任何建议将不胜感激。
谢谢。
答案 0 :(得分:0)
在对此进行了大量调查之后,我终于明白了这一点。我们不能直接将XML直接转换为OCI-Lob对象。因为
如果我们在查询中有任何带有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)
感谢。