2010-03-16 41 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調用以查看它們是否返回了有效結果 - 如果連接失敗或超時,您將在此處看到此錯誤。

相關問題