Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] Argument w zapytaniu wewnatrz procedury
Forum PHP.pl > Forum > Bazy danych > MySQL
phoenix84
witam

Jak się odwolac do argumentu z procedury wewnatrz zapytania (chodzi mi o znacznik)

przyklad:

WHERE `xxx`=`yyy` (porowna wartosc z kolumna yyy)
WHERE `xxx`='yyy' (porowna wartosc z wartoscia yyy)
WHERE `xxx`=@yyy (porowna wartosc ze zmienna yyy spoza procedury)

a co jak mam argument procedury nazwany yyy? kiedy odwolam sie do niego po prostu jako do yyy to wywala error... wiec jak sie do niego odwolac? obchodze to teraz tak, ze przed wywolaniem procedury deklaruje zmienne i przypisuje im wartosci zamiast tworzyc argumenty i potem odwoluje sie przez @, ale to chyba nie jest tak jak manual przykazuje... a w samym manualu nie ma takiego przykladu... jest tylko jak wykonywac operacje na takich argumentach (ale nie widze przykladu z wykorzystaniem tych argumentow w zapytaniu do bazy)

jak ktos ma pojecie jak to zrobic, bylbym wdzieczny smile.gif

k.
mmmmmmm
Trzeba argument przekazać. SQL to nie PHP. Widzi tylko to co ma.
phoenix84
Cytat(mmmmmmm @ 2.10.2013, 19:35:50 ) *
Trzeba argument przekazać. SQL to nie PHP. Widzi tylko to co ma.


Może nie wyraziłem się dość jasno. Argument przekazać umiem, umiem nawet na nim wykonywać operacje (poza zapytaniem), ale nie wiem jak się do niego odwołać z zapytania (ktore jest w procedurze, bo zapytania poza procedurami w ogole nie maja argumentow smile.gif)

Najlepszy byłby przykład np. procedura, ktora zwroci mi sume wartosci z kolumny podanej jako argument w procedurze

dla uproszczenie nazwe argument po prostu argument

jesli wpisze: SELECT SUM(`argument`) to bedzie szukal kolumny o nazwie 'argument', a takiej nie ma
jesli wpisze: SELECT SUM('argument') to bedzie probowal zsumowac stringa
jesli wpisze: SELECT SUM(@argument) to bedzie sumowaj zmienna

a co mam wpisac by mi zsumowalo kolumne o nazwie przekazanej jako argument do procedury w ktorej jest to zapytanie

pozdrawiam,

k.
pmir13
Nie da się argumentu przekazać bezpośrednio do zapytania jako nazwy kolumny, tabeli itp. Tam mogą być tylko identyfikatory. Argumenty bezpośrednio do zapytania można wpisać tylko tam, gdzie normalnie byś wpisywał gotowe wartości. Sam fakt, że czegoś takiego potrzebujesz daje do myślenia nad strukturą bazy. Jeśli jednak koniecznie chcesz to zrobić to musisz pomóc sobie klejonym preparowanym zapytaniem:

  1. delimiter $
  2. DROP PROCEDURE IF EXISTS mojasuma$
  3. CREATE PROCEDURE mojasuma( IN kolumna CHAR(128) )
  4. BEGIN
  5. SET @prepared_sql =
  6. CONCAT( 'SELECT SUM(',
  7. kolumna,
  8. ') AS suma FROM produkty' );
  9. PREPARE stmt FROM @prepared_sql;
  10. EXECUTE stmt;
  11. DEALLOCATE PREPARE stmt;
  12. END$
  13. delimiter ;
  14.  
  15. CALL mojasuma( 'ilosc' );
  16. CALL mojasuma( 'cena*ilosc' );

phoenix84
Cytat(pmir13 @ 3.10.2013, 03:35:39 ) *
Nie da się argumentu przekazać bezpośrednio do zapytania jako nazwy kolumny, tabeli itp. Tam mogą być tylko identyfikatory. Argumenty bezpośrednio do zapytania można wpisać tylko tam, gdzie normalnie byś wpisywał gotowe wartości. Sam fakt, że czegoś takiego potrzebujesz daje do myślenia nad strukturą bazy. Jeśli jednak koniecznie chcesz to zrobić to musisz pomóc sobie klejonym preparowanym zapytaniem:

  1. delimiter $
  2. DROP PROCEDURE IF EXISTS mojasuma$
  3. CREATE PROCEDURE mojasuma( IN kolumna CHAR(128) )
  4. BEGIN
  5. SET @prepared_sql =
  6. CONCAT( 'SELECT SUM(',
  7. kolumna,
  8. ') AS suma FROM produkty' );
  9. PREPARE stmt FROM @prepared_sql;
  10. EXECUTE stmt;
  11. DEALLOCATE PREPARE stmt;
  12. END$
  13. delimiter ;
  14.  
  15. CALL mojasuma( 'ilosc' );
  16. CALL mojasuma( 'cena*ilosc' );



hmm, wyglada to dosc skomplikowanie... poczytam na temat elementow, ktorych nie znam... jak prepare, czy execute (nigdy tego nie uzywalem)... napisales, ze trzeba pomyslec nad struktura bazy... moze faktycznie ja zle do tego podchodze... jednak to co robie jest dosc nietypowe i problem rozwiazuje obecnie w php (co nie jest moze optymalne, ale w sql tego jeszcze nie umiem), chodzi o to, ze trzeba powyciagac wartosci z roznych widokow i to powywracanych na rozne strony w zaleznosci od parametrow i zaleznosci miedzy tym parametrami (np. czy dodatni czy ujemny, czy argumenty podano alfabetycznie czy nie itd), a robienie odpowiednich joinow w teorii by dzialalo, ale jak to napisalem to zajelo kilkadziesiat linii (pelno dlugich (bo precyzyjnych) aliasow i do tego gdzies wkradl sie bug i uznalem, ze albo musze sie nauczyc procedur, albo zrobie to w php... ze czas naglil, to zrobilem w php, ale procedur i tak sie chce nauczyc i wlasnie utknalem na tych argumentach w zapytaniach smile.gif

dzieki, bede to analizowal...

EDIT

jednak nie jest to az tak skomplikwane jak wygladalo na pierwszy rzut oka i da sie to ogarnac smile.gif

k.
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.