【问题标题】:PHP Transferring Photos From One Oracle Database Table to AnotherPHP将照片从一个Oracle数据库表传输到另一个
【发布时间】:2011-01-28 02:10:54
【问题描述】:

我正在尝试跨数据库将一组照片(blob)从一个表传输到另一个表。我快到了,除了绑定照片参数。我有以下代码:

$conn_db1 = oci_pconnect('username', 'password', 'db1');
$conn_db2 = oci_pconnect('username', 'password', 'db2');

$parse_db1_select = oci_parse($conn_db1,
"SELECT
    REF PID,
    BINARY_OBJECT PHOTOGRAPH
FROM
    BLOBS");

$parse_db2_insert = oci_parse($conn_db2,
"INSERT INTO
    PHOTOGRAPHS
    (PID,
    PHOTOGRAPH)
VALUES
    (:pid,
    :photo)");    

oci_execute($parse_db1_select);

while ($row = oci_fetch_assoc($parse_db1_select)) {
    $pid = $row['PID'];
    $photo = $row['PHOTOGRAPH'];

    oci_bind_by_name($parse_db2_insert, ':pid', $pid, -1, OCI_B_INT);

    // This line causes an error
    oci_bind_by_name($parse_db2_insert, ':photo', $photo, -1, OCI_B_BLOB);

    oci_execute($parse_db2_insert);
}

oci_close($db1);
oci_close($db2);

但我在上面注释的错误行中收到以下错误:

Warning: oci_execute() [function.oci-execute]: ORA-03113: end-of-file on communication channel Process ID: 0 Session ID: 790 Serial number: 118 

有人知道正确的方法吗?

问题已解决

通过一些互联网搜索,我找到了一个可行的解决方案。我将插入 SQL 更改为:

$parse_db2_insert = oci_parse($conn_db2,
"INSERT INTO
    PHOTOGRAPHS
    (P_ID,
    PHOTOGRAPH)
VALUES
    (:pid,
    EMPTY_BLOB())
RETURNING PHOTOGRAPH INTO :photo");

然后改变了 While 循环:

while ($row = oci_fetch_assoc($parse_db1_select)) {
    $pid = $row['PID'];
    $photo = $row['PHOTOGRAPH'];

    oci_bind_by_name($parse_db2_insert, ':pid', $pid);

    $new_lob = oci_new_descriptor($conn_unite, OCI_D_LOB);
    oci_bind_by_name($parse_db2_insert, ':photo', $new_lob, -1, OCI_B_BLOB);

    oci_execute($parse_db2_insert, OCI_DEFAULT);

    $new_lob->save($photo->load());
    oci_commit($conn_unite);
}

奇特,但真实。

【问题讨论】:

    标签: php oracle blobs


    【解决方案1】:
    oci_bind_by_name($parse_db_insert, ':photo', $photo, -1, OCI_B_BLOB);
    

    您尚未定义 $parse_db_insert 变量。

    我猜只是这个错误。

    第 2 部分

    连接建立后返回此 ORACLE 错误,然后像超时一样失败(此处为完整说明:http://www.dba-oracle.com/m_ora_03113_end_of_file_on_communications_channel.htm

    首先,您确定 $pid 和 $photo 这两个变量包含实际值吗? 其次,在 oci_bind_by_name 下的 PHP 手册中指出:

    绑定调用告诉 Oracle 哪个内存 读取数据的地址。对于 IN 绑定该地址需要包含 oci_execute() 时的有效数据 叫。这意味着变量 bound 必须保持在范围内,直到 执行。如果没有,出乎意料 结果或错误,例如“ORA-01460: 未执行或不合理 转换请求”可能会发生。对于 OUT绑定一个症状是没有价值的 在 PHP 变量中设置。

    全文在这里:http://php.net/manual/en/function.oci-bind-by-name.php

    也许你只是绑定错误或者你的变量是空的。

    【讨论】:

    • 谢谢。我从原始代码中清理了我的代码,这只是一个错字。我已经纠正了。错误仍然存​​在。
    【解决方案2】:

    否 - 错误来自以下行。

    您无需检查之前的 oci 调用是否返回有效结果 - 如果连接失败或超时,您将在此处收到此错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      相关资源
      最近更新 更多