MySQL Oracle sonuç kümesini kopyalarken Sorunları

0 Cevap php

Ne yapmaya çalışıyorum bir MySQL veritabanı tabloya kehanet bir sorgunun sonucunu kopyasıdır. Bunun arkasındaki mantık sorusunun önemli değildir, ve ben gerçekten farklı bir yaklaşım olamaz.

Ben ne yapıyorum sonra oracle bir yeni oluşturulan tabloya sonucu kopyalama, php olsa sorgu çalışıyor. Sorgular çok uzun çalışmasına rağmen, bu çok verimli değildir biliyorum, ama benim masa boyutları oldukça küçük.

Her şeyi sorun oracle gelen tarih getirtiyor yaşıyorum dışında çalışır; Ben olduğu gibi çalıştırdığınızda, benim tarih alanları 0'a ayarlanır. Ne yapıyorum bir sütun türü "TARİH (7)" ve o zaman eğer ben bir oluşturmak olmadığını görmek için kehanet kümesi sonuç denetliyor türü "DATE" ile MySQL sütun. Ama nedense bu işe yaramazsa.

Aşağıdaki kodu, üzgünüm biraz uzun kullanıyorum, ama bunu tüm sağlamak için en iyi görünüyordu.

function hmis_query_transfer ($query_name, $parameters = NULL) {
    //Create Connections to both servers
    $dbConn_Oracle = hmis_oci_connect();
    hmis_mysql_connect("hmis_temp");

    //Retrieve the text for the query and run it on the Oracle server
    $query_Oracle = hmis_query_by_name($query_name, $parameters);
    $stmt_Oracle = hmis_oci_query($dbConn_Oracle , $query_Oracle);

    $ncols = oci_num_fields($stmt_Oracle);

    //Test if table is already created in MySQL
    $mysql_check = "DESC ".$query_name;
    @hmis_mysql_query($mysql_check);
    if (mysql_errno()==1146){
        $mysql_create = "CREATE TABLE ".$query_name." ( ";

        //Transform and append column names to query string
        for ($j = 1; $j <= $ncols; $j++) {
        $name = oci_field_name($stmt_Oracle, $j);
        $type = oci_field_type($stmt_Oracle, $j);
        if ($type == "NUMBER") {
            $type = "INT";
        } else if ($type == "VARCHAR2"){
            $type = "VARCHAR";
        }
        $type .= "(".oci_field_size($stmt_Oracle, $j).")";
        if ($type == "DATE(7)") {
            $type = "DATE";
        }

        $mysql_create .= $name." ".$type.",";
        }
        $mysql_create = substr_replace( $mysql_create, "", -1 );
        $mysql_create .= ')';
        //Create Table
        $result = hmis_mysql_query($mysql_create);
        if ( !$result ){
        die('<strong>Failed Create:</strong>'.mysql_error());
        }
    }
    elseif (!mysql_errno()) {
        //If the table already exists, empty it
        $mysql_truncate = "TRUNCATE TABLE ".$query_name;
        $result = hmis_mysql_query($mysql_truncate);
        if ( !$result ){
        die('<strong>Failed Truncate:</strong>'.mysql_error());
        }
    }

    //Copy over row by row the data from the result set to MySQL
    while ($results_row = oci_fetch_array($stmt_Oracle, OCI_ASSOC )) {
        $mysql_insert = "INSERT INTO ".$query_name." VALUES (";

        for ($i = 1; $i <= $ncols; $i++) {
        $mysql_insert .= "'".$results_row[oci_field_name($stmt_Oracle, $i)]."',";
        }
        $mysql_insert = substr_replace( $mysql_insert, "", -1 );
        $mysql_insert .= ")";
        $result = hmis_mysql_query($mysql_insert);
        if ( !$result ){
        die('<strong>Failed Insert:</strong>'.mysql_error());
        }
    }
}

Herkes benim kodunda herhangi bir kusurları görüyor musun? Benim kod devam edebilmek için tercih ederim ama ben, ben bu farklı bir şekilde yapabileceğini nasıl önerilere açığım. Herhangi bir yardım için teşekkür ederiz.


Sorguların en (15-20 dakika) çalıştırmak için çok uzun sürebilir ve zekâ büyük veri kümelerini (200 milyon dolar) anlaşma çünkü ben MySQL Oracle veri kopyalama ediyorum nedeni, ama benim sonuç kümeleri (çok küçük birkaç bin en). Benim uygulama inşa yolu kendi görev gerçekleştirmek için aynı veri kümesi üzerinde tekrar sorguları çalıştırmak zorundadır. Ben oracle bu gerçekleştirmek için görüşlerini oluşturmak için isterdi, ama bunu yapmak için yetkisi yok. Bu yüzden çok daha hızlı bir makinede olur ki, bir orta tabaka sonuç kümesini kaydedebilir ve üzerinde benim analizi gerçekleştirmek.

0 Cevap