Я пытаюсь скопировать результат запроса в 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миллионов), но мои результаты очень малы (максимум несколько тысяч).При создании моего приложения он должен выполнять повторные запросы к одному и тому же набору данных для выполнения своей задачи.Мне бы хотелось создавать представления для достижения этой цели в оракуле, но у меня нет полномочий делать это.Поэтому я сохраняю набор результатов среднего уровня и выполняю анализ на нем, который происходит на гораздо более быстрой машине.