建立存儲過程的完整命令:html
CREATE PROCEDURE pro1()mysql
beginsql
declare b int default 0;spa
end;命令行
mysql中運行存儲過程建立語句錯誤結果:server
root@db1>CREATE PROCEDUREpro1()htm
-> beginblog
-> declare b int default 0;get
ERROR 1064 (42000): You havean error in your SQL syntax; check the manual that corresponds to your MySQLserver version for the right syntax to use near '' at line 3it
root@db1>end;
mysql 默認把分號作爲命令執行的結束標識符號。在建立存儲過程命令中當碰見declare b int default 0;語句中的分號時,mysql解釋器當即執行declare b int default 0;及其以前的語句,因此報語法錯誤。
咱們可使用delimiter命令來改變mysql 命令執行結束符。
root@db1>delimiter $
root@db1>CREATE PROCEDUREpro1()
-> begin
-> declare b int default 0;
-> end;
-> $
Query OK, 0 rows affected(0.00 sec)
root@db1>delimiter ;
這個命令與存儲過程沒什麼關係吧。
其實就是告訴mysql解釋器,該段命令是否已經結束了,mysql是否能夠執行了。
默認狀況下,delimiter是分號;。在命令行客戶端中,若是有一行命令以分號結束,
那麼回車後,mysql將會執行該命令。如輸入下面的語句
mysql> select * from test_table;
而後回車,那麼MySQL將當即執行該語句。
但有時候,不但願MySQL這麼作。在爲可能輸入較多的語句,且語句中包含有分號。
如試圖在命令行客戶端中輸入以下語句
mysql> CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT)
mysql> RETURNS varchar(255)
mysql> BEGIN
mysql> IF ISNULL(S) THEN
mysql> RETURN '';
mysql> ELSEIF N<15 THEN
mysql> RETURN LEFT(S, N);
mysql> ELSE
mysql> IF CHAR_LENGTH(S) <=N THEN
mysql> RETURN S;
mysql> ELSE
mysql> RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5));
mysql> END IF;
mysql> END IF;
mysql> END;
默認狀況下,不可能等到用戶把這些語句所有輸入完以後,再執行整段語句。
由於mysql一遇到分號,它就要自動執行。
即,在語句RETURN '';時,mysql解釋器就要執行了。
這種狀況下,就須要事先把delimiter換成其它符號,如//或$$。
mysql> delimiter //
mysql> CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT)
mysql> RETURNS varchar(255)
mysql> BEGIN
mysql> IF ISNULL(S) THEN
mysql> RETURN '';
mysql> ELSEIF N<15 THEN
mysql> RETURN LEFT(S, N);
mysql> ELSE
mysql> IF CHAR_LENGTH(S) <=N THEN
mysql> RETURN S;
mysql> ELSE
mysql> RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5));
mysql> END IF;
mysql> END IF;
mysql> END;//
這樣只有當//出現以後,mysql解釋器纔會執行這段語句
例子:
mysql> delimiter //
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
-> BEGIN
-> SELECT COUNT(*) INTO param1 FROM t;
-> END;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> CALL simpleproc(@a);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @a;
+------+
| @a |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
執行完成後 要還原 ,執行 delimiter ;