parametros - procedimiento almacenado login mysql
MySQL crea sintaxis de procedimiento almacenado con delimitador (5)
Estoy intentando crear un procedimiento almacenado en MySQL usando un delimitador como este:
use am;
DELIMITER $$
CREATE PROCEDURE addfields()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE acc INT(16);
DECLARE validId INT DEFAULT 0;
END $$
DELIMITER ;
Me da un error:
#1304 - PROCEDURE addfields already exists
¿Cuál es la sintaxis correcta para hacer un procedimiento almacenado con un delimitador y soltarlo si existe primero?
Comenzar con la sintaxis del procedimiento almacenado en MySQL:
Los buenos programadores usan la terminal, la GUI te hace suave en el medio. Cuando te acostumbras y memorizas los comandos, es 5 veces más rápido que cualquier GUI. Productividad = éxito
1. Abra una terminal e inicie sesión en mysql de esta manera:
el@apollo:~$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or /g.
mysql>
2. Eche un vistazo para ver si tiene algún procedimiento:
mysql> show procedure status;
+-----------+---------------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+-----------+---------------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| yourdb | sp_user_login | PROCEDURE | root@% | 2013-12-06 14:10:25 | 2013-12-06 14:10:25 | DEFINER | | utf8 | utf8_general_ci | latin1_swedish_ci |
+-----------+---------------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
1 row in set (0.01 sec)
Tengo uno definido, probablemente no tengas ninguno para comenzar.
3. Cambie a la base de datos, elimínela.
mysql> use yourdb;
Database changed
mysql> drop procedure if exists sp_user_login;
Query OK, 0 rows affected (0.01 sec)
mysql> show procedure status;
Empty set (0.00 sec)
4. Ok, entonces ahora no tengo procedimientos almacenados definidos. Haz la más simple:
mysql> delimiter //
mysql> create procedure foobar()
-> begin select ''hello''; end//
Query OK, 0 rows affected (0.00 sec)
// se comunicará con el terminal cuando haya terminado de ingresar comandos para el procedimiento almacenado. el nombre del procedimiento almacenado es foobar. no requiere parámetros y debe devolver "hola".
5. Vea si está allí, recuerde retrasar su delimitador !:
mysql> show procedure status;
->
->
Gotcha! ¿Por qué esto no funcionó? ¿Estableces el delimitador en //
recordar? Establecer de nuevo a ;
6. Establezca el delimitador y observe el procedimiento:
mysql> delimiter ;
mysql> show procedure status;
+-----------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+-----------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| yourdb | foobar | PROCEDURE | root@localhost | 2013-12-06 14:27:23 | 2013-12-06 14:27:23 | DEFINER | | utf8 | utf8_general_ci | latin1_swedish_ci |
+-----------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)
7. Ejecutarlo:
mysql> call foobar();
+-------+
| hello |
+-------+
| hello |
+-------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Hola mundo completo, vamos a sobrescribirlo con algo mejor.
8. Suelte foobar, redefinirlo para aceptar un parámetro y volver a ejecutarlo:
mysql> drop procedure foobar;
Query OK, 0 rows affected (0.00 sec)
mysql> show procedure status;
Empty set (0.00 sec)
mysql> delimiter //
mysql> create procedure foobar (in var1 int)
-> begin select var1 + 2 as result;
-> end//
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> call foobar(5);
+--------+
| result |
+--------+
| 7 |
+--------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
¡Bonito! Hicimos un procedimiento que toma la entrada, la modifica y la produce. Ahora vamos a hacer una variable de salida.
9. Eliminar foobar, hacer una variable de salida, ejecutarlo:
mysql> delimiter ;
mysql> drop procedure foobar;
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter //
mysql> create procedure foobar(out var1 varchar(100))
-> begin set var1="kowalski, what''s the status of the nuclear reactor?";
-> end//
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> call foobar(@kowalski_status);
Query OK, 0 rows affected (0.00 sec)
mysql> select @kowalski_status;
+-----------------------------------------------------+
| @kowalski_status |
+-----------------------------------------------------+
| kowalski, what''s the status of the nuclear reactor? |
+-----------------------------------------------------+
1 row in set (0.00 sec)
10. Ejemplo de uso INOUT en MySQL:
mysql> select ''ricksays'' into @msg;
Query OK, 1 row affected (0.00 sec)
mysql> delimiter //
mysql> create procedure foobar (inout msg varchar(100))
-> begin
-> set msg = concat(@msg, " never gonna let you down");
-> end//
mysql> delimiter ;
mysql> call foobar(@msg);
Query OK, 0 rows affected (0.00 sec)
mysql> select @msg;
+-----------------------------------+
| @msg |
+-----------------------------------+
| ricksays never gonna let you down |
+-----------------------------------+
1 row in set (0.00 sec)
Ok, funcionó, se unió a las cuerdas. Entonces usted definió un mensaje variable, pasado en esa variable en un procedimiento almacenado llamado foobar, y @msg fue escrito por foobar.
Ahora sabe cómo hacer procedimientos almacenados con delimitadores. Continúe con este tutorial aquí, comience con las variables dentro de los procedimientos almacenados: http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/
Aquí está la muestra de MYSQL Stored Procedure con delimitador y cómo llamar ...
DELIMITER $$
DROP PROCEDURE IF EXISTS `sp_user_login` $$
CREATE DEFINER=`root`@`%` PROCEDURE `sp_user_login`(
IN loc_username VARCHAR(255),
IN loc_password VARCHAR(255)
)
BEGIN
SELECT user_id,
user_name,
user_emailid,
user_profileimage,
last_update
FROM tbl_user
WHERE user_name = loc_username
AND password = loc_password
AND status = 1;
END $$
DELIMITER ;
y llamada por, especificación mysql_connection y
$loginCheck="call sp_user_login(''".$username."'',''".$password."'');";
devolverá el resultado del procedimiento.
Aquí está mi código para crear el procedimiento en MySQL:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `procedureName`(IN comId int)
BEGIN
select * from tableName
(add joins OR sub query as per your requirement)
Where (where condition here)
END $$
DELIMITER ;
Para llamar a este procedimiento, use esta consulta:
call procedureName(); // without parameter
call procedureName(id,pid); // with parameter
Detalle:
1) DEFINER: root es el nombre de usuario y cámbielo según su nombre de usuario de mysql. Localhost es el host. Puede cambiarlo con la dirección IP del servidor si ejecuta esta consulta en el servidor de hosting.
Lea aquí para más detalles
Crear sintaxis de procedimiento en mysql: -
DELIMITER //
CREAR PROCEDIMIENTO user_rank
(IN group_id int)
BEGIN SET @total_like: = 0, @rank: = 0, @ rnk: = 0; select * from (seleccione IF (@total_like = total_like, @rank: = @ rank, @rank: = @ rank + 1) rank, @rnk: = @ rnk + 1 como rank_offset, @total_like: = total_like como total_likes, user_id , user_name, thumb from (SELECCIONAR like_count como total_like, like_counts.user_id, user_name, thumb from like_counts join interno class_grades ON (class_grades.user_id = like_counts.user_id) inner join class_groups ON (class_groups.class_id = user_grades.grade_id y class_groups.class_group_id = group_id) donde role_id = ''8'' y like_counts.status = ''1'' y country_code = ''+ 91'' group por like_counts.user_id orden por total_like desc LIMIT 10 OFFSET 0) r) t, (SELECT @total_like: = 0, @ rango: = 0, @rnk: = 0) s;
END // DELIMITER;
He creado un procedimiento simple de MySQL como se indica a continuación:
DELIMITER //
CREATE PROCEDURE GetAllListings()
BEGIN
SELECT nid, type, title FROM node where type = ''lms_listing'' order by nid desc;
END //
DELIMITER;
Amablemente sigue esto. Después del procedimiento creado, puede ver lo mismo y ejecutarlo.