PDA

View Full Version : [SQL] Funzioni


holyfather
24-05-2011, 16:59
Salve,
volevo chiervi è possibile definire delle funzioni in SQL ( MySql) ad esempio ipotizziamo abbia banalmente un campo x in tab, io vorrei scrivere una funzione power che preso in ingresso x me ne faccia il quadrato

select power( x ) from tab;

( l'esempio con power è per semplicità , ovviamente mi serve per task più complicati)

E' possibile fare la cosa direttamente in SQL ??

grazie !

oNaSsIs
24-05-2011, 23:19
Certo che si. (http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html)

holyfather
25-05-2011, 08:08
Certo che si. (http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html)

Ok hai qualche link utile per cortesia visto che non riesco a trovarne ?

WarDuck
25-05-2011, 10:31
Ok hai qualche link utile per cortesia visto che non riesco a trovarne ?

Quello che ti ha postato E' UN LINK :D.

holyfather
25-05-2011, 11:33
Quello che ti ha postato E' UN LINK :D.

Lol se sono stordito :-) grazie :-) ora guardo

holyfather
25-05-2011, 14:21
Lol se sono stordito :-) grazie :-) ora guardo

Ho guardato , ho capito come funzionano ma non riesco ad adattarle al mio scopo :-(

Con questo ad esempio mi mette nella variabile globale x la conversione in inch del primo valore di lunghezza, come faccio a farlo per tutta la colonna ??
Anche riuscendo a iterare la cosa, poi non so dove salvare i valori di conversione !

CREATE PROCEDURE converti (OUT rx INT)
BEGIN
DECLARE x INT;
DECLARE sp1_cursor CURSOR FOR SELECT lunghezza FROM tab;
OPEN sp1_cursor;
FETCH sp1_cursor INTO x;
CLOSE sp1_cursor;
SET rx = x/2.2;
END |

Grazie per l'aiuto !

holyfather
25-05-2011, 16:02
Scusate mi sono dimenticato di diverlo comunque, ipotizziamo io abbia una tabella prova in cui vi è un campo lunghezza in cm.

Ora voglio convertire in inch con una store procedure;
Ho pensato quindi di fare una tabella conversione con un campo lunghezza dove andare ad inserire il valore convertito.

Nello specifico il codice sotto mi va in loop sul primo elemento T_T


create procedure conv()
begin declare finito int default 0;
declare x int;
declare curl cursor for select lunghezza from prova;
declare continue handler for sqlstate '02000'
set finito = 1;
open curl;
fetch curl into x;
ciclo: while not finito do
insert into conversione (lunghezza) values (x/2.2);
end while ciclo; end;|

holyfather
25-05-2011, 16:07
Ho risolto ! mancava il fetch interno per passare al record successivo !
Mi sono accorto che però io volevo fare una roba del tipo

select conv( lunghezza) from prova; Come posso fare ? Dovrei mettere il campo lunghezza e la tabella prova come variabili incognite per la procedura e poi
effettuare una chiamata call conv(lunghezza,prova), però non so come metterle in incognita .. qualcuno sa aiutarmi ?? grazie !




create procedure conv()
begin declare finito int default 0;
declare x int;
declare curl cursor for select lunghezza from prova;
declare continue handler for sqlstate '02000'
set finito = 1;
open curl;
fetch curl into x;
ciclo: while not finito do
insert into conversione (lunghezza) values (x/2.2);
fetch curl into x;
end while ciclo; end;|

oNaSsIs
25-05-2011, 23:09
Forse il Prepared Statement (http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html) fa al caso tuo.
Qui (http://dev.mysql.com/tech-resources/articles/mysql-storedproc.html) c'è anche un esempio su come potresti utilizzarlo.

SET @s := CONCAT('SELECT AVG(' , 'Population' , ') FROM ' , 'City');
SELECT @s;
+----------------------------------+
| @s |
+----------------------------------+
| SELECT AVG(Population) FROM City |
+----------------------------------+


PREPARE stmt FROM "SELECT AVG(Population) FROM City";
EXECUTE stmt;
+-----------------+
| AVG(Population) |
+-----------------+
| 350468.2236 |
+-----------------+

holyfather
27-05-2011, 11:25
Forse il Prepared Statement (http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html) fa al caso tuo.
Qui (http://dev.mysql.com/tech-resources/articles/mysql-storedproc.html) c'è anche un esempio su come potresti utilizzarlo.

SET @s := CONCAT('SELECT AVG(' , 'Population' , ') FROM ' , 'City');
SELECT @s;
+----------------------------------+
| @s |
+----------------------------------+
| SELECT AVG(Population) FROM City |
+----------------------------------+


PREPARE stmt FROM "SELECT AVG(Population) FROM City";
EXECUTE stmt;
+-----------------+
| AVG(Population) |
+-----------------+
| 350468.2236 |
+-----------------+


Bella ! grazie !