MySQL criar a sintaxe do procedimento armazenado com o delimitador

estou a tentar criar um procedimento armazenado no MySQL usando um 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 ;
Dá-me um erro.
#1304 - PROCEDURE addfields already exists

Qual é a sintaxe adequada para fazer um procedimento armazenado com um delimitador e largá-lo se ele existir primeiro?

Author: Eric Leschinski, 2013-04-03

5 answers

Aqui está a amostra o procedimento de armazenamento de MYSQL com delimitador e como chamar..

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 ;

E ligue por, mysql_connection specification e

$loginCheck="call sp_user_login('".$username."','".$password."');";

Devolverá o resultado do procedimento.

 50
Author: MKV, 2013-04-03 11:53:02

Começar com a sintaxe do procedimento armazenado no MySQL:

Os bons programadores usam o terminal, a interface gráfica está a tornar-te mole no meio. Quando você se acostumar com isso e memorizar os comandos, é 5 vezes mais rápido do que qualquer interface gráfica. Produtividade = sucesso.

1. Abrir um terminal e autenticar-se no mysql desta forma:

el@apollo:~$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
mysql> 

2. Dê uma olhada para ver se você tem algum procedimento:

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)
Tenho uma definida, provavelmente não tens nenhuma. comecar.

3. Muda para a base de dados, apaga-a.

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 então agora eu não tenho procedimentos armazenados definidos. Faça o mais simples:

mysql> delimiter //
mysql> create procedure foobar()
    -> begin select 'hello'; end//
Query OK, 0 rows affected (0.00 sec)

O / / irá comunicar-se com o terminal quando terminar de introduzir comandos para o procedimento armazenado. o nome do procedimento armazenado é foobar. não é preciso parâmetros e deve retornar "Olá".

5. Vê se está lá, lembra-te de voltar atrás. delimitador!:

 mysql> show procedure status;
 -> 
 -> 
Apanhei-te! Porque é que isto não resultou? Você colocou o delimitador para // se lembrar? Volta a pô-lo ;

6. Retroceder o separador e olhar para o procedimento:

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. Corre.:

mysql> call foobar();
+-------+
| hello |
+-------+
| hello |
+-------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Olá mundo completo, vamos sobrepô-lo com algo melhor.

8. Drop foobar, redefine-o para aceitar um parâmetro, e executá-lo novamente:

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)
Boa! Nós fizemos um procedimento que recebe entrada, modifica-o, e faz a saída. Agora vamos fazer uma variável de saída.

9. Remover a barra de rodapé, criar uma variável de saída, executá-la:

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. Exemplo de Utilização INOUT no 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, funcionou, uniu as cordas. Então você definiu uma variável msg, passou nessa variável para o procedimento armazenado chamado foobar, e o @msg foi escrito por foobar. Agora sabes fazer procedimentos armazenados com delimitadores. Continuar este tutorial aqui, comece em variáveis dentro dos procedimentos armazenados: http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/
 62
Author: Eric Leschinski, 2013-12-06 21:06:20
Aqui está o meu código para criar procedimentos em 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 chamar este procedimento use esta consulta:

call procedureName(); // without parameter
call procedureName(id,pid); // with parameter

Pormenor:

1) DEFINER: root é o nome do utilizador e alterá-lo de acordo com o seu nome de utilizador do mysql localhost é a máquina que você pode alterar com o endereço ip do servidor se você estiver a executar esta pesquisa no servidor de hospedagem.

Leia aqui para mais detalhes

 2
Author: Sunny S.M, 2017-04-10 15:33:44

Criei um simples procedimento MySQL como se indica abaixo:

DELIMITER //
CREATE PROCEDURE GetAllListings()
 BEGIN
 SELECT nid, type, title  FROM node where type = 'lms_listing' order by nid desc;
END //
DELIMITER;
Por favor, siga isto. Após o procedimento criado, você pode ver o mesmo e executá-lo.
 0
Author: Md Jamiruddin, 2018-07-19 11:58:41

Criar a sintaxe do procedimento no mysql: -

DELIMITER //

CREATE  PROCEDURE `user_rank`(IN group_id int)

 BEGIN
    SET @total_like:=0, @rank:=0,@rnk :=0;
    select * from (select IF(@total_like = total_like, @rank:=@rank, @rank:=@rank + 1) rank, @rnk:=@rnk + 1 as rank_offset, @total_like:=total_like as total_likes, user_id, user_name, thumb from (SELECT like_count as total_like, like_counts.user_id,  user_name, thumb from like_counts inner join class_grades ON (class_grades.user_id = like_counts.user_id) inner join class_groups ON (class_groups.class_id = user_grades.grade_id and class_groups.class_group_id = group_id ) where role_id = '8' and like_counts.status = '1' and country_code ='+91' group by like_counts.user_id order by total_like desc LIMIT 10 OFFSET 0) r) t, (SELECT @total_like:=0, @rank:=0, @rnk:=0) s;

  END //
 DELIMITER ;
 -1
Author: satyandera, 2018-09-27 14:36:09