PHP перенос фотографий из одной таблицы базы данных Oracle в другую - PullRequest
1 голос
/ 16 марта 2010

Я пытаюсь перенести набор фотографий (блобов) из одной таблицы в другую в разных базах данных. Я почти у цели, за исключением привязки параметра фото. У меня есть следующий код:

$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 ]

1 голос
/ 16 марта 2010
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 голосов
/ 16 марта 2010

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

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

...