Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Kopiowanie danych z tabeli Oracle do tabeli MySQL + PDO
diodadioda
post
Post #1





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 16.06.2014

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
trueblue
post
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Może jednak siłowe rozwiązanie...
http://befused.com/php/select-insert-different-databases

Go to the top of the page
+Quote Post
diodadioda
post
Post #3





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 16.06.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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...
Go to the top of the page
+Quote Post
diodadioda
post
Post #5





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 16.06.2014

Ostrzeżenie: (0%)
-----


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


Go to the top of the page
+Quote Post
trueblue
post
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


  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
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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
Go to the top of the page
+Quote Post
diodadioda
post
Post #8





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 16.06.2014

Ostrzeżenie: (0%)
-----


Póki co straszy Notice: Undefined property: stdClass::$numer_zlecenia.
szukam co pochrzaniłem..
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.
Go to the top of the page
+Quote Post
diodadioda
post
Post #10





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 16.06.2014

Ostrzeżenie: (0%)
-----


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ć (IMG:style_emoticons/default/worriedsmiley.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #11





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.
Go to the top of the page
+Quote Post
diodadioda
post
Post #12





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 16.06.2014

Ostrzeżenie: (0%)
-----


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 ) ) )

Ten post edytował diodadioda 24.10.2014, 13:56:07
Go to the top of the page
+Quote Post
nospor
post
Post #13





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Wyjatki plują komunikatem bledu, a Twoj "wyjątek" jakos nie wyplul komunikatu bledu... Jestes pewien ze poprawnie go uzyles?
Go to the top of the page
+Quote Post
diodadioda
post
Post #14





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 16.06.2014

Ostrzeżenie: (0%)
-----


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ć?
Go to the top of the page
+Quote Post
nospor
post
Post #15





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




print_r( $e->getTrace() ); - to jest wyswietlenie sciezki a ty masz wyswietlic komunikat bledu.
Go to the top of the page
+Quote Post
diodadioda
post
Post #16





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 16.06.2014

Ostrzeżenie: (0%)
-----


Kolejny dzień, kolejna walka:
SQLSTATE[HY000]: General error: 1002 OCIStmtFetch: ORA-01002: fetch out of sequence (ext\pdo_oci\oci_statement.c:475)HY000
Go to the top of the page
+Quote Post
nospor
post
Post #17





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




http://lmgtfy.com/?q=002+OCIStmtFetch%3A+O...out+of+sequence

I pokaz aktualny kod
Go to the top of the page
+Quote Post
diodadioda
post
Post #18





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 16.06.2014

Ostrzeżenie: (0%)
-----


Dzięki (IMG:style_emoticons/default/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..
Go to the top of the page
+Quote Post
Turson
post
Post #19





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


  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']
Go to the top of the page
+Quote Post
diodadioda
post
Post #20





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 16.06.2014

Ostrzeżenie: (0%)
-----


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


:/
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 10:42