當前位置:首頁 » 存儲配置 » 存儲過程leave

存儲過程leave

發布時間: 2023-05-19 19:27:21

1. mysql里的存儲過程是怎樣循環的

declare storeId varchar(10);
在存儲過程中創建游標,這個游標裡面存了你所有要循環的數據,集合:
declare diy_cursor cursor for
select store_id from t_b_store;

open diy_cursor;--打開游標
diy_loop:loop ---這里開始循環
FETCH diy_cursor into storeId; --提取本次循環的數據,保存在storeId中
if done = 1 then --done是在存儲過程開始的時候定義的一個整形變數
leave diy_loop;---如果游標中的數據提取完畢,就自動跳出這個循環end if;
----在這里用你循環取到的storeId做你想做的事情,就是寫你的sql啦---
end loop; --循環結束
close diy_loop; --關閉游標

2. mssql 存儲過程中循環如何寫,在循環中用什麼語句跳出循環呢,在線等

給你個例子:

for loop是這樣的:
createprocere pro
begin
declare aintdefault1;
label1: loop
if a<6then
selecta;
seta=a+1;
iterate label1;
endif;
leave label1;跳出循環
endloop label1;
end

while是這樣的:
createprocere pro
begin
declare aintdefault4;
while a<10 do
selecta;
seta=a+1;
endwhile;
end

3. mysql 存儲過程

.關於MySQL的存儲過程

存儲過程是資料庫存儲的一個重要的功能,但是MySQL在5.0以前並不支持存儲過程,這使得MySQL在應用上大打折扣。好在MySQL 5.0終於開始已經支持存儲過程,這樣即可以大大提高資料庫的處理速度,同時也可以提高資料庫編程的靈活性。

MySQL存儲過程的創建

(1).格式

MySQL存儲過程創建的格式:CREATE PROCEDURE過程名([過程參數[,...]])
[特性...]過程體

這里先舉個例子:

  • mysql>DELIMITER//

  • mysql>CREATEPROCEDUREproc1(OUTsint)

  • ->BEGIN

  • ->SELECTCOUNT(*)INTOsFROMuser;

  • ->END

  • ->//

  • mysql>DELIMITER;


  • 註:
  • (1)這里需要注意的是DELIMITER //和DELIMITER ;兩句,DELIMITER是分割符的意思,因為MySQL默認以";"為分隔符,如果我們沒有聲明分割符,那麼編譯器會把存儲過程當成SQL語句進行處理,則存儲過程的編譯過程會報錯,所以要事先用DELIMITER關鍵字申明當前段分隔符,這樣MySQL才會將";"當做存儲過程中的代碼,不會執行這些代碼,用完了之後要把分隔符還原。

    (2)存儲過程根據需要可能會有輸入、輸出、輸入輸出參數,這里有一個輸出參數s,類型是int型,如果有多個參數用","分割開。

    (3)過程體的開始與結束使用BEGIN與END進行標識。

4. 五、MYSQL存儲過程和函數

• create procere用來創建 存儲過程 ,create function用來創建 函數

Delimiter命令是改變語句的結束符 ,MySQL默認的結束符為;號,由於procere和function中的;號並不代表創建的結束,所以要替換成另外的結束符以便表示創建的結束
• rontine_body子句可以包含一個簡單的SQL語句,也可以包含多個SQL語句, 通過begin…end將這多個SQL語句 包含在一起
• MySQL存儲過程和函數中也可以包含類似create和drop等DDL語句
• comment子句用來寫入對存儲過程和函數的注釋
Language子句用來表示此存儲過程和函數的創建語言
存儲過程和函數被標注為deterministic表明當輸入相同的參數是會返回相同的結果,反之如果是not deterministic則表示相同參數不會是相同結果,默認是not deterministic

相關屬性短語只有咨詢含義,並不是強制性的約束

• Drop procere/function語句用來 刪除指定名稱的存儲過程或函數

• Begin…end語句通常出現在存儲過程、函數和觸發器中,其中 可以包含一個或多個語句 ,每個語句用;號隔開

• 標簽label可以加在begin…end語句以及loop, repeat和while語句
語句中通過iterate和leave來控制流程,iterate表示返回指定標簽位置,leave表示跳出標簽

Declare語句通常用來聲明本地變數、游標、條件或者handler
Declare語句只允許出現在begin … end語句中而且必須出現在第一行
Declare的順序也有要求,通常是先聲明本地變數,再是游標,然後是條件和handler

• 本地變數可以通過declare語句進行聲明
聲明後的變數可以通過select … into var_list進行賦值,或者通過set語句賦值,或者通過定義游標並使用fetch … into var_list賦值
• 通過declare聲明變數方法:

• MySQL支持if,case,iterate,leave,loop,while,repeat語句作為存儲過程和函數中的 流程式控制制語句 ,另外return語句也是函數中的特定流程式控制制語句

• Case語句在存儲過程或函數中表明了 復雜的條件選擇語句

• IF語句在存儲過程或函數中表明了 基礎的條件選擇語句

其中在 function 裡面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我們開啟了 bin-log, 我們就必須為我們的 function 指定一個參數。
在 MySQL 中創建函數時出現這種錯誤的解決方法:
set global log_bin_trust_function_creators=TRUE;

• Iterate語句 僅出現在loop,repeat,while循環語句中,其含義表示重新開始此循環

• Leave語句表明 退出指定標簽的流程式控制制語句塊
• 通常會用在begin…end,以及loop,repeat,while的循環語句中

• Loop語句是存儲過程或函數中表達 循環執行 的一種方式

• repeat語句是存儲過程或函數中表達 循環執行 的一種方式

• while語句是存儲過程或函數中表達 循環執行 的一種方式

• Return語句用在 函數中,用來終結函數的執行並將指定值返回給調用者

• Cursor游標用來 聲明一個數據集
• 游標的聲明必須在變數和條件聲明之後,在handler聲明之前

• Cursor close語句用來 關閉之前打開的游標

• Cursor declare語句用來聲明一個游標和指定游標對應的數據集合, 通常數據集合是一個select語句

• Cursor fetch語句用來獲取游標指定數據集的 下一行數據 並將各個欄位值賦予後面的變數

• Open cursor語句用來打開一個之前已經 聲明好的游標

• Declare condition語句命名 特定的錯誤條件 ,而該特定錯誤可以在declare…handler中指定 處理方法

• 比如在MySQL中1051error code表示的是unknown table的錯誤,如果要對這
個錯誤做特殊處理,可以用三種方法:

• Declare handler語句用來聲明一個handler來處理一個或多個特殊條件,當其中的某個條件滿足時則觸發其中的statement語句執行
• Statement可以是一個簡單SQL語句,也可以是begin…end組成的多個語句

• Handler_action子句聲明當執行完statement語句之後應該怎麼辦

Condition_value的值有以下幾種:

• 當condition發生但沒有聲明handler時,則存儲過程和函數依照如下規則處理

• create trigger語句用來創建一個觸發器,觸發器的作用是當表上有對應SQL語句發生時,則觸發執行
• 觸發器創建時需要 指定對應的表名 tbl_name

Definer關鍵詞用來指定trigger的安全環境
• Trigger_time指定觸發器的執行時間,BEFORE和AFTER指定觸發器在表中的 每行數據修改前或者後 執行
• Trigger_event指定觸發該觸發器的具體 事件
• INSERT當新的一行數據插入表中時觸發,比如通過執行insert,load data,replace語句插入新數據
• UPDATE當表的一行數據被修改時觸發,比如執行update語句時
• DELETE當表的一行數據被刪除時觸發,比如執行delete,replace語句時
• 當執行insert into … on plicate key update語句時,當碰到重復行執行update時,則觸發update下的觸發器
• 從5.7.2版本開始,可以創建具有相同trigger_time和trigger_event的同一個表上的多個觸發器,默認情況下按照創建的時間依次執行,通過 指定FOLLOWS/PRECEDES改變執行順序 ,即FOLLOWS時表示新創建的觸發器後執行,PRECEDES則表示新觸發器先執行
• Trigger_body表示觸發器觸發之後要執行的一個或多個語句,在內部可以引用涉及表的欄位, OLD.col_name表示行數據被修改或刪除之前的欄位數據,NEW.col_name表示行數據被插入或修改之後的欄位數據

• Drop trigger語句用來 刪除一個觸發器

• If exists短語用來避免刪除不存在的觸發器時引發報錯
當你執行drop table時,表上的觸發器也被drop掉了

5. sql存儲過程語言

create procere Leave_add
@employee VARCHAR(50),
@submmittime datetime,
@begintime datetime,
@endtime datetime,
@checkerid varchar(50),
@hours int,
@reason varchar(100),
@typeid varchar(50)
as
begin
insert into Leave values(@employee,@submmittime,@begintime,@endtime,@checkerid,@hours,@reason,@typeid )
end

根據你實際資料庫螞譽欄位以及欄位類型稍作修改,然後把參數傳遞過來早物拆就可陸棗以添加到表Leave里了

6. mysql存儲過程中iterate對while起不起效果

在MySQL存儲過程的語句中有三個標準的循環方式:WHILE循環,LOOP循環以及REPEAT循環。還有一種非標準的循環方式:GOTO,不過這種循環方式最好別用,很容易引起程序的混亂,在這里就不錯具體介紹了。
這幾個循環語句的格式如下:
WHILE……DO……END WHILE
REPEAT……UNTIL END REPEAT
LOOP……END LOOP
GOTO。

下面首先使用第一種循環編寫一個例子。
mysql> create procere pro10()
-> begin
-> declare i int;
-> set i=0;
-> while i<5 do
-> insert into t1(filed) values(i);
-> set i=i+1;
-> end while;
-> end;//
Query OK, 0 rows affected (0.00 sec)
在這個例子中,INSERT和SET語句在WHILE和END WHILE之間,當變數i大於等於5的時候就退出循環。使用set i=0;語句是為了防止一個常見的錯誤,如果沒有初始化,i默認變數值為NULL,而NULL和任何值操作的結果都是NULL。
執行一下這個存儲過程並產看一下執行結果:
mysql> delete from t1//
Query OK, 0 rows affected (0.00 sec)
mysql> call pro10()//
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1//
+——-+
| filed |
+——-+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
+——-+
5 rows in set (0.00 sec)
以上就是執行結果,有5行數據插入到資料庫中,證明存儲過程編寫正確無誤^_^。
再來看一下第二個循環控制指令 REPEAT……END REPEAT。使用REPEAT循環控制語句編寫下面這個存儲過程:
mysql> create procere pro11()
-> begin
-> declare i int default 0;
-> repeat
-> insert into t1(filed) values(i);
-> set i=i+1;
-> until i>=5
-> end repeat;
-> end;//
Query OK, 0 rows affected (0.00 sec)
這個REPEAT循環的功能和前面WHILE循環一樣,區別在於它的執行後檢查是否滿足循環條件(until i>=5),而WHILE則是執行前檢查(while i<5 do)。
不過要注意until i>=5後面不要加分號,如果加分號,就是提示語法錯誤。
編寫完成後,調用一下這個存儲過程,並查看結果:
mysql> delete from t1//
Query OK, 5 rows affected (0.00 sec)
mysql> call pro11()//
Query OK, 1 row affected (0.00 sec) #雖然在這里顯示只有一行數據受到影響,但是下面選擇數據的話,還是插入了5行數據。
mysql> select * from t1//
+——-+
| filed |
+——-+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
+——-+
5 rows in set (0.00 sec)
一行就是執行結果,實際的作用和使用while編寫的存儲過程一樣,都是插入5行數據。
再來看一下第三個循環控制語句LOOP……END LOOP。編寫一個存儲過程程序如下:
mysql> create procere pro12()
-> begin
-> declare i int default 0;
-> loop_label: loop

-> insert into t1(filed) values(i);
-> set i=i+1;
-> if i>=5 then
-> leave loop_label;
-> end if;
-> end loop;
-> end;//
Query OK, 0 rows affected (0.00 sec)
從上面這個例子可以看出,使用LOOP編寫同樣的循環控制語句要比使用while和repeat編寫的要復雜一些:在循環內部加入了IF……END IF語句,在IF語句中又加入了LEAVE語句,LEAVE語句的意思是離開循環,LEAVE的格式是:LEAVE 循環標號。
編寫完存儲過程程序後,來執行並查看一下運行結果:
mysql> delete from t1//
Query OK, 5 rows affected (0.00 sec)

熱點內容
UE4源碼編譯要多久 發布:2025-02-08 07:52:50 瀏覽:230
java架構師做什麼 發布:2025-02-08 07:38:32 瀏覽:774
java解碼器 發布:2025-02-08 07:25:35 瀏覽:297
p4忘記密碼了如何刷機 發布:2025-02-08 07:25:25 瀏覽:307
java分隔 發布:2025-02-08 07:15:02 瀏覽:813
源碼乘法豎式 發布:2025-02-08 07:05:48 瀏覽:137
天天酷跑腳本腳本精靈 發布:2025-02-08 07:05:15 瀏覽:346
ios資料庫遷移 發布:2025-02-08 07:00:16 瀏覽:852
安卓sdl是什麼 發布:2025-02-08 07:00:05 瀏覽:909
離線腳本怎麼寫 發布:2025-02-08 06:59:22 瀏覽:833