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

How to use XML to create OCI-Lob Object?

我有一个 Oracle 查询,returns 下面的输出:-

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
        )
)

在此,步骤信息来自 Oracle 查询中存在的 getClobVal() 函数。我已经通过下面的步骤信息代码 运行 提取了 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 相关的线程,但没有得到我要查找的信息。

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

谢谢。

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

"The Oracle Call Interface (OCI) is an application programming interface (API) that allows applications written in C to interact with one or more Oracle Servers. OCI gives your programs the capability to perform the full range of database operations that are possible with Oracle9i database, including SQL statement processing and object manipulation."

让它像如果我们在查询中有任何带有 getClobVal() 的 XMLAGG 函数,我们将其存储为 "Val",其中 returns OCI-Lob 对象为以下

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

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

$this->$conn = oci_connect('user', 'password', 'connectionString');
$query = "Some SELECT Query";    
$stmt = oci_parse($this->oraConn, $query);      
    oci_execute($stmt);
            while($row = oci_fetch_assoc($stmt)){
                if($row['Val'] != false){
                    printVar($row['Val']->load());
                    break;
                }
            }

现在如果我从 printVar($row['Val']->load()) 中删除 load() 并执行 printVar($row['Val']) 它会再次 return 我是 OCI-Lob 对象。

获取 OCI-Lob 对象 我们确实需要 Oracle Select 查询 此外我们可以通过 XMLAttributes/Elements getClobVal() 或任何函数。但是我们无法解析 XML 并将其转换为 OCI-Lob 对象,因为它总是与 Oracle Database/Server.

交互

所以对于 运行 我所做的 PHP 单元测试是,我采用 XML 并将其转换为 OCIMockObject,它将具有所有 XML值并将其解析为函数。

成功了!

这个 link 有助于了解更多 Oracle Call Interface(OCI)

谢谢。