diodadioda
21.10.2014, 12:01:46
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
21.10.2014, 12:16:09
diodadioda
22.10.2014, 10:38:33
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
22.10.2014, 10:41:35
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
24.10.2014, 11:29:44
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
24.10.2014, 11:43:25
$stmt2 = $dbh2->query("SELECT numer_zlecenia FROM tabela2"); //zamiast prepare, jeśli nic nie bindujesz,
$stmt2->execute(); //tego brakuje
$dbh1 = new PDO('mysql:host=localhost;dbname=baza1', 'login', 'haslo'); //to wyprowadź przed while
nospor
24.10.2014, 12:22:48
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
24.10.2014, 13:09:37
Póki co straszy Notice: Undefined property: stdClass::$numer_zlecenia.
szukam co pochrzaniłem..
nospor
24.10.2014, 13:17:30
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
24.10.2014, 13:40:46
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ć
nospor
24.10.2014, 13:44:07
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
24.10.2014, 13:50:52
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
27.10.2014, 10:18:31
Wyjatki plują komunikatem bledu, a Twoj "wyjątek" jakos nie wyplul komunikatu bledu... Jestes pewien ze poprawnie go uzyles?
diodadioda
27.10.2014, 14:39:19
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
27.10.2014, 17:30:18
print_r( $e->getTrace() ); - to jest wyswietlenie sciezki a ty masz wyswietlic komunikat bledu.
diodadioda
28.10.2014, 07:20:24
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
28.10.2014, 07:24:02
diodadioda
28.10.2014, 10:21:01
Dzięki

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 null23000Google oczywiście sprawdzałem, ale już jestem tak zamotany ze robie błąd za błędem..
Turson
28.10.2014, 10:27:35
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));
}
Pobierasz dane jako tablicę asocjacyjną a nie obiekt więc $data['numer_zlecenia']
diodadioda
28.10.2014, 10:34:08
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
28.10.2014, 10:40:35
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ć
$data = $stmt2->fetchAll(PDO::FETCH_ASSOC);
foreach($data as $v)
2 - pobierać w pętli pojedynczo
while ($data = $stmt2->fetch(PDO::FETCH_ASSOC))
diodadioda
28.10.2014, 12:36:28
Hmmm możesz rozwinąć wariant 1...
Turson
28.10.2014, 14:28:34
$data = $stmt2->fetchAll(PDO::FETCH_ASSOC);
foreach($data as $v){
$variable1 = $v['numer_zlecenia'];
$sql = "INSERT INTO zlecenia_carbo (nr_zlec) VALUES (:wart)";
$q = $dbh1->prepare($sql);
$q->execute(array(':wart'=>$variable1)); }
diodadioda
28.10.2014, 14:40:34
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
28.10.2014, 14:42:12
Przed pętlą foreach sprawdź co ci pobrało
print_r($data );
podejrzewam brak wyników i problem leży wczesniej
diodadioda
28.10.2014, 14:47:35
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
28.10.2014, 14:50:32
Ahh no wyraźnie widać NUMER_ZLECENIA, nie numer_zlecenia.
Hmm poza tym chyba samo $v bez klucza wystarczy
diodadioda
28.10.2014, 15:04:42
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.