ďťż
 
Funkcja w MySQL ďťż
 
Funkcja w MySQL
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • misida.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com