Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przerzucanie bazy danych.
Forum PHP.pl > Forum > Bazy danych > MySQL
exseerius
Witam,

Napisałem sobie kiedyś prowizorycznie i na szybko program do raportowania wysyłek. Spieszyło mi się, więc nie dbałem specjalnie o optymalizację itp. Teraz jak już baza trochę waży powstała nowa wersja mego programu i działa na innej bazie danych, gdzie jest inny układ kolumn. Prawie udało mi się wszystko przewalić, ale zatrzymałęm się w miejscu.

Otóż mam takie coś:
  1. INSERT INTO db2.dokumenty (id_wysylki , nazwa , pesel , numer , uwagi)
  2. SELECT ch_id , name , p_n REGEXP '^[0-9]{11}$', p_n REGEXP '^[a-zA-Z]{3}[0-9]{9}$' , uwagi FROM db1.dokumenty;


W miejscach, gdzie jest regexp wpisuje mi 1 lub zero, w zaleznosci, czy spelniony jest lub nie warunek, ale ja chcę, zeby wpisał mi wartość komórki (kiedys pole do trzymania numeru id wysylki, lub peselu odbiorcy bylo w tej samej kolumnie, teraz jest to rozwalone na dwie). Kombinowałem z IFami, ale nie wiem jak za bardzo ich użyć tongue.gif

A i od razu pytanie bo też nie wiem. Czy jest jakaś możliwość wykonywania procedur na przykładzie:
  1. CALL nazwa_procedury(SELECT id_wysylki FROM db2.dokumenty);


Próbowałem i mi to zadziałać nie chce, ale może coś źle konstruuję zapytanie... W procedurze mam jedną zmienną, która jest identyfikatorem wysyłki, a później to już samo śmiga biggrin.gif

Dzięki za odpowiedź, pozdrawiam,
nevt
musisz ograniczyć wynik SELECT'a do jednego rekordu z jednym polem... przykładowo:
  1. CALL nazwa_procedury(SELECT `id_wysylki` FROM `db2`.`dokumenty` WHERE `id` = 1;)

albo:
  1. CALL nazwa_procedury(SELECT `id_wysylki` FROM `db2`.`dokumenty` LIMIT 1;)


a jeżeli chcesz wywołać procedurę dla wszystkich `id_wysyłki`, to spróbuj (nie wiem czy zaskoczy, nie mogę w tej chwili sprawdzić):
  1. SELECT CALL nazwa_procedury(`id_wysylki`) FROM `db2`.`dokumenty`;


EDIT: sprawdziłem, niestety to powyżej nie działa, ale działa taka konstrukcja, może ci wystarczy:
  1. CREATE FUNCTION abc(x INT) RETURNS char(20) RETURN CONCAT('qqq ', x);
  2. SELECT abc(id_wysylki) FROM dokumenty;
exseerius
Tylko, że ja już mam zadeklarowaną procedurę w mysqlu - dość skomplikowana, i musi to chodzić na procedurze... ale nieważne, poradzę sobie z tym może poprzez php i małą petelkę (o matko ile zapytań bedzie tongue.gif)

A ktoś ma pomysły co do pierwszego problemu? Bo nie ukrywam bardziej mnie interesuje...

OK pierwszy problem rozwikłany, dla ciekawskich, użyłem CASE'a (dzikęki forum na goldenie).

  1. INSERT INTO db1.temp_dok (id_wysylki , nazwa , pesel , numer , uwagi)
  2. SELECT ch_id , name , CASE 1 WHEN p_n REGEXP '^[0-9]{11}$' THEN p_n END, CASE 1 WHEN p_n REGEXP '^[a-zA-Z]{3}[0-9]{9}$' THEN p_n END , uwagi FROM db2.dokumenty;


Nadal jednak nie potrafię poradzić sobie z procedurą. Zależy mi na niej, bo z tego co mi wiadomo, funkcje nie mają możliwości zapytań mysql, a w procedurze zawarty jest cały system dodawania rekordów i rozwalania ich pomiędzy wszystkie tabele z tabeli tymczasowej - nie chcę robić tego przez php, bo generuje mi się za duzo zapytan...
nevt
Cytat
Zależy mi na niej, bo z tego co mi wiadomo, funkcje nie mają możliwości zapytań mysql,

ale przecież można wywoływać procedury... zatem napisz funkcję, która będzie pobierać ID i wywoływać z tym parametrem twoją procedurę... a funkcji możesz użyć w SELECT, jak w moim przykładzie...

EDIT : w pierwszej wersji były domysły, teraz sprawdziłem jak jest...
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.