Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] procedura skladowana, tabela tymczasowa
Forum PHP.pl > Forum > Bazy danych > MySQL
zietek
  1. DELIMITER $$
  2.  
  3. DROP PROCEDURE IF EXISTS `root`.`proc1` $$
  4. CREATE DEFINER = `root` @ `localhost` PROCEDURE `proc1`()
  5. BEGIN CREATE TEMPORARY TABLE temp (
  6. `imie` VARCHAR(45),
  7. `nazwisko` VARCHAR(45)
  8. );
  9.  
  10. INSERT INTO temp (imie, nazwisko) (SELECT imie, nazwisko FROM `osoby`);
  11.  
  12. /* tu pewne operacje na tabeli temp */
  13.  
  14. SELECT * FROM temp; DROP TABLE temp;
  15. END $$
  16.  
  17. DELIMITER;


W procedurze skladowanej tworze tymczasowa tabele, do ktorej wrzucam dane z tabeli 'osoby'. Nastepnie wykonuje pewne operacje na tabeli tymczasowej (ktore tu pominalem w celu nie zaciemniana skryptu) i zwracam obrobione dane przy pomocy select.

Pytanie: czy wielokrotne wywolanie tej procedury w tym samym czasie nie spowoduje jednoczesnej pracy na tej samej tabeli temp, co spowoduje blad albo przeklamania w danych? W bazach MS SQL korzystalem ze zmiennej typu table (cos jak ponizej). Niestety w MySQL to nie dziala, albo coz zle robie....

  1. DELIMITER $$
  2.  
  3. DROP PROCEDURE IF EXISTS `root`.`proc1` $$
  4. CREATE DEFINER = `root` @ `localhost` PROCEDURE `proc1`()
  5. BEGIN DECLARE temp TABLE(imie VARCHAR(45), nazwisko VARCHAR(45));
  6.  
  7. INSERT INTO temp (imie, nazwisko) (SELECT imie, nazwisko FROM `osoby`);
  8.  
  9. /* tu pewne operacje na tabeli temp */
  10.  
  11. SELECT * FROM temp; END $$
  12.  
  13. DELIMITER;


Jak rozwiazac ten problem?
webdice
Wydaję mi się że będzie operował na tej samej tabeli, ale nie jestem do końca przekonany. Najlepiej utwórz tabelę z dużą ilością danych, uruchom dwa razy skrypt i będziesz widział. Rozwiązaniem może być też:

  1. LOCK TABLES `temp` WRITE
prond
Tabele tymczasowe na pewno nie są dzielone pomiędzy poszczególnymi sesjami połączenia z bazą danych.
Korzystałem z tego wielokrotnie. Ponadto możesz naturalnie utworzyć tabelę tymczasową o tej samej nazwie co istniejąca tabela.
Tabela tymczasowa 'przykryje' wtedy normalną tabelę - tak jakbyś w bazie danych ze schematami ustawił kolejność schematów, z których wybierane są tabele i inne obiekty.
zietek
To jeszcze sie spytam, czy tabele tymczasowa nalezy na koncu DROPowac czy sama ulega skasowaniu na koncu sesji ?
prond
Sama ulega dropowaniu.
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.