it-swarm.com.ru

MySQL создает синтаксис хранимой процедуры с разделителем

Я пытаюсь создать хранимую процедуру в MySQL, используя такой разделитель:

use am;

DELIMITER $$

CREATE PROCEDURE addfields()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE acc INT(16);
  DECLARE validId INT DEFAULT 0;

END $$

DELIMITER ;

Это дает мне ошибку:

#1304 - PROCEDURE addfields already exists

Каков правильный синтаксис для создания хранимой процедуры с разделителем и удаления ее, если она существует первой?

36
yevgeniy mordovkin

Вот пример хранимая процедура MYSQL с разделителем и как вызывать ..

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 ;

и вызов, спецификация mysql_connection и

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

он вернет результат из процедуры.

51
MKV

Начало работы с синтаксисом хранимых процедур в MySQL:

Хорошие программисты используют терминал, графический интерфейс делает вас мягкими в середине. Когда вы привыкнете к нему и запомните команды, это будет в 5 раз быстрее, чем любой графический интерфейс. Производительность = успех.

1. Откройте терминал и войдите в mysql следующим образом:

[email protected]:~$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
mysql> 

2. Посмотрите, есть ли у вас какие-либо процедуры:

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 | [email protected]%  | 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)

У меня есть одно определение, у вас, вероятно, нет ничего, чтобы начать.

3. Перейдите в базу данных, удалите ее. 

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, так что теперь у меня нет определенных хранимых процедур. Сделай самый простой:

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

// будет связываться с терминалом, когда вы закончите вводить команды для хранимой процедуры. имя хранимой процедуры - foobar. он не принимает никаких параметров и должен вернуть «привет».

5. Посмотрите, если это там, не забудьте установить разделитель !:

 mysql> show procedure status;
 -> 
 -> 

Попался! Почему это не сработало? Вы установили разделитель // помните? Установите его обратно на ;

6. Установите разделитель обратно и посмотрите на процедуру:

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 | [email protected] | 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. Запустите его:

mysql> call foobar();
+-------+
| hello |
+-------+
| hello |
+-------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

Привет, мир завершен, давайте перепишем его чем-нибудь получше.

8. Удалите foobar, переопределите его, чтобы принять параметр, и повторите его:

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)

Ницца! Мы создали процедуру, которая принимает ввод, модифицирует его и выводит. Теперь давайте сделаем переменную out.

9. Удалите foobar, создайте переменную out, запустите ее:

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. Пример использования INOUT в 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)

Хорошо, это сработало, оно соединило струны. Итак, вы определили переменную msg, передали эту переменную в хранимую процедуру с именем foobar, и @msg был записан в foobar. 

Теперь вы знаете, как создавать хранимые процедуры с разделителями. Продолжите этот урок здесь, начните с переменных внутри хранимых процедур: http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/

65
Eric Leschinski

Вот мой код для создания процедуры в 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 ;

Для вызова этой процедуры используйте этот запрос:

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

Деталь:

1) DEFINER: root - это имя пользователя, и измените его в соответствии с вашим именем пользователя. Mysql localhost - это хост, вы можете изменить его по ip-адресу сервера, если вы выполняете этот запрос на хост-сервере.

Читайте здесь для более подробной информации

2
Sunny S.M

Я создал простую процедуру MySQL, как указано ниже:

DELIMITER //
CREATE PROCEDURE GetAllListings()
 BEGIN
 SELECT nid, type, title  FROM node where type = 'lms_listing' order by nid desc;
END //
DELIMITER;

Пожалуйста, следуйте этому. После создания процедуры вы можете увидеть то же самое и выполнить ее. 

0
Md Jamiruddin