Проблемы с копированием набора результатов Oracle в MySQL - PullRequest
0 голосов
/ 14 августа 2010

Я пытаюсь скопировать результат запроса в oracle в таблицу в базе данных MySQL.Причины этого не важны для вопроса, и я действительно не могу выбрать другой подход.

Я выполняю запрос через php, затем копирую результат во вновь созданную таблицу в oracle.,Я знаю, что это не очень эффективно, но размеры моей таблицы довольно малы, хотя запросы выполняются очень долго.

Все работает, кроме того, что у меня возникают проблемы с переносом даты из оракула;когда я запускаю его как есть, мои поля даты устанавливаются на 0. То, что я делаю, проверяет набор результатов из оракула, чтобы увидеть, является ли тип столбца "DATE ​​(7)", и если это так, я создаюстолбец в MySQL с типом «ДАТА».Но по какой-то причине это не работает.

Я использую следующий код, извините, он довольно длинный, но, казалось, лучше всего это все предоставить.

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

Может кто-нибудь увидетькакие-либо недостатки в моем коде?Я открыт для предложений о том, как я мог бы сделать это по-другому, хотя я бы предпочел иметь возможность сохранить свой код.Спасибо за любую помощь.


Причина, по которой я копирую данные из oracle в MySQL, заключается в том, что большинство запросов выполняется очень долго (15-20 минут) и обрабатывают огромные наборы данных (200миллионов), но мои результаты очень малы (максимум несколько тысяч).При создании моего приложения он должен выполнять повторные запросы к одному и тому же набору данных для выполнения своей задачи.Мне бы хотелось создавать представления для достижения этой цели в оракуле, но у меня нет полномочий делать это.Поэтому я сохраняю набор результатов среднего уровня и выполняю анализ на нем, который происходит на гораздо более быстрой машине.

1 Ответ

0 голосов
/ 14 августа 2010

Я не знаю формат даты из Oracle, но я бы использовал функцию strtotime () для преобразования ее в метку времени Unix, а затем использовал бы date () функция для перевода его в формат MySQL (ГГГГ-ММ-ДД).Это должно работать до тех пор, пока поле даты в oracle не считается датой рождения или находится вне диапазона отметки времени UNIX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...