1. 程式人生 > >mysql儲存過程迴圈遍歷sql結果集,並執行動態sql

mysql儲存過程迴圈遍歷sql結果集,並執行動態sql

/*
將其他幾張表資料複製到一張總表中
*/
DROP PROCEDURE IF EXISTS sp_customer;  
CREATE PROCEDURE sp_customer()  
BEGIN
-- 需要執行的SQL語句
	DECLARE v_sql_1 VARCHAR(500);
	DECLARE v_sql_2 VARCHAR(500);
	DECLARE v_sql_3 VARCHAR(500);
	-- 定義變數
	DECLARE companyId INT; 
	DECLARE maxId1 INT; 
	DECLARE maxId2 INT; 
	-- 定義遊標遍歷時,作為判斷是否遍歷完全部記錄的標記
	DECLARE num INT DEFAULT 0;
	-- 定義遊標,並將sql結果集賦值到遊標中
	DECLARE company_list CURSOR FOR SELECT company_id,max_id FROM customer_job WHERE id>1;
	-- 聲明當遊標遍歷完全部記錄後將標誌變數置成某個值
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET num=1;
    
    -- DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET num = 1;  
	-- 開啟遊標
	OPEN company_list; 
		-- 將遊標中的值賦值給變數,要注意sql結果列的順序
		FETCH company_list INTO companyId,maxId1; 
		-- while迴圈
		WHILE num <> 1 DO
			-- 動態拼接sql並賦值v_sql_1
			SET v_sql_1 = CONCAT('select max(id) into @param1 from customer',companyId);
			-- 需要用@轉換下,直接v_sql_1執行不了
			SET @sql_1 = v_sql_1;
			-- 預處理需要執行的動態SQL,其中stmt是一個變數
			PREPARE stmt1 FROM @sql_1;  
			-- 執行SQL語句
			EXECUTE stmt1;   
			-- 釋放掉預處理段   
			DEALLOCATE PREPARE stmt1;     
			-- @param1賦值給maxId2
			SET maxId2 = @param1;
			
			-- 動態拼接sql並賦值v_sql_2
			SET v_sql_2 = CONCAT('insert into customer(name,sex,age,card_id,phone,email,addr,company,group,tag,stage,phone_state,loan_type,loan_amount,company_id,data_from) ',
								' select name,sex,age,card_id,phone,email,addr,company,group,tag,stage,phone_state,loan_type,loan_amount,company_id,data_from from customer',companyId,
								' where id>',maxId1,' and id<=',maxId2);
			SET @sql_2 = v_sql_2;
			-- 預處理需要執行的動態SQL,其中stmt是一個變數
			PREPARE stmt2 FROM @sql_2;  
			-- 執行SQL語句
			EXECUTE stmt2;   
			-- 釋放掉預處理段   
			DEALLOCATE PREPARE stmt2;     
			
			-- 動態拼接sql並賦值v_sql_3
			SET v_sql_3 = CONCAT('update customer_job set update_num=update_num,max_id=',maxId2,' where company_id=',companyId);
			SET @sql_3 = v_sql_3;
			-- 預處理需要執行的動態SQL,其中stmt是一個變數
			PREPARE stmt3 FROM @sql_3;  
			-- 執行SQL語句
			EXECUTE stmt3;   
			-- 釋放掉預處理段   
			DEALLOCATE PREPARE stmt3;     
			
			-- 將遊標中的值賦值給變數,要注意sql結果列的順序
			FETCH company_list INTO companyId; 
		END WHILE;
	-- 關閉遊標
	CLOSE company_list;
END; 

相關推薦

mysql儲存過程迴圈sql結果執行動態sql

/* 將其他幾張表資料複製到一張總表中 */ DROP PROCEDURE IF EXISTS sp_customer; CREATE PROCEDURE sp_customer() BEGIN -- 需要執行的SQL語句 DECLARE v_sql_1 VARCH

MySQL 儲存過程迴圈

WHILE, REPEAT, LOOP在MYSQL裡都是用來作為定型文抽出而使用的,都是利用迴圈方式提取資料。在這三種方法中,WHILE是在迴圈的初回處理開始之前進行條件判斷,REPEAT是在迴圈結束時進行判斷,而LOOP不具備判斷功能。這三種功能的使用一定要在MySQL5.

MYSQL儲存過程迴圈插入資料

本示例通過 while...end while 迴圈控制遊標來實現插入表記錄。 DROP PROCEDURE IF exists pro_initCategoryForTradingEntity; create procedure pro_initCategoryForTr

儲存過程呼叫 返回結果

//java呼叫儲存過程 使用遊標遍歷結果集 public void getCallableStatement(){ CallableStatement cs=null; Connection

mysql儲存過程迴圈查詢結果

-- 建立儲存過程之前需判斷該儲存過程是否已存在,若存在則刪除 DROP PROCEDURE IF EXISTS init_reportUrl; -- 建立儲存過程 CREATE PROCEDURE init_reportUrl() BEGIN -- 定義變數 DECLARE s int

mysql儲存過程遊標之while篇

最近業務需要翻閱了很多關於遊標遍歷使用的帖子 總結一下 直接上程式碼吧 IN `bindid_in` char(36) --輸入引數 BEGIN /** 淨值=固定資產原值-累計折舊 累計折舊=月折舊額*已計提月份 月折舊額=(固定資產原價-(固定資產原價*3%的殘值率))/預計使

查詢結果update數據

cas code view sed closed clas alt upd begin 1 set rowcount 0 2 select NULL mykey, * into #mytemp from dbo.DIM_DISTRIBUTOR 3 4 s

mysql儲存過程迴圈 while/repeat/loop

先把語句結束符設定成// mysql> DELIMITER // while 條件 do … end while mysql> create procedure proce_while() -> begin -> de

mybaties呼叫mysql儲存過程儲存過程返回多個select結果

先看需求,直接上圖 從圖中看出,需要12條普通的SELECT語句,所以就放到儲存過程中 儲存過程如下: DROP PROCEDURE IF EXISTS proc_report; DELIMITER $ CREATE PROCEDURE proc_report( OUT d_norma

mysql儲存過程迴圈事務插入資料

DROP PROCEDURE IF EXISTS insertTUserStatement; create procedure insertTUserStatement(IN num int) begin declare i int; start transac

MYSQL儲存過程迴圈CURSOR(遊標)使用

遊標概述 概括來說,遊標是一種臨時的資料庫物件,即用來存放一個表中所有資訊或者表中的一部分資料資訊(副本)。遊標也可以用來指向資料的某一行,可以充當資料庫中的行指標。 最常見用途就是儲存查詢結果,便於後面使用,遊標中的結果集都是有select語句產生的(臨時的資料庫物件)。

mysql儲存過程迴圈修改每一條資料

DELIMITER $$ USE `health`$$ DROP PROCEDURE IF EXISTS `repairDiseaseData`$$ CREATE DEFINER=`root`@`%` PROCEDURE `repairDiseaseData`() BEGI

mysql儲存過程和計劃任務【叢集下計劃任務的執行控制】

DROP PROCEDURE IF EXISTS `p_test_cluster`; DELIMITER ;; CREATE  PROCEDURE `p_test_cluster`() BEGIN     DECLARE iState INTEGER DEFAULT 0;

迴圈相同名class限制文字字數多餘的文字以省略號顯示

<script>    $(function(){         var $arr=$('.word_count');         for(v

ResultSet結果的列資訊

現在的SSH開發框架非常流行,使得大家都有點忘記了JDBC的用法。筆者在工作中剛好遇到一個場景,由於對效能有較高要求,並且儘可能採用輕量級的技術方案,最終選擇了最原始的JDBC技術。 在功能模組開發的過程中,由於SQL是動態生成的,在獲取結果集後要通過遍歷Re

Java獲取儲存過程返回的多個結果

第一步:寫你的儲存過程  delimiter //  create procedure test_proc ()  begin      select * from test_table1 where id=1;      select * from test_table

在彈框中獲取foreach中的id值傳遞給地址欄(方法2)

ges 應該 我們 png 地址欄 each 獲取 賦值 有時 1.php有時候我們需要再彈框中獲取foreach中遍歷的數據(例如id),在彈框中點擊按鈕並傳遞給地址欄跳轉。那麽應該怎麽做呢。第二種方法。 2. 可以在彈框中給出一個input hidden 點擊按鈕彈窗時

C++日誌log目錄提取資料進行分析

1 前言   我們經常在編寫軟體的時候,需要載入log檔案來記錄程式執行過程中可能會出現的bug,或者記錄一些重要的執行資訊。一旦一個目錄下生成很多log檔案後,實際上我們管理與分析還是需要費一些時間

mysql儲存過程查詢結果迴圈 判斷 賦值 遊標等基本操作

一、首先說下本篇部落格所實現功能的背景和功能是怎樣的:       背景:因為公司專案開始遷移新平臺專案,所以以前的平臺老資料以及訂單資訊需要拆分表,而且需要業務邏輯來分析以前的訂單表,來拆分成另外的幾個新表,包括增加新的流水分析,以及更新其他使用者或者商家的餘額以及對賬

mysql儲存過程+遊標迴圈 判斷 賦值 等例項一

CREATE DEFINER=`admin`@`%` PROCEDURE `updateRecommended`() BEGIN DECLARE my_recommended INT; DECLARE my_id INT; DECLARE inviteRelationStr VARCHAR(10000)