2010-03-16 1 views
1

Я пытаюсь перенести набор фотографий (blobs) из одной таблицы в другую через базы данных. Я почти там, за исключением привязки параметра фото. У меня есть следующий код: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.

Я предполагаю, что это просто эта ошибка.

ЧАСТЬ 2

Эта ошибка ORACLE возвращается, когда была установлена ​​связь, но затем не как в тайм-аут (полное объяснение здесь: http://www.dba-oracle.com/m_ora_03113_end_of_file_on_communications_channel.htm)

Во-первых, вы уверены, что две переменные $ pid и $ photo содержат фактические значения? Во-вторых, в 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

Спасибо за это. Я очистил свой код от оригинала, это была просто опечатка. Я исправил это. Ошибка все еще сохраняется. –

0

Нет - ошибка исходит из следующей строки.

Вы не проверяете свои предыдущие вызовы oci, чтобы узнать, вернули ли они действительный результат - вы получите эту ошибку здесь, если соединение не выполнено или не выполнено.

 Смежные вопросы

  • Нет связанных вопросов^_^