本文目錄一覽:
- 1、求mysql的游標用法詳細說明,最好有例子!!
- 2、mysql自定義函數,找到答案必結貼
- 3、mysql自定義函數怎麼寫?
- 4、MySQL 游標的定義與使用
- 5、在MySQL中的自定義函數怎麼返回字符串,寫一些簡單的例子,多謝了
- 6、Mysql 游標示例
求mysql的游標用法詳細說明,最好有例子!!
先聲明一個游標,語法:
DECLARE v_1 VARCHAR(16);
DECLARE v_2 VARCHAR(16);
DECLARE c_XXX CURSOR FOR
SELECT c_1, c_2
FROM t_1;
同時聲明一個布爾型的變量FOUND,當循環的條件不成立時,結束循環用的。
DECLARE FOUND BOOLEAN DEFAULT TRUE;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET FOUND = FALSE;
在使用游標的時候,要先打開游標,語法:OPEN c_XXX;
使用的時候,要先打開游標,取出第一條數據,語法: FETCH c_XXX INTO v_1, v_2;
然後才開始執行循環,語法:WHILE FOUND DO
執行需要執行的語句;
取下一條數據放到當前游標中,FETCH c_XXX INTO v_1, v_2;
結束循環,語法:END WHILE;
結束游標,語法:CLOSE c_cargo。有什麼問題我們再溝通啊。不知道你具體要問題的是什麼。
mysql自定義函數,找到答案必結貼
創建臨時表,在函數中寫INSERT語句寫LOG到臨時表,慢慢調試,何處卡死了~
或者找可以直接DEBUG函數的工具~
mysql自定義函數怎麼寫?
mysql CREATE FUNCTION HelloWorld4()
– RETURNS VARCHAR(20)
– BEGIN
– RETURN ‘Hello World!’;
– END;
– //
Query OK, 0 rows affected (0.00 sec)
mysql select HelloWorld4() //
+—————+
| HelloWorld4() |
+—————+
| Hello World! |
+—————+
1 row in set (0.00 sec) …展開mysql CREATE FUNCTION HelloWorld4()
– RETURNS VARCHAR(20)
– BEGIN
– RETURN ‘Hello World!’;
– END;
– //
Query OK, 0 rows affected (0.00 sec)
mysql select HelloWorld4() //
+—————+
| HelloWorld4() |
+—————+
| Hello World! |
+—————+
1 row in set (0.00 sec)
MySQL 游標的定義與使用
從字面可以這麼理解什麼是游標,游標就像是水面上漂浮的一個標記,這個標記可以來回遊動,一會游到這裡一會游到那裡,這裡的河水可以理解為是數據的集合,這個標記就是在這些數據間來回遊動。
為什麼 MySQL 會有游標這個概念,由於 SQL 語言是面向集合的語句,它每次查詢出來都是一堆數據的集合,沒有辦法對其中一條記錄進行單獨的處理。如果要對每條記錄進行單獨處理就需要游標。
游標其實就像是編程語言中的 for/foreach 循環,把一個數組(數據的集合)中每條數據一條一條地循環出來,然後你在 for/foreach 循環中使用判斷語句對你感興趣的數據進行處理。
哪裡可以使用游標呢,函數,存儲過程,觸發器中都可以使用。
說完概念,就來看下游標的固定寫法。不管概念是否理解,記住下面的固定模式也可以完成搬磚任務。
1、聲明游標
SELECT 語句就是正常的查詢語句,例如:SELECT id,age FROM table;
2、打開游標
在打開游標之前,游標定義的 SQL 語句是不執行的。
3、取出記錄
將當前的記錄數據存入變量。
當 FETCH 沒有找到記錄時會拋出異常,異常的定義需要下面的 HANDLER FOR 語句。
聲明游標語句中的 SELECT 如果有多個字段,INTO 後面需要多個變量進行接收。
4、設置結束條件
這個語句的作用是指定一個條件,告訴程序所有數據已經循環完畢,可以結束了。由於游標是使用 WHILE 循環進行每條數據的讀取,就需要給 WHILE 一個結束條件。
處理種類:可以是, EXIT 立即結束。CONTINUE 繼續下面的處理。
異常的類型:一般指定為 NOT FOUND ,意思是沒有找到任何數據。
異常發生時的處理:當異常發生時需要做的事情,這裡一般改變一個變量的值來記錄異常已經發生了,如如 SET flat = 1 詳細用法查看下面的例子。
5、關閉游標
實戰代碼:
完畢,看懂沒,如果沒看懂沒關係,游標處理是一套固定的格式,按照上面例子中固定的格式套入到你的程序就可以了。
在MySQL中的自定義函數怎麼返回字符串,寫一些簡單的例子,多謝了
create function funname()
return varchar(20)
begin
return ‘abc‘;
end
Mysql 游標示例
CREATE PROCEDURE `gk_test`()
COMMENT ‘測試數據’ — 函數注釋
BEGIN
DECLARE done INT DEFAULT FALSE; — 定義遍曆數據結束標誌。非游標變量,需要定義在游標變量前
DECLARE m_id CHAR(32); — 定義接收游標數據中id變量
DECLARE m_or VARCHAR(255); — 定義接收游標數據中orderno變量
DECLARE m_c INT(11); — 定義接收游標數據中count變量
DECLARE m_soult CURSOR FOR SELECT `id`, `orderno`, count(*) t FROM hb_shipper_order GROUP BY orderno HAVING t 1; — 定義游標變量,即接收查詢結果集
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; — 將結束標誌綁定到游標
OPEN m_soult; — 打開游標
read_loop:LOOP — 開始循環。這個是mysql 3種循環中的1種。
FETCH m_soult INTO m_id,m_or,m_c; — 提取游標數據
IF done THEN — 判斷,當為true時
LEAVE read_loop; — 跳出循環
END IF;
— 處理事 自己想處理的事
UPDATE `hb_shipper_waybill` SET
ordernos = REPLACE (`ordernos`, m_or, CONCAT(m_or,’-2′)),
goodsname = REPLACE (`goodsname`, m_or, CONCAT(m_or,’-2′))
WHERE `id` IN ( SELECT `waybillid` FROM `hb_shipper_order_waybill_relation` WHERE orderid = m_id);
UPDATE `hb_shipper_order` SET orderno = CONCAT(m_or,’-2′) WHERE id = m_id;
END LOOP; — 結束循環
— 關閉游標
CLOSE m_soult;
END
上圖:
DEMO: 2 // 通過 存儲過程,處理 copy 數據並處理對應數據關係
delimiter $$
DROP PROCEDURE IF EXISTS gk;
CREATE DEFINER = PROCEDURE `gk`(IN pname varchar(255))
COMMENT ‘測試’
BEGIN
DECLARE new_id CHAR(32);
DECLARE m_id CHAR(32);
DECLARE new_noids VARCHAR(255);
DECLARE done INT DEFAULT 0;
DECLARE m_result CURSOR FOR select id from `xxx`;
DECLARE m_result2 CURSOR FOR select id from `xxx`;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
DROP TABLE IF EXISTS `xxx`;
CREATE TABLE `xxx` (
`id` char(32) NOT NULL COMMENT ‘ID’,
`subsystem` char(32) NOT NULL COMMENT ”,
`name` varchar(20) NOT NULL COMMENT ”,
`type` varchar(15) NOT NULL COMMENT ”,
`url` varchar(200) DEFAULT NULL COMMENT ”,
`icon` varchar(20) DEFAULT NULL COMMENT ”,
`target` varchar(10) NOT NULL DEFAULT ‘_self’ COMMENT ”,
`method` mediumtext COMMENT ”,
`orderby` smallint(3) NOT NULL DEFAULT ‘0’ COMMENT ”,
`parentid` char(32) NOT NULL DEFAULT ‘0’ COMMENT ”,
`relateid` char(32) NOT NULL COMMENT ”,
`isopen` tinyint(1) NOT NULL DEFAULT ‘1’ COMMENT ”,
`nodeids` varchar(255) DEFAULT NULL COMMENT ”,
`nodenum` smallint(3) NOT NULL DEFAULT ‘0’ COMMENT ”,
`createtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ”,
`createuser` char(32) NOT NULL DEFAULT ‘0’ COMMENT ”,
`updatetime` timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’ COMMENT ”,
`udateuser` char(32) NOT NULL DEFAULT ‘0’ COMMENT ”,
`deleted` tinyint(1) DEFAULT ‘0’ COMMENT ”,
`status` tinyint(1) NOT NULL DEFAULT ‘0’ COMMENT ”,
`isdefault` tinyint(1) unsigned NOT NULL DEFAULT ‘0’ COMMENT ”,
`isdisable` tinyint(1) unsigned NOT NULL DEFAULT ‘0’ COMMENT ”,
`projecttype` varchar(255) NOT NULL COMMENT ”,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
INSERT INTO `xxxx` SELECT * FROM `aaa` WHERE `projecttype` = ‘T’;
UPDATE `xxx` SET `projecttype` = pname;
OPEN m_result;
REPEAT
FETCH m_result INTO m_id;
SET new_id = UPPER(REPLACE(UUID(),’-‘,”));
UPDATE `xxx` SET `id` = new_id WHERE `id` = m_id;
UPDATE `xxx` SET `parentid` = new_id WHERE `parentid` = m_id;
UNTIL done END REPEAT;
CLOSE m_result;
SET done = 0;
OPEN m_result2;
REPEAT
FETCH m_result2 INTO m_id;
SELECT CONCAT(‘,’, GROUP_CONCAT(`id`)) INTO new_noids FROM `xxx` WHERE `parentid` = m_id;
UPDATE `xxx` SET `nodeids` = new_noids WHERE `id` = m_id;
UNTIL done END REPEAT;
CLOSE m_result2;
INSERT INTO `aaa` SELECT * FROM `xxx`;
DROP TABLE IF EXISTS xxx;
END $$
delimiter ;
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/306339.html