eug*_*ied 36 mysql sql stored-procedures
我试图在MySQL中使用这样的分隔符创建一个存储过程:
use am;
DELIMITER $$
CREATE PROCEDURE addfields()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE acc INT(16);
DECLARE validId INT DEFAULT 0;
END $$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
它给了我一个错误:
#1304 - PROCEDURE addfields already exists
Run Code Online (Sandbox Code Playgroud)
使用分隔符创建存储过程并在首先存在时删除它的正确语法是什么?
Eri*_*ski 69
优秀的程序员使用终端,GUI让你在中间变得柔软.当你习惯它并记住命令时,它比任何GUI快5倍.生产力=成功.
1.打开终端并登录mysql,如下所示:
el@apollo:~$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql>
Run Code Online (Sandbox Code Playgroud)
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 | 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)
Run Code Online (Sandbox Code Playgroud)
我有一个定义,你可能没有开始.
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)
Run Code Online (Sandbox Code Playgroud)
好的,现在我没有定义存储过程.做最简单的一个:
mysql> delimiter //
mysql> create procedure foobar()
-> begin select 'hello'; end//
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
完成输入存储过程的命令后,//将与终端通信.存储过程名称为foobar.它不需要参数,应该返回"你好".
5.看看它是否在那里,记得放回你的分隔符!:
mysql> show procedure status;
->
->
Run Code Online (Sandbox Code Playgroud)
疑难杂症!为什么这不起作用?你设置分隔符要//记住吗?把它重新设置为;
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 | 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)
Run Code Online (Sandbox Code Playgroud)
7.运行它:
mysql> call foobar();
+-------+
| hello |
+-------+
| hello |
+-------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
你好世界完整,让我们用更好的东西覆盖它.
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)
Run Code Online (Sandbox Code Playgroud)
太好了!我们制作了一个接受输入,修改它并输出的过程.现在让我们做一个变量.
9.删除foobar,创建一个变量,运行它:
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)
Run Code Online (Sandbox Code Playgroud)
10. MySQL中INOUT使用示例:
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)
Run Code Online (Sandbox Code Playgroud)
好吧它工作,它加入了一起.因此,您定义了一个变量msg,将该变量传递给名为foobar的存储过程,并且@msg由foobar写入.
现在您知道如何使用分隔符创建存储过程.继续本教程,从存储过程中的变量开始:http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/
小智 55
以下是带分隔符的示例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 ;
Run Code Online (Sandbox Code Playgroud)
并调用,mysql_connection规范和
$loginCheck="call sp_user_login('".$username."','".$password."');";
Run Code Online (Sandbox Code Playgroud)
它将返回程序的结果.