zoukankan      html  css  js  c++  java
  • mysql 存储过程

    mysql存储过程功能

    1、使用临时表,动态游标只能用临时表

    2、临时表有多个字段,游标同时有多个参数来接受

    3、循环读写数据

    4、 如果存在记录就更新记录,如果不存在记录,就插入记录

    DELIMITER $$
    
    USE `test_cases`$$
    
    DROP PROCEDURE IF EXISTS `proc_write_report`$$
    
    CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_write_report`(IN p_table_name VARCHAR(80),IN p_class_name VARCHAR(80),IN p_method_name VARCHAR(80),IN p_execution_flag VARCHAR(80))
    BEGIN
        
        DECLARE var_class_name VARCHAR(280) DEFAULT NULL;   -- 测试类名
        DECLARE var_method_name VARCHAR(180) DEFAULT NULL;  -- 测试方法名
        DECLARE var_module VARCHAR(180) DEFAULT NULL;  -- 测试模块 中文
        DECLARE var_case_name VARCHAR(180) DEFAULT NULL; -- 测试用例名称 中文
        DECLARE var_pass_amount INT DEFAULT 0;  --  通过用例数量
        DECLARE var_execution_amount INT DEFAULT 0;  --  通过用例数量
        DECLARE var_fail_amount INT DEFAULT 0;  --  失败用例数量
        DECLARE var_fail_reason VARCHAR(2000) DEFAULT NULL;  -- 失败原因
        DECLARE var_fail_type VARCHAR(2000) DEFAULT NULL;  -- 失败类型
        DECLARE var_comment VARCHAR(2000) DEFAULT NULL; -- 备注
        DECLARE var_sql_string VARCHAR(2000) DEFAULT NULL; -- sql 语句
        DECLARE var_sql_temp_table VARCHAR(2000) DEFAULT NULL; -- sql 语句   
        -- 遍历数据结束标志
        DECLARE done INT DEFAULT FALSE; 
        DECLARE cur CURSOR FOR SELECT * FROM tmp_table_result;
        -- 将结束标志绑定到游标
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;    
        -- 游标
        -- DECLARE cur CURSOR FOR SELECT fail_type FROM execution_order_price  WHERE execution_flag = '201606091918' AND test_class = 'com.fc.htgl.testcases.TestOrderPrice' AND test_method = 'testYDOrderPrice' GROUP BY fail_type;
        
        SET @var_cass_name = p_class_name;
        SET @var_method_name = p_method_name;
        -- 删除临时表
        DROP TEMPORARY TABLE IF EXISTS tmp_table_result;    
        
        -- 预处理临时表用的sql语句
        SET @var_sql_temp_table = CONCAT('CREATE TEMPORARY TABLE tmp_table_result ',"select TEST_CLASS,TEST_METHOD,TEST_module_NAME,TEST_case_name,COUNT(*),fail_type,COMMENT from ",p_table_name,"  where execution_flag = '",p_execution_flag,"' and test_class = '",p_class_name,"' and test_method = '",p_method_name,"' group by fail_type");
        -- SET @var_sql_temp_table = CONCAT('CREATE TEMPORARY TABLE tmp_table_result ',"select count(*),fail_type from ",p_table_name,"  where execution_flag = '",p_execution_flag,"' and test_class = '",p_class_name,"' and test_method = '",p_method_name,"' group by fail_type");
        
        -- select @var_sql_temp_table;  
        
        -- 预处理要执行的动态SQL
        PREPARE stmt FROM @var_sql_temp_table;
        --  执行SQL语句
        EXECUTE stmt; 
        -- 释放掉预处理段     
        DEALLOCATE PREPARE stmt; 
        -- select * from tmp_table_result; -- 查询下临时表
        
        -- 打开游标
        OPEN cur;
      
        -- 开始循环
        read_loop: LOOP
            
            -- 提取游标里的数据;
            -- FETCH cur INTO var_execution_amount,var_fail_type;
            FETCH cur INTO var_class_name ,var_method_name,var_module,var_case_name,var_execution_amount,var_fail_type,var_comment;
            -- 声明结束的时候
            IF done THEN
                LEAVE read_loop;
            END IF;
            -- 循环更新插入
            -- select var_class_name ,var_method_name,var_module,var_case_name,var_execution_amount,var_fail_type,var_comment;
            
            -- 获取失败原因 
        
            
            SET @var_sql_string = CONCAT("select distinct actual_result from ",p_table_name," where test_method = '",p_method_name,"' and execution_flag = '",p_execution_flag,"' and test_class = '",p_class_name,"' and is_select = 1 and is_execution = 1 and fail_type = '",var_fail_type,"'");
            -- SELECT  @var_sql_string;
        
            CALL proc_get_table_column_content(@var_sql_string,@var_fail_reason); 
        
            -- 往report表中写结果
            
            IF (SELECT COUNT(*) FROM report  WHERE execution_flag = p_execution_flag
            AND class_name = p_class_name AND method_name = p_method_name  AND fail_type = var_fail_type ) THEN
                -- select '条件存在,update';
                UPDATE report SET class_name = p_class_name, method_name = p_method_name,
                module = var_module, case_name = var_case_name,            
                execution_amount = var_execution_amount, fail_reason = @var_fail_reason, `COMMENT` = var_comment,  `TIME` = NOW()    
                WHERE execution_flag = p_execution_flag  AND class_name = p_class_name  AND method_name = p_method_name  AND fail_type = var_fail_type;
               
            ELSE 
                -- SELECT '条件不存在,insert';
                INSERT  INTO report(execution_flag,class_name,method_name,module,case_name,execution_amount,fail_reason,fail_type,`time`,`comment`) 
                VALUES (p_execution_flag,p_class_name,p_method_name,var_module,var_case_name,var_execution_amount,@var_fail_reason,var_fail_type,NOW(),var_comment);   
            END IF;     
        END LOOP;
        -- 关闭游标
        CLOSE cur;
    END$$
    
    DELIMITER ;
  • 相关阅读:
    在数据集下建立FeatureClass
    打开对话框保存对话框
    C# 向数据库中添加数据
    OleDbCommand OleDbDataAdapter比较研究素材
    C# 判断数据库是否存在某张表
    AE常见问题、异常处理
    制作停靠窗体、悬浮窗Dockpanel
    11. Container With Most Water(js)
    10. Regular Expression Matching(js)
    9. Palindrome Number(js)
  • 原文地址:https://www.cnblogs.com/testway/p/5573952.html
Copyright © 2011-2022 走看看