linux系統下沒法建立mysql存儲過程問題

建立存儲過程的完整命令: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中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 ;

相關文章
相關標籤/搜索