mysql游標和自定義函數實例(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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-02 12:00
下一篇 2025-01-02 12:00

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字符串操作中,capitalize函數常常被用到,這個函數可以使字符串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • 單片機打印函數

    單片機打印是指通過串口或並口將一些數據打印到終端設備上。在單片機應用中,打印非常重要。正確的打印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的打印數據可以幫助我們快速…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • Python函數名稱相同參數不同:多態

    Python是一門面向對象的編程語言,它強烈支持多態性 一、什麼是多態多態是面向對象三大特性中的一種,它指的是:相同的函數名稱可以有不同的實現方式。也就是說,不同的對象調用同名方法…

    編程 2025-04-29
  • 分段函數Python

    本文將從以下幾個方面詳細闡述Python中的分段函數,包括函數基本定義、調用示例、圖像繪製、函數優化和應用實例。 一、函數基本定義 分段函數又稱為條件函數,指一條直線段或曲線段,由…

    編程 2025-04-29

發表回復

登錄後才能評論