Mysql 遊標巢狀
最近又用需要用到遊標,做個筆記,直接上程式碼了
-- 建立儲存過程
delimiter //
create procedure company_attachment_cursor(in _type int)
begin
-- 申明區域性變數 declare
declare _company_id varchar(25);
declare targetId varchar(25);
declare num int;
DECLARE done int DEFAULT FALSE;
-- 申明遊標
declare cur1 CURSOR FOR select distinct company_id from company_attachment where type=_type;
-- 第二個遊標需使用第一個迴圈的變數_company_id,故將變數申明在最外層
declare cur2 CURSOR FOR select id from company_attachment where company_id=_company_id and type=_type;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
open cur1;
read_loop: LOOP
fetch cur1 into _company_id;
IF done THEN
LEAVE read_loop;
END IF;
-- 每次迴圈開始時重新對num進行賦值
set num = 0;
-- 開啟第二個遊標
open cur2;
inner_loop: LOOP
fetch cur2 into targetId;
-- 列印過程
-- select num;
IF done THEN
LEAVE inner_loop;
END IF;
update company_attachment set number=num where id=targetId;
set num=num+1;
END LOOP;
close cur2;
-- 第一個迴圈結束時done=1
-- 故需手動設定done=0,否則外層迴圈僅會執行一次
SET done = 0;
END LOOP;
close cur1;
end; //
語法上的幾個容易錯誤的地方。
- 在LOOP中使用declare申明,應當將declare全部申明在最外層
- HANDLER 只能申明一個
- 當內迴圈結束之後,應當將done設為0,以防止外層迴圈進入時直接會結束迴圈。
歡迎關注我的個人公眾號:逍遙的心。主推程式設計師寫的生活類文章,有興趣的朋友可以共同探討下:
相關推薦
Mysql 遊標巢狀
最近又用需要用到遊標,做個筆記,直接上程式碼了 -- 建立儲存過程 delimiter // create procedure company_attachment_cursor(in _type
mysql遊標巢狀迴圈例子
CREATE PROCEDURE finance_reciveDetail(customer_id varchar(20)) BEGIN DECLARE done INT DEFAULT 0; DECLARE id_a bigint; DECLARE pre_r
MySQL 儲存過程遊標巢狀,觸發器呼叫儲存過程
#儲存過程 drop procedure if exists update_pointer; CREATE PROCEDURE update_pointer(IN ckindId int) BEGIN #定義變數 DECLARE id int DEFAULT 0;
MySQL的巢狀查詢
定義我就不說了,子查詢就是內部的查詢,包含子查詢就是外部查詢!也就是說巢狀查詢一個是內部查詢一個是外部查詢,而且查詢是由內向外的。 提示一下:在group by和order by中的子查詢是沒有意義的! 子查詢的分類: 標量子查詢—返回單個值的查詢 列子查詢—返
oracle 在儲存過程中寫兩個遊標巢狀迴圈
CREATE OR REPLACE PROCEDURE "PROC_CHZBANKMOTNREC" AS vid NUMBER(19);--id vzdrpriaccount VARCHAR2(1
MySQL的巢狀事務實現
一、問題起源 在MySQL的官方文件中有明確的說明不支援巢狀事務: Transactions cannot be nested. This is a consequence of the implicit commit performed for any current transaction when
oracle 儲存過程 遊標巢狀
這是一段將裝置的GPS資料的工作小時數進行統計的儲存過程,首先通過遊標取出所有裝置資訊,然後對每一臺裝置進行工作小時數統計,其中用到了遊標巢狀 CREATE OR REPLACE PROCEDURE CMTOOLS.proc_statistics_workhour IS
mysql 刪除巢狀查詢的替代方式
mysql不支援刪除巢狀查詢。 比如如下語句: 想刪除一些髒資料 DELETE FROM merchandise WHERE merchandise_id NOT IN ( SELECT parent_id FROM merchandise WHE
SQL筆記--遊標/遊標巢狀
注意點: 1. While..Bgein之間不可以寫要執行的程式碼,否則會一直執行等待。要放在Begin..End內部。 2. IF ( @@error > 0 )事務執行錯誤判斷放在Begin…End語句塊中,因為Begin是Be
sqlserver遊標巢狀時@@FETCH_STATUS的值
declare 外層遊標 open 外層遊標 fetch next ...提取外層遊標行 while @@FETCH_STATUS = 0 begin declare 內層遊標 open 內層遊標 fetch next
mysql 巢狀遊標的使用
BEGIN DECLARE iEmail varchar(50);#引數iEmail的型別一定要和存入裡面的資料型別一致 DECLARE iUserId int; DECLARE NOTFOUND int DEFAULT 0; DECLARE mycursor
Mysql----遊標的巢狀迴圈
遊標的巢狀迴圈,下面列舉了3種巢狀迴圈(loop-loop,loop-while,loop-repeat).程式用到的表和資料 CREATE TABLE tb_dic_class ( class_id int(11) DEFAULT NULL, class_name
Mysql 聚合函式巢狀使用
目的:Mysql 聚合函式巢狀使用 聚合函式不可以直接巢狀使用,比如: max(count(*)) 但是可以巢狀子查詢使用 eg: 注:後面那個 as 必須要寫 select max(total) from ( select count(*) as to
MySQL子查詢 巢狀查詢
子查詢:巢狀在其他查詢中的查詢。 有三張表分別如下: customers: 儲存顧客資訊 orderitems:只儲存訂單資訊,無客戶資訊 orders:儲存訂單號和顧客id 注意:一般在子查詢中,程式先執行在巢狀在最內層的語句,再執行外層。因此在寫子查
MySQL update語句巢狀select語句同一張表
今天在更新一條記錄時,突然發現自己竟然連update時巢狀使用select都不會用。摸索著寫了一條,還報錯了。類似如下 CREATE TABLE t3( num1 SMALLINT, num2 S
MySQL查詢優化之巢狀連線
原文地址:https://dev.mysql.com/doc/refman/5.7/en/nested-join-optimization.html 譯文: 8.2.1.7巢狀連線優化 連線的語法允許巢狀連線。下面討論中涉及到的連線語法可以參考Section
MyBatis自身集合巢狀,遞迴查詢目錄樹(適用於MySQL、ORACLE等資料庫,遞迴程式碼都寫在XML中,通過SQL完成)
JAVA程式碼實現(連結):MySql、Oracle(通用方法)遞迴查詢生成檔案目錄樹(JAVA實現 遞迴過程中不訪問資料庫,遞迴之前只訪問兩次 進行遞迴前資料準備) 以下是XML中實現檔案樹的查詢、遞迴 場景:根據交易編碼,查詢檔案樹 檔案、資料夾都存放TRADER_
【MySQL系列--優化1】——巢狀join優化
表達連線的語法允許巢狀連線。以下討論參見第13.2.9.2節“join語法”中描述的連線語法。 與SQL標準相比,table_factor的語法被擴充套件。後者僅接受table_reference,而不是一對括號內的列表。如果我們將table_referenc
mysql case when多條件同時滿足的多個and組合巢狀的情況,判斷空is null --- 系列一
case when不支援下面2這種寫法(我已經測試過了,大俠如有好辦法,麻煩分享): 情況1:未加括號 select wf.fid id, CASE WHEN wf.Fstep = 1 AND wf.Fstatus = 'Reject' and wf.Fope
MySQL基礎(4)——子查詢(巢狀查詢)、聯結表、組合查詢
本篇主要整理查詢表、聯結表的相關內容。 一、子查詢 MySQL 4.1版本及以上支援子查詢 子查詢:巢狀在其他查詢中的查詢。 子查詢的作用: 1、進行過濾: 例項1:檢索訂購物品TNT2的所有客戶的ID = + 一般,在WHERE