Funkcja w MySQL
Kolarz - 27-01-2006 10:47
Funkcja w MySQL
Witam! Mam problem z uruchomieniem jednej z moich funkcji pod MySQL 5.0.18.
Tworze w nastepujacy sposob:
CREATE FUNCTION `wolny_id`(tab VARCHAR(40)) RETURNS INT BEGIN DECLARE ost INT; SELECT MAX(id) INTO ost FROM tab; RETURN (ost+1); END
Przy wywolaniu:
SELECT wolny_id('tabela1')
Otrzymuje komunikat:
"Table tab doesn't exist!"
Z gory dziekuje za pomoc!
Lukasz
Noel - 27-01-2006 10:47
Użytkownik Kolarz napisał:
> Witam! > Mam problem z uruchomieniem jednej z moich funkcji pod MySQL 5.0.18. > > Tworze w nastepujacy sposob: > > CREATE FUNCTION `wolny_id`(tab VARCHAR(40)) RETURNS INT > BEGIN > DECLARE ost INT; > SELECT MAX(id) INTO ost FROM tab; > RETURN (ost+1); > END > > > Przy wywolaniu: > > SELECT wolny_id('tabela1') > > > Otrzymuje komunikat: > > "Table tab doesn't exist!" > > Z gory dziekuje za pomoc! >
A czego nie rozumiesz? Komunikatu, czy tego, że trudno z literału wyciągnąć MAX()?
Poszukaj czegoś o dynamicznym SQL.
-- Tomek "Noel" B.
Kolarz - 27-01-2006 10:47
Noel napisał(a): > Użytkownik Kolarz napisał: > >> Witam! >> Mam problem z uruchomieniem jednej z moich funkcji pod MySQL 5.0.18. >> >> Tworze w nastepujacy sposob: >> >> CREATE FUNCTION `wolny_id`(tab VARCHAR(40)) RETURNS INT >> BEGIN >> DECLARE ost INT; >> SELECT MAX(id) INTO ost FROM tab; >> RETURN (ost+1); >> END >> >> >> Przy wywolaniu: >> >> SELECT wolny_id('tabela1') >> >> >> Otrzymuje komunikat: >> >> "Table tab doesn't exist!" >> >> Z gory dziekuje za pomoc! >> > > A czego nie rozumiesz? Komunikatu, czy tego, że trudno z literału > wyciągnąć MAX()? > > Poszukaj czegoś o dynamicznym SQL. > >
Nie rozumiem tego, ze nie zamienia 'tab' na 'tabela1'
KatMPB - 27-01-2006 10:47
Spróbuj użyć parametru in przed tab VARCHAR(40),
może to pomożę, ale nic nie gwarantuję.
Poz,
KatMPB
> Noel napisał(a): > > Użytkownik Kolarz napisał: > > > >> Witam! > >> Mam problem z uruchomieniem jednej z moich funkcji pod MySQL 5.0.18. > >> > >> Tworze w nastepujacy sposob: > >> > >> * * CREATE FUNCTION `wolny_id`(in tab VARCHAR(40)) RETURNS INT > >> * * BEGIN > >> * * * * *DECLARE ost INT; > >> * * * * *SELECT MAX(id) INTO ost FROM tab; > >> * * RETURN (ost+1); > >> * * END > >> > >> > >> Przy wywolaniu: > >> > >> * * SELECT wolny_id('tabela1') > >> > >> > >> Otrzymuje komunikat: > >> > >> * * "Table tab doesn't exist!" > >> > >> Z gory dziekuje za pomoc! > >> > > > > A czego nie rozumiesz? Komunikatu, czy tego, że trudno z literału > > wyciągnąć MAX()? > > > > Poszukaj czegoś o dynamicznym SQL. > > > > > > Nie rozumiem tego, ze nie zamienia 'tab' na 'tabela1' >
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Kolarz - 27-01-2006 10:48
KatMPB napisał(a): > Spróbuj użyć parametru in przed tab VARCHAR(40), > > może to pomożę, ale nic nie gwarantuję. > > Poz, > > KatMPB > >> Noel napisał(a): >>> Użytkownik Kolarz napisał: >>> >>>> Witam! >>>> Mam problem z uruchomieniem jednej z moich funkcji pod MySQL 5.0.18. >>>> >>>> Tworze w nastepujacy sposob: >>>> >>>> CREATE FUNCTION `wolny_id`(in tab VARCHAR(40)) RETURNS INT >>>> BEGIN >>>> DECLARE ost INT; >>>> SELECT MAX(id) INTO ost FROM tab; >>>> RETURN (ost+1); >>>> END >>>> >>>> >>>> Przy wywolaniu: >>>> >>>> SELECT wolny_id('tabela1') >>>> >>>> >>>> Otrzymuje komunikat: >>>> >>>> "Table tab doesn't exist!" >>>> >>>> Z gory dziekuje za pomoc! >>>> >>> A czego nie rozumiesz? Komunikatu, czy tego, że trudno z literału >>> wyciągnąć MAX()? >>> >>> Poszukaj czegoś o dynamicznym SQL. >>> >>> >> Nie rozumiem tego, ze nie zamienia 'tab' na 'tabela1' >> > >
Nic nie dalo... Komunikat: Something is wrong in your syntax obok 'IN tab VARCHAR(40)' w linii 1 Error no. 1064
Marek Horodyski - 27-01-2006 10:48
Użytkownik "Kolarz" <velodrome@o2.pl> napisał w wiadomości news:draorj$642$1@nemesis.news.tpi.pl... > Noel napisał(a): >> Użytkownik Kolarz napisał: >> >>> Witam! >>> Mam problem z uruchomieniem jednej z moich funkcji pod MySQL 5.0.18. >>> >>> Tworze w nastepujacy sposob: >>> >>> CREATE FUNCTION `wolny_id`(tab VARCHAR(40)) RETURNS INT >>> BEGIN >>> DECLARE ost INT; >>> SELECT MAX(id) INTO ost FROM tab; >>> RETURN (ost+1); >>> END >>> >>> >>> Przy wywolaniu: >>> >>> SELECT wolny_id('tabela1') >>> >>> >>> Otrzymuje komunikat: >>> >>> "Table tab doesn't exist!" >>> >>> Z gory dziekuje za pomoc! >>> >> >> A czego nie rozumiesz? Komunikatu, czy tego, że trudno z literału >> wyciągnąć MAX()? >> >> Poszukaj czegoś o dynamicznym SQL. >> >> > > Nie rozumiem tego, ze nie zamienia 'tab' na 'tabela1' >
Nie znam MySqla, ale kombinowalbym z :
SELECT MAX(id) INTO ost FROM tab||'';
lub SELECT MAX(id) INTO ost FROM %tab%;
Ale nie wiem czy w frazie FROM jest to dopuszczalne.
Marek Horodyski
Artur Muszynski - 30-01-2006 10:31
> SELECT MAX(id) INTO ost FROM %tab%;
Wasza odporność na wiedzę jest godna podziwu. Przeczytajcie ze zrozumieniem odpowiedź Noela i przestańcie tworzyć.
artur
Slawomir Cichy - 30-01-2006 10:31
Kolarz wrote: > Witam! > Mam problem z uruchomieniem jednej z moich funkcji pod MySQL 5.0.18. > > Tworze w nastepujacy sposob: > > CREATE FUNCTION `wolny_id`(tab VARCHAR(40)) RETURNS INT > BEGIN > DECLARE ost INT; > SELECT MAX(id) INTO ost FROM tab; > RETURN (ost+1); > END > > > Przy wywolaniu: > > SELECT wolny_id('tabela1') > > > Otrzymuje komunikat: > > "Table tab doesn't exist!" > > Z gory dziekuje za pomoc! > > Lukasz
Tak jak napisal Noel - w tym przypadku musialbys uzyc dynamicznego sql'a Niestety (w MySQL'u) gromadzenie dynamicznych sql'i nie jest mozliwe w skladowanych funkcjach, poza tym funkcja EXECUTE nie ma skladni INTO. Twoja funkcja powinna wygladac tak:
CREATE FUNCTION `wolny_id`(tab varchar(20)) RETURNS INT BEGIN SET @ost = 1; SET @zsql = CONCAT('SELECT MAX(id) FROM ',tab); PREPARE STMT FROM @zsql; EXECUTE STMT INTO @ost; ^^^^^^^^^^ tego nie ma w MySQL'u DEALLOCATE PREPARE STMT; RETURN @ost + 1; END;
A jak probowalem zrobic cos takiego bez klauzuli INTO to otrzymalem komunikat: mysql> CREATE FUNCTION `wid_max`(tab varchar(20)) RETURNS INT -> BEGIN -> SET @ost = 1; -> SET @zsql = CONCAT('SELECT MAX(birthyear) FROM ',tab); -> PREPARE STMT FROM @zsql; -> EXECUTE STMT; -> DEALLOCATE PREPARE STMT; -> RETURN @ost; -> END; -> // ERROR 1336 (0A000): Dynamic SQL is not allowed in stored function or trigger
Zrob to w procedurze tak: mysql> delimiter // mysql> CREATE PROCEDURE `wid_max`(IN tab varchar(20)) -> BEGIN -> SET @zsql = CONCAT('SELECT MAX(birthyear) FROM ',tab); -> PREPARE STMT FROM @zsql; -> EXECUTE STMT; -> DEALLOCATE PREPARE STMT; -> END; -> // Query OK, 0 rows affected (0.01 sec)
mysql> call wid_max('users'); -> // +----------------+ | MAX(birthyear) | +----------------+ | 5579 | +----------------+ 1 row in set (0.02 sec)
Query OK, 0 rows affected (0.02 sec)
i to dziala...
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[mysql] =?ISO-8859-2?Q?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
[MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
zanotowane.pldoc.pisz.plpdf.pisz.plmisida.pev.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|