1

データベース間で一連の写真 (ブロブ) をあるテーブルから別のテーブルに転送しようとしています。写真パラメータをバインドすることを除いて、私はほぼそこにいます。次のコードがあります。

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

奇妙ですが、本当です。

4

2 に答える 2

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 という 2 つの変数に実際の値が含まれていますか? 次に、oci_bind_by_name の下の PHP マニュアルでは、次のように述べています。

バインド呼び出しは、データを読み取るメモリ アドレスを Oracle に通知します。IN バインドの場合、oci_execute() が呼び出されたときにそのアドレスに有効なデータが含まれている必要があります。これは、バインドされた変数が実行までスコープ内にある必要があることを意味します。そうしないと、「ORA-01460: 実装されていない、または不当な変換が要求されました」などの予期しない結果やエラーが発生する可能性があります。OUT バインドの 1 つの症状は、PHP 変数に値が設定されていないことです。

全文はこちら: http://php.net/manual/en/function.oci-bind-by-name.php

バインディングが間違っているか、変数が空である可能性があります。

于 2010-03-16T12:29:18.437 に答える
0

いいえ - エラーは次の行から発生します。

以前の oci 呼び出しをチェックして、有効な結果が返されたかどうかを確認しません。接続が失敗したかタイムアウトした場合、ここでこのエラーが発生します。

于 2010-03-16T13:48:45.940 に答える