當前位置:首頁 » 服務存儲 » mysql存儲過程坑
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

mysql存儲過程坑

發布時間: 2023-04-05 10:02:59

『壹』 mysql 存儲過程提示錯誤!!求高人解答

用過begin——end句塊的應該都接觸過declare。

declare是用來定義變數和常用處理、聲明之類的關鍵字。在mysql存儲過程出現之前declare是一塊雞肋,大家常用declare來定義局部變數,我習慣性的還是使用set來定義變數(雖然是全局的,但是來的方便)。
存儲過程出現後declare的標准處理定義就變成了非常強大的工具,可以用來為存儲過程添加一些非常強大的錯誤處理機制。
首先需要提一點的是declare定義變數如果想定義varchar型的,必須註明參數最大長度,即declare varchar(20).
在這里我們不深究它用來定義參數的小細節
我們主要來研究DECLARE Condition 和 DECLARE Handler
DECLARE Condition 和 DECLARE Handler可以說是為了處理錯誤而生的。
功能上講DECLARE Condition出現的時間比較早,功能也比較簡單,它可以通過錯誤編號或者SQLSTATE來觸發一各名字,說明白一點就是當某個錯誤編號出現的時候替換一個名字給它。這樣調用的時候,我們不用去記一大串錯誤編號了。
它的標准語法我們可以在mysql的附註中找到。

DECLARE condition_name CONDITION FOR condition_value
condition_value:

例子如下:
DECLARE errname CONDITION FOR SQLSTATE '23000'
將返回SQLSTATE信息為23000的錯誤定名為errname

這個名字就可以被我們的絕對重頭戲DECLARE Handler調用了,在DECLARE Handler中可以定義錯誤的處理辦法,可以使用begin和end來標記語句塊,可以單獨使用rollback。處理的過程也可以定義為繼續執行和中斷存儲過程。
標准語法:
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement

handler_type: 處理的過程。
CONTINUE 繼續執行未完成的存儲過程,直至結束。(常用,默認)
| EXIT 出現錯誤即自動跳出所在的begin不再執行後面的語句。
| UNDO 氣死我了,不支持為什麼寫在這里,害我測試了好久都是語法錯誤。

condition_value: 處理的觸發條件
SQLSTATE [VALUE] sqlstate_value 不用說了,最常用的錯誤定義,自己去查錯誤列表吧。
| condition_name 我們剛剛定義的那個名字errnmae就是用在這里的。
| SQLWARNING 這個太好用了,從錯誤編號01開始的錯誤。相當於錯誤的通配符。
| NOT FOUND 和上面差不多,從02開始。
| SQLEXCEPTION 上面兩個中沒有包括的錯誤它都可以用來觸發,就是說你想定義只要出錯就觸發的話就定義出錯條件為SQLWARNING+SQLEXCEPTION。
| mysql_error_code 錯誤編號,和第一個不一樣,不過同樣可以在錯誤列表從中查到,是我比較常用的。

例子
DECLARE errname CONDITION FOR SQLSTATE '23000'; 給導致錯誤23000的錯誤定義名字為errname
DECLARE continue handler for errname 當errname發生時作下面的處理
BEGIN 語句開始
set @x=1; 設置@x=1
select @x; 輸出x
END; 結束出錯處理。

『貳』 mysql存儲過程的小問題,無法運行

CREATE PROCEDURE p7 (IN b INTEGER(12))
begin
declare a INTEGER(12);
set a=5;
INSERT INTO t VALUES (a);
SELECT s1*a FROM t WHERE b<=s1;
end
這一段可以執行游御的- -~~~難道沒有BEGIN 沒有END么- -,這段代碼凱中你用不了?
哦......你難道是在命令行裡面創建存儲過程!!!?神孫岩
那這樣不行,我從來沒在命令行裡面試過,有很多軟體可以用啊,而且沒軟體也可以寫SQL腳本,然後直接執行啊,在命令行裡面創建不是很方便。
命令行下創建這個存儲過程:
delimiter //
CREATE PROCEDURE p7 (IN b INTEGER(12))
begin
declare a INTEGER(12);
set a=5;
INSERT INTO t VALUES (a);
SELECT s1*a FROM t WHERE b<=s1;
end;
//
剛剛在命令行下創建成功了的

不過推薦使用EMS FOR MYSQL,DREAMCODE FOR MYSQL,PHPMYADMIN或者使用官方的MYSQL圖形化工具

你的問題1在於沒有傳參數,就上上面這段代碼,要是把參數去掉還是會報錯,MYSQL好像不允許執行不傳參數的存儲過程,但是你也可以隨便聲明一個,因為你可以把b定義在存儲過程內,參數不使用就是了,比如:
CREATE PROCEDURE p7 (IN X INTEGER(12))
begin
declare a INTEGER(12);
declare b integer(12);
set a=5;
set b=5;
INSERT INTO t VALUES (a);
SELECT s1*a FROM t WHERE b<=s1;
end
然後call p7(12);但是參數X並不影響你的存儲過程,但是必須傳一個。
問題2,你沒有聲明a,b,變數必須聲明- -
問題3,我是從5.0開始用MYSQL的,所以我不太清楚以前MYSQL變數的表現形式,但是在存儲過程內,declare a char(4);聲明一個變數a,我要用它的時候,set a='abcd';就行了,不用帶@
還是上面的代碼
我把insert into t values(a) 改為@a,那就插入的是空值
最後end 後面沒有分號,最後一個END後面沒分號,中間的有分號的比如

CREATE PROCEDURE p7 (IN X INTEGER(12))
begin
declare a INTEGER(12);
declare b integer(12);
set a=5;
set b=5;
if(a=b)
then
begin
INSERT INTO t VALUES (a);
SELECT s1*a FROM t WHERE b<=s1;
end;
else
INSERT INTO t VALUES (b);
SELECT s1*a FROM t WHERE a<=s1;
end;
end if;
end

最後一個end 沒分號,中間有

『叄』 mysql 存儲過程總結(一)

1、存儲過程定義:

存儲過程是事先經過編譯並存儲在資料庫中的一段 SQL 語句的集合,調用存儲過程可以簡化應用開發 人員的很多工作,減少數據在資料庫和應用伺服器之間的傳輸,對於提高數據處理的效率是有好處的。 存儲過程思想上很簡單,就是資料庫 SQL 語言層面的代碼封裝與重用。

2、特點:

封裝,復用 : 可以把某一業務SQL封裝在存儲過程中,需要用到 的時候直接調用即可。

可以接收參數,也可以返回數據 :再存儲過程中,可以傳遞參數,也可以接收返回 值。

減少網路交互,效率提升 : 如果涉及到多條SQL,每執行一次都是一次網路傳 輸。 而如果封裝在存儲過程中,我們只需要網路交互一次可能就可以了。

3、基本語法

(1)創建:

(2)調用:

(3)查看:

(4)刪除

注意: 在命令行中,執行創建存儲過程的SQL時,需要通過關鍵字 delimiter 指定SQL語句的 結束符。

『肆』 MYSQL 的存儲過程總是錯.新手問題.求解答

先照著網上寫一個簡單的沒有什麼功能的存儲過程,這個存儲過程沒有問題再慢慢往裡加入需要的功能,每次修改存儲過程需要重新編譯,通過調用查看存儲過程的功能是否達到你想的效果,這樣不容易出差錯。需要注意的是存儲過程中delimiter $的位置,有時候$有空格之類的沒有注意容易照成存儲過程結束的位置不對而報錯

『伍』 mysql存儲過程為什麼不推薦使用

維護不方便,對資料庫壓力不較大,不易於資料庫集群的擴展和遷移。
能夠在業務系統層面做的邏輯盡量不要用存儲過程來做。
以後做資料庫的遷移的時候,換了資料庫,存儲過程可能要重寫或重構。但是如果放在業務代碼層去實現對應的邏輯,資料庫換了之後,更改對應的連接驅動,業務代碼不用做任何吸怪。