PHP Başka One Oracle Veritabanı Tablo From Fotoğraflar aktarılması

2 Cevap php

Başka genelinde veritabanlarına bir tablodan bir dizi fotoğraf (lekeler) aktarmak için çalışıyorum. Ben fotoğraf parametre bağlama hariç, neredeyse oradayım. Ben aşağıdaki kodu vardır:

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

Ama yukarıda yorumladı hata satırında, aşağıdaki hatayı alıyorum:

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

Herkes bunu yapmak için doğru yolu biliyor mu?

Problem Solved

İnternet arama biraz ile ben çalışan bir çözüm bulundu. Ben insert SQL değişti:

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

Sonra böylece iken döngü değişti:

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

Tuhaf, ama gerçek.

2 Cevap

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

Bir $ parse_db_insert değişken tanımlı değil.

Ben sadece bu hata sanırım.

PART 2

Bu ORACLE hata bağlantı kurulduğunda döndü ama daha sonra zaman aşımı gibi başarısız (burada tam açıklama: http://www.dba-oracle.com/m_ora_03113_end_of_file_on_communications_channel.htm)

First, are you sure the two variables $pid and $photo contain actual values? Second, in the PHP manual under oci_bind_by_name states that:

A bind call tells Oracle which memory address to read data from. For IN binds that address needs to contain valid data when oci_execute() is called. This means that the variable bound must remain in scope until execution. If it doesn't, unexpected results or errors such as "ORA-01460: unimplemented or unreasonable conversion requested" may occur. For OUT binds one symptom is no value being set in the PHP variable.

Tam metin burada: http://php.net/manual/en/function.oci-bind-by-name.php

Belki de sadece bağlama yanlış var ya da değişken boştur.

Hayır - Hata aşağıdaki satırı geliyor.

Sen önceki oci geçerli bir sonuç döndürdü görmek için çağrıları kontrol yok - bağlantı başarısız veya zaman aşımına eğer burada bu hatayı alırsınız.