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);
}
Своеобразно, но верно.
2 ответа
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
Возможно, вы просто неправильно связали или ваша переменная пуста.
Нет - ошибка исходит из следующей строки.
Вы не проверяете свои предыдущие вызовы oci, чтобы увидеть, вернули ли они действительный результат - вы получите эту ошибку здесь, если соединение не удалось или истекло время ожидания.