2010-08-13 4 views
0

Ce que j'essaie de faire est de copier le résultat d'une requête dans Oracle dans une table dans une base de données MySQL. Le raisonnement derrière ceci n'est pas important à la question, et je ne peux pas vraiment prendre une approche différente. Ce que je fais est d'exécuter la requête par php, puis de copier le résultat dans une table nouvellement créée dans Oracle. Je sais que ce n'est pas très efficace, mais mes tailles de table sont assez petites, même si les requêtes sont très longues.Problèmes de copie du jeu de résultats Oracle sur MySQL

Tout fonctionne à part que j'ai des problèmes pour ramener la date d'oracle; quand je l'exécute tel quel, mes champs de date sont mis à 0. Ce que je fais est de vérifier le jeu de résultats d'oracle pour voir si le type d'une colonne est "DATE ​​(7)" et si c'est le cas, je crée un colonne dans MySQL avec le type "DATE". Mais pour une raison quelconque, cela ne fonctionne pas.

J'utilise le code suivant, désolé c'est assez long, mais il semblait préférable de tout fournir.

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

Quelqu'un peut-il voir des failles dans mon code? Je suis ouvert aux suggestions sur comment je pourrais faire ceci d'une manière différente, bien que je préférerais pouvoir garder mon code. Merci pour toute aide.


La raison pour laquelle je copie des données d'Oracle vers MySQL est parce que la plupart des requêtes prennent beaucoup de temps pour courir (15-20 min), et de traiter d'énormes ensembles de données WIT (200 millions), mais mes jeux de résultats sont très petites (quelques milliers au maximum). La façon dont mon application a été créée doit exécuter des requêtes répétées sur le même jeu de données pour accomplir sa tâche. J'aurais aimé créer des vues pour accomplir cela en oracle, mais je n'ai pas l'autorité de le faire. Par conséquent, j'enregistre un jeu de résultats de couche intermédiaire et j'effectue mon analyse sur celle-ci, qui se trouve sur une machine beaucoup plus rapide.

+1

"Merveilleux, je n'ai jamais vraiment aimé faire quelque chose de simple quand on pouvait le faire cul-en arrière." Dixie Flatline, * Neuromancien * – APC

Répondre

0

Je ne sais pas le format de la date d'Oracle, mais je voudrais utiliser la fonction strtotime() pour le convertir en un horodatage unix puis utilisez la fonction date() pour le mettre au format MySQL (AAAA-MM-JJ). Cela devrait fonctionner tant que le champ de date dans Oracle n'est pas supposé être une date de naissance ou hors de la plage d'un Timestamp UNIX.

Questions connexes