1. 程式人生 > >Mysql 遊標巢狀

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; //

語法上的幾個容易錯誤的地方。

  1. 在LOOP中使用declare申明,應當將declare全部申明在最外層
  2. HANDLER 只能申明一個
  3. 當內迴圈結束之後,應當將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