2010-03-16 106 views
1

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

$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); 
} 

奇特,但却是事实。

回答

1
oci_bind_by_name($parse_db_insert, ':photo', $photo, -1, OCI_B_BLOB); 

您尚未定义$ parse_db_insert变量。

我想这只是这个错误。

PART 2

当连接建立后,将返回此ORACLE错误,但随后在超时未能像(全解释一下:http://www.dba-oracle.com/m_ora_03113_end_of_file_on_communications_channel.htm

首先,你确定这两个变量$ pid和$照片包含实际值? 其次,在PHP手册下oci_bind_by_name指出:

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

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

也许你只是得到了绑定错误或您的变量是空的。

+0

谢谢你。我从原文中清理了我的代码,这只是一个错字。我纠正了它。错误依然存在。 – 2010-03-16 12:36:41

0

否 - 错误来自以下行。

您不检查以前的oci调用以查看它们是否返回了有效结果 - 如果连接失败或超时,您将在此处看到此错误。

相关问题