Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] jak przekazać id do procedury
Forum PHP.pl > Forum > Bazy danych > MySQL
fragles
chodzi o coś takiego, że wybieram ileś tam typów i dla tych typów wywołuje procedurę
czyli po SQL-owemu byłoby to
WHERE id IN (1,2,3 itd)

przekazuję to jako tekst - '1,2,3' - w takiej formie
ale jest problem gdy wstawiam to bezpośrednio do zapytania mam błąd

Truncated incorrect DOUBLE value: '1,2,3'

a wynik jest pobierany tylko dla ID 1 (dokładniej dla pierwszego ID)

Jak to zrobić?


na razie robię tak
- zapytanie jako string
- na końcu w procedurze używam instrukcji

SET @dyn_sql=sqlQuery;
PREPARE s1 FROM @dyn_sql;
EXECUTE s1;
DEALLOCATE PREPARE s1;

ale czy można jakoś bezpośrednio do SQL - bez potrzeby tworzenia zapytania tekstu - przekazać wiele numerów ID?
thek
Pytanie mam... Czy te numery id podajesz z POST lub GET, czy może także wyciągasz z bazy danych? Ja zazwyczaj mam ten drugi przypadek i wtedy ładnie się upraszcza problem, gdyż wtedy przekazujesz je jako podzapytanie przy IN tak jak sugerujesz na początku wedle schematu:
  1. SELECT coś_tam FROM tabelki WHERE id IN ( SELECT id FROM inna_tabela )

Jak sam widzisz w podzapytaniu tylko id przy select ustawiasz.
Przypadku pierwszego nie miałem okazji stosować z racji takiego rozpisania bazy, że rozwiązanie drugie mi wystarcza smile.gif
jmail
  1.  
  2. --input - to jest parametr przekazywany do funkcji cyzli lista indexów
  3.  
  4. declare delim varchar(10) DEFAULT ',';
  5. declare foundPos tinyint UNSIGNED;
  6. declare tmpTxt text;
  7. declare delimLen tinyint UNSIGNED;
  8. declare element text;
  9.  
  10. DROP TEMPORARY TABLE IF EXISTS tmpValues;
  11. CREATE TEMPORARY TABLE tmpValues
  12. (
  13. valueId text NOT NULL DEFAULT ''
  14. ) engine = memory;
  15.  
  16. SET delimLen = length(delim);
  17. SET tmpTxt = input;
  18.  
  19. SET foundPos = instr(tmpTxt,delim);
  20. while foundPos <> 0 do
  21. SET element = substring(tmpTxt, 1, foundPos-1);
  22. SET tmpTxt = REPLACE(tmpTxt, concat(element,delim), '');
  23.  
  24.  
  25. INSERT INTO tmpValues (valueId) VALUES ( element);
  26.  
  27. SET foundPos = instr(tmpTxt,delim);
  28. end while;
  29.  
  30. IF tmpTxt <> '' then
  31. INSERT INTO tmpValues (valueId) VALUES (tmpTxt);
  32. end IF;
  33.  
  34. --i robisz
  35.  
  36. SELECT bla bla bla WHERE id IN (SELECT valueId FROM tmpValues)
  37.  


na koniec zdropuj tmpValues
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.