存储过程 游标

贸易区审查计划存储过程

悲剧,游标速度很慢,执行了7秒,还是使用子表比较好

 

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go




ALTER PROCEDURE [dbo].[tradezone_review_plan]
AS
    BEGIN
        DECLARE db CURSOR FOR
            SELECT
                A.ROW_ID,
                A.BRAND               
            FROM T_NWP_TRADEZONE_INFO A
        OPEN db
        DECLARE @row_id NVARCHAR(32)
        DECLARE @brand NVARCHAR(5)
       
        FETCH NEXT FROM db
                INTO
                @row_id,
                @brand
        WHILE @@fetch_status = 0
            BEGIN               
                DECLARE @tempRowId NVARCHAR(32)
                DECLARE @reviewTime NVARCHAR(10)
                DECLARE @reviewYear NVARCHAR(4)
                DECLARE @reviewMonth NVARCHAR(2)
                DECLARE @tempReviewTime NVARCHAR(10)
                SET @tempRowId = REPLACE(NEWID(),'-','')
                    BEGIN   
                        IF EXISTS(SELECT TOP 1 REVIEW_DATE FROM T_NWP_TRADEZONE_REVIEW WHERE DELETE_FLAG ='1' AND FK_ROW_ID = @row_id ORDER BY REVIEW_DATE DESC)
                            BEGIN
                                SET @tempReviewTime = (SELECT TOP 1 REVIEW_DATE FROM T_NWP_TRADEZONE_REVIEW WHERE DELETE_FLAG ='1' AND FK_ROW_ID = @row_id ORDER BY REVIEW_DATE DESC)
                                IF (SUBSTRING(CONVERT(NVARCHAR(10), GETDATE(),20),1,4) - CAST(SUBSTRING(@tempReviewTime,1,4) AS INT) > 0)
                                    BEGIN
                                        SET @reviewTime = CAST((SUBSTRING(CONVERT(NVARCHAR(10), GETDATE(),20),1,4) + 1) AS NVARCHAR(10)) + '-01-01'
                                        SET @reviewYear = SUBSTRING(CONVERT(NVARCHAR(10), GETDATE(),20),1,4) + 1
                                        SET @reviewMonth = '01'
                                    END                                   
                                ELSE
                                    BEGIN
                                        SET @reviewTime = REPLACE(@tempReviewTime,SUBSTRING(@tempReviewTime,1,4),SUBSTRING(@tempReviewTime,1,4)+1)
                                        SET @reviewYear = SUBSTRING(@reviewTime,1,4)
                                        SET @reviewMonth = SUBSTRING(@reviewTime,6,7)
                                    END
                                INSERT INTO T_NWP_TRADEZONE_REVIEW_TEST_PLAN
                                (
                                    ROW_ID,
                                    TRADEZONE_ID,
                                    GROUP_ID,   
                                    SORT_ID,
                                    PLAN_TYPE,
                                    BRAND,
                                    YEAR,
                                    MONTH,
                                    TEST_PLAN_DATE,
                                    YEAR_PLAN_FLAG,
                                    MONTH_PLAN_FLAG,
                                    NO_REVIEW_FLAG,
                                    NO_REVIEW_REASON,
                                    AUDIT_FLAG,
                                    CHANGE_FLAG,
                                    CREATOR_ID,
                                    CREATE_TIME,
                                    UPDATOR_ID,
                                    UPDATE_TIME,
                                    DELETE_FLAG,
                                    TEST_PLAN_BAK_DATE       
                                )VALUES(
                                    @tempRowId, @row_id, @tempRowId,'0','M1121',@brand,@reviewYear,@reviewMonth,@reviewTime,'M0009','M0009','M0817','M1170','','','admin',GETDATE(),'admin',GETDATE(),'1',@reviewTime                           
                                )
                            END                           
                        ELSE
                            IF EXISTS(SELECT TOP 1 SUBSTRING(CONVERT(NVARCHAR(10), CREATE_TIME,20),1,10) FROM H_NWP_TRADE_PLAN_REPORT WHERE FK_ROW_ID = @row_id ORDER BY CREATE_TIME DESC)
                                BEGIN
                                    SET @tempReviewTime = (SELECT TOP 1 SUBSTRING(CONVERT(NVARCHAR(10), CREATE_TIME,20),1,10) FROM H_NWP_TRADE_PLAN_REPORT WHERE FK_ROW_ID = @row_id ORDER BY CREATE_TIME DESC)
                                    IF (SUBSTRING(CONVERT(NVARCHAR(10), GETDATE(),20),1,4) - CAST(SUBSTRING(@tempReviewTime,1,4) AS INT) > 0)
                                        BEGIN
                                            SET @reviewTime = CAST((SUBSTRING(CONVERT(NVARCHAR(10), GETDATE(),20),1,4) + 1) AS NVARCHAR(10)) + '-01-01'
                                            SET @reviewYear = SUBSTRING(CONVERT(NVARCHAR(10), GETDATE(),20),1,4) + 1
                                            SET @reviewMonth = '01'
                                        END                                   
                                    ELSE
                                        BEGIN
                                            SET @reviewTime = REPLACE(@tempReviewTime,SUBSTRING(@tempReviewTime,1,4),SUBSTRING(@tempReviewTime,1,4)+1)
                                            SET @reviewYear = SUBSTRING(@reviewTime,1,4)
                                            SET @reviewMonth = SUBSTRING(@reviewTime,6,7)
                                        END
                                    INSERT INTO T_NWP_TRADEZONE_REVIEW_TEST_PLAN
                                    (
                                        ROW_ID,
                                        TRADEZONE_ID,
                                        GROUP_ID,   
                                        SORT_ID,
                                        PLAN_TYPE,
                                        BRAND,
                                        YEAR,
                                        MONTH,
                                        TEST_PLAN_DATE,
                                        YEAR_PLAN_FLAG,
                                        MONTH_PLAN_FLAG,
                                        NO_REVIEW_FLAG,
                                        NO_REVIEW_REASON,
                                        AUDIT_FLAG,
                                        CHANGE_FLAG,
                                        CREATOR_ID,
                                        CREATE_TIME,
                                        UPDATOR_ID,
                                        UPDATE_TIME,
                                        DELETE_FLAG,
                                        TEST_PLAN_BAK_DATE       
                                    )VALUES(
                                        @tempRowId, @row_id, @tempRowId,'0','M1121',@brand,@reviewYear,@reviewMonth,@reviewTime,'M0009','M0009','M0817','M1170','','','admin',GETDATE(),'admin',GETDATE(),'1',@reviewTime                           
                                    )
                                END                                                                   
                        END           
                FETCH NEXT FROM db
                    INTO
                    @row_id,
                    @brand
                   
            END
           
        CLOSE db
        DEALLOCATE db           
    END





存储过程中的游标主要用于遍历查询结果集的每一行数据。下面我将通过一个示例来说明如何在MySQL中创建存储过程并使用游标。 假设我们有一个员工表 `employees`,表结构如下: ```sql CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(100), salary DECIMAL(10,2) ); ``` 我们现在需要编写一个存储过程,该存储过程会遍历所有员工,并打印出他们的名字和薪水。 ### 存储过程代码 ```sql DELIMITER $$ CREATE PROCEDURE ProcessEmployees() BEGIN -- 声明变量 DECLARE done INT DEFAULT FALSE; DECLARE emp_name VARCHAR(100); DECLARE emp_salary DECIMAL(10,2); -- 声明游标 DECLARE emp_cursor CURSOR FOR SELECT name, salary FROM employees; -- 声明处理程序 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 打开游标 OPEN emp_cursor; -- 开始循环读取数据 read_loop: LOOP FETCH emp_cursor INTO emp_name, emp_salary; IF done THEN LEAVE read_loop; END IF; -- 处理每一行数据 SELECT CONCAT('Employee: ', emp_name, ', Salary: ', emp_salary); END LOOP; -- 关闭游标 CLOSE emp_cursor; END$$ DELIMITER ; ``` ### 代码解释 上述代码中,我们首先定义了一个存储过程 `ProcessEmployees`。在这个存储过程中,我们做了以下几件事: 1. **声明变量**:我们声明了三个变量,`done` 用于标识是否已经读取完所有数据,`emp_name` 和 `emp_salary` 分别用于存储游标中取出的员工名字和薪水。 2. **声明游标**:我们声明了一个游标 `emp_cursor`,它指向一个查询语句的结果集,这个查询语句是用来获取所有员工的名字和薪水的。 3. **声明处理程序**:我们声明了一个继续处理程序,当游标没有找到更多的行时,设置 `done` 变量为 `TRUE`。 4. **打开游标**:我们打开了游标 `emp_cursor`。 5. **循环读取数据**:我们进入一个循环,每次从游标中获取一行数据,并将其存入 `emp_name` 和 `emp_salary` 中。如果 `done` 变量为 `TRUE`,则退出循环。 6. **关闭游标**:最后,我们关闭了游标。 ### 使用存储过程 你可以通过以下命令调用存储过程: ```sql CALL ProcessEmployees(); ``` 这将执行存储过程并输出每个员工的名字和薪水。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值