Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kopiowanie danych z tabeli Oracle do tabeli MySQL + PDO
Forum PHP.pl > Forum > Bazy danych > MySQL
diodadioda
Witam
Mam takie bazy:
Baza nr 1 ORACLE
tabela1: numer_zlecenia, uwagi
Baza nr 2 MYSQL
tabela2: nr_zlec, uw
Chciałbym za pomocą polecenia PHP skopiować dane z oracle do mysql.
Domyślam się, że najpierw łącze się z bazami a potem muszę zrobić insert i tu jest problem.
Kod
<?php
$dbh1 = new PDO('mysql:host=localhost;dbname=mysql', 'logn', 'haslo');
$dbh2 = new PDO('oci:host=199.199.9.99;dbname=oracle', 'login', 'login');
?>

odczytac dane z oracla moge tak:
Kod
$stmt2 = $dbh2->prepare("SELECT numer_zlecenia, uwagi FROM tabela1 ");
$stmt2->execute();
$arrValues2 = $stmt2->fetchAll(PDO::FETCH_ASSOC);

Pytanie jak poprawnie zrealizowac:
Kod
mysql_query('INSERT INTO MYSQL.tabela2(nr_zlec, uw) select numer_zlecenia, uwagi from ORACLE.tabela1')

Pozdrawiam i liczę na pomoc
trueblue
Może jednak siłowe rozwiązanie...
http://befused.com/php/select-insert-different-databases

diodadioda
Dzięki za podpowiedz, ale sęk w tym, że łączę się przez PDO i dlatego nie wiem jak wykonać operację dalej. We wskazanym przykładzie obie bazy to mysql.
Proszę o inne propozycje.
nospor
Przeciez dostales rozwiazanie od poprzednika.... Pobierasz rekordy z jednej bazy i wkladasz odzielnym zapytaniem do drugiej. To wlasnie masz zrobione w kodzie co dostales wczesniej...
diodadioda
Dzięki, za pomoc.
Dalej jednak mam problem. Pierwszy problem to na pewno zły warunek w pętli bo nie wykonuje INSERT. Co mam nie tak?
Funkcji mysql_fetch_object wykorzystanej w podesłanym rozwiązaniu nie mogę używać, potrzebuję czegoś i do oracla i mysql stąd PDO, które kuleje u mnie bardzo.

Kod
$dbh2 = new PDO('oci:host=19999;dbname=baza2', 'login', 'haslo');
$stmt2 = $dbh2->prepare("SELECT numer_zlecenia FROM tabela2");

while ($data = $stmt2->fetchObject()){
$var1 = $data->numer_zlecenia;            
$dbh1 = new PDO('mysql:host=localhost;dbname=baza1', 'login', 'haslo');
$sql = "INSERT INTO tabela1 (nr_zlec) VALUES (':wart')";
$x = $dbh1->prepare($sql);
$x->execute(array(':wart'=>$var1));
    }


trueblue
  1. $stmt2 = $dbh2->query("SELECT numer_zlecenia FROM tabela2"); //zamiast prepare, jeśli nic nie bindujesz,
  2. $stmt2->execute(); //tego brakuje
  3.  
  4. $dbh1 = new PDO('mysql:host=localhost;dbname=baza1', 'login', 'haslo'); //to wyprowadź przed while
nospor
VALUES (':wart')";
Wartosci bindowanych w nic sie nie bierze, czyli tak ma byc
VALUES (:wart)";

Poza tym jesli nadal ci nie bedzie dodawac, znaczy ze jest jakis blad bazy. Wyswietl go to bedzie wiadomo o co chodzi
diodadioda
Póki co straszy Notice: Undefined property: stdClass::$numer_zlecenia.
szukam co pochrzaniłem..
nospor
zamiast fetchObject uzywaj FETCH assoc i dobieraj sie do rekordu jak do zwyklej tablicy.

Poza tym miales wyswietlic blad bazy a tego nie robisz. To co podales to blad php.
diodadioda
Błąd bazy hmm, ale ja nie mam błędu bazy..tak mi się wydaje PDOException przynajmniej nic nie wyświetla. Jak inaczej mogę te błędy zobaczyć worriedsmiley.gif
nospor
To zalezy, czy wlaczyles, by PDO plułą wyjątkiem przy bledzie czy nie. Jak nie wlączyles, to PDO nie bedzie plulo ci błędem.
Zajrzyj do manuala do dzialu PDO. Tam masz podaną funkcją, ktora wyswietla ostatni bląd bazy.
diodadioda
Faktycznie ..musiałem wykasować sobie linijkę ...
Było
Array ( [0] => Array ( [file] => D:\xampp\htdocs\x\kop_tabel.php [line] => 12[function] => fetchObject [class] => PDOStatement [type] => -> [args] => Array ( ) ) )
Jest

Array ( [0] => Array ( [file] => D:\xampp\htdocs\x\kop_tabel.php [line] => 12 [function] => fetchAll [class] => PDOStatement [type] => -> [args] => Array ( [0] => 2 ) ) )
nospor
Wyjatki plują komunikatem bledu, a Twoj "wyjątek" jakos nie wyplul komunikatu bledu... Jestes pewien ze poprawnie go uzyles?
diodadioda
No nie wiem po połaczeniach dołożyłem linijkę
$dbh1->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
a poźniej
i $dbh2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
catch(PDOException $e)
{
print_r( $e->getTrace() );
}

a jak prawidłowo należałoby to zrobić?
nospor
print_r( $e->getTrace() ); - to jest wyswietlenie sciezki a ty masz wyswietlic komunikat bledu.
diodadioda
Kolejny dzień, kolejna walka:
SQLSTATE[HY000]: General error: 1002 OCIStmtFetch: ORA-01002: fetch out of sequence (ext\pdo_oci\oci_statement.c:475)HY000
nospor
http://lmgtfy.com/?q=002+OCIStmtFetch%3A+O...out+of+sequence

I pokaz aktualny kod
diodadioda
Dzięki smile.gif
kod wyglada tak:
Kod
<?php
try{
$dbh2 = new PDO('oci:host=188.188.7.88;dbname=test', 'log', 'haslo');
$dbh2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt2 = $dbh2->query("SELECT numer_zlecenia FROM zlecenia_produkcyjne");
$stmt2->execute();

//$data = $stmt2->fetchAll(PDO::FETCH_ASSOC);


$dbh1 = new PDO('mysql:host=localhost;dbname=baza1', 'log1', 'haslo');
$dbh1->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

while ($data = $stmt2->fetchAll(PDO::FETCH_ASSOC)){
$variable1 = $data->numer_zlecenia;            
$sql = "INSERT INTO zlecenia_carbo (nr_zlec) VALUES (:wart)";
$q = $dbh1->prepare($sql);
$q->execute(array(':wart'=>$variable1));

}
$stmt2 -> closeCursor();

//wyswietlanie tabeli oracle
/*
foreach ($data as $row2){
foreach ($row2 as $key2 => $val2){
print "$val2";
}
print "\n";
}
*/
}

//bledy
catch(PDOException $e)
{
    print_r( $e->getTrace() );
        print_r( $e->getMessage() );
        print_r( $e->getCode() );
        
}

?>

Ewidentnie źle pobieram dane. Jak zakomentuje petle i $data = $stmt2->fetchAll(PDO::FETCH_ASSOC) wyrzuce przed nią to tablice mi wyswietla bez problemu. Póki co to:
Notice: Trying to get property of non-object in D:\xampp\htdocs\x\kop_tabel.php on line 15
Array ( [0] => Array ( [file] => D:\xampp\htdocs\x\kop_tabel.php [line] => 18 [function] => execute [class] => PDOStatement [type] => -> [args] => Array ( [0] => Array ( [:wart] => ) ) ) ) SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'nr_zlec' cannot be null23000

Google oczywiście sprawdzałem, ale już jestem tak zamotany ze robie błąd za błędem..
Turson
  1. while ($data = $stmt2->fetchAll(PDO::FETCH_ASSOC)){
  2. $variable1 = $data->numer_zlecenia;
  3. $sql = "INSERT INTO zlecenia_carbo (nr_zlec) VALUES (:wart)";
  4. $q = $dbh1->prepare($sql);
  5. $q->execute(array(':wart'=>$variable1));
  6.  
  7. }

Pobierasz dane jako tablicę asocjacyjną a nie obiekt więc $data['numer_zlecenia']
diodadioda
Dzięki. Teraz mam :
Notice: Undefined index: numer_zlecenia in D:\xampp\htdocs\x\kop_tabel.php on line 15
Array ( [0] => Array ( [file] => D:\xampp\htdocs\x\kop_tabel.php [line] => 18 [function] => execute [class] => PDOStatement [type] => -> [args] => Array ( [0] => Array ( [:wart] => ) ) ) ) SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'nr_zlec' cannot be null23000


:/
Turson
fetchAll nie używa się w pętli, więc masz 2 wyjścia

1 - pobrać dane przed pętlą w pętli je obrabiać
  1. $data = $stmt2->fetchAll(PDO::FETCH_ASSOC);
  2. foreach($data as $v)


2 - pobierać w pętli pojedynczo
  1. while ($data = $stmt2->fetch(PDO::FETCH_ASSOC))
diodadioda
Hmmm możesz rozwinąć wariant 1...
Turson
  1. $data = $stmt2->fetchAll(PDO::FETCH_ASSOC);
  2. foreach($data as $v){
  3. $variable1 = $v['numer_zlecenia'];
  4. $sql = "INSERT INTO zlecenia_carbo (nr_zlec) VALUES (:wart)";
  5. $q = $dbh1->prepare($sql);
  6. $q->execute(array(':wart'=>$variable1));
  7. }
diodadioda
No tak własnie zrobiłem i mam:
Notice: Undefined index: numer_zlecenia in D:\xampp\htdocs\x\kop_tabel.php on line 14
Array ( [0] => Array ( [file] => D:\xampp\htdocs\x\kop_tabel.php [line] => 17 [function] => execute [class] => PDOStatement [type] => -> [args] => Array ( [0] => Array ( [:wart] => ) ) ) ) SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'nr_zlec' cannot be null23000


Przy 2 wariancie tez mam Undefined index..
Turson
Przed pętlą foreach sprawdź co ci pobrało
print_r($data );
podejrzewam brak wyników i problem leży wczesniej
diodadioda
Zaciąga dane:
[NUMER_ZLECENIA] => X-OLGEEE4AGOTT53 ) [11373] => Array ( [NUMER_ZLECENIA] => X-OLGEEE4M87TT53 ) [11374] => Array ( [NUMER_ZLECENIA] => X-OLGEEE4MA7TT52 ) [11375] => Array ( [NUMER_ZLECENIA] => X-OLGEEE4MD9TT52 ) [11376] => Array ( [NUMER_ZLECENIA] => X-OLGEEE4MGOTT52 ) [11377] => Array ( [NUMER_ZLECENIA] => X-OLGEEE4MGOTT53 ) [11378] => Array ( [NUMER_ZLECENIA] => X-OMGEEE4AEATT53 ) [11379] => Array ( [NUMER_ZLECENIA] => X-OMGEEE4MEATT53 ) [11380] => Array ( [NUMER_ZLECENIA] => X-QIANDA3A30GG01 ) [11381] => Array ( [NUMER_ZLECENIA] => X-SJANDA3A6SAAFI ) [11382] => Array ( [NUMER_ZLECENIA] => X-SJANDA3A8PAAFI ) [11383] => Array ( [NUMER_ZLECENIA] => X-SJANDA3AASAAFI ) [11384] => Array ( [NUMER_ZLECENIA] => X-UAASZA2A16GG01 ) [11385] => Array ( [NUMER_ZLECENIA] => X-UIANDA3M30GG01 ) [11386] => Array ( [NUMER_ZLECENIA] => X-ULFNEB4A4CGG31 ) [11387] => Array ( [NUMER_ZLECENIA] => X-XETAXN4A2XFFGX ) [11388] => Array ( [NUMER_ZLECENIA] => X-ZIBNZB7B1000CC ) )
Notice: Undefined index: numer_zlecenia in D:\xampp\htdocs\x\kop_tabel.php on line 16
Array ( [0] => Array ( [file] => D:\xampp\htdocs\x\kop_tabel.php [line] => 19 [function] => execute [class] => PDOStatement [type] => -> [args] => Array ( [0] => Array ( [:wart] => ) ) ) ) SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'nr_zlec' cannot be null23000

Turson
Ahh no wyraźnie widać NUMER_ZLECENIA, nie numer_zlecenia.
Hmm poza tym chyba samo $v bez klucza wystarczy
diodadioda
Woow wstyd mi ...teraz tylko obejść limit 30 sekund i szafa gra. Dziękuję bardzo za pomoc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.