mysql - 在存储过程中检索多行

标签 mysql sql stored-procedures subquery mysql-error-1242

我需要执行全表级扫描,因为它应该根据用户 ID 检索多行。

因为我曾经收到 sqlMessage 指出“子查询返回超过 1 行”。

{ Error: ER_SUBQUERY_NO_1_ROW: Subquery returns more than 1 row
  ...
  code: 'ER_SUBQUERY_NO_1_ROW',
  errno: 1242,
  sqlMessage: 'Subquery returns more than 1 row',
  sqlState: '21000',
  index: 0,
  sql: 'CALL GetLocationTag(1)' }

这是对 GetLocationTag() 代码的调用

DELIMITER $$

CREATE
    DEFINER = `root`@`localhost`
    PROCEDURE `someDB`.`GetLocationTag`(IN `UserId` BIGINT)
    LANGUAGE SQL
    DETERMINISTIC
    READS SQL DATA 
    SQL SECURITY DEFINER 
    COMMENT 'Retrieves Multiple Stored Location Tags, Address, Location, etc. based on User_ID'
    BEGIN
        DECLARE flag INT(11);
        DECLARE locRecord VARCHAR(255);

            IF EXISTS (SELECT * FROM `location_map` WHERE `user_id` = User_Id ) THEN  
                BEGIN
                    SELECT * INTO locRecord FROM `location_map` WHERE `user_id` = User_Id;
                    SET flag = 1;
                END;            
            ELSE
                SET flag = 0;
                SET locRecord = 0;
            END IF;

        SELECT locRecord, flag;
    END$$

DELIMITER ;

对于以下查询,

SELECT * INTO locRecord FROM `location_map` WHERE `user_id` = User_Id;

我需要如何以数组的形式检索所有行并将其存储到变量中,或者我该如何编码才能解决错误消息?

最佳答案

使用 View 来存储获取的数据而不是变量

DELIMITER $$

CREATE
    DEFINER = `root`@`localhost`
    PROCEDURE `someDB`.`GetLocationTag`(IN `User_Id` BIGINT)
    LANGUAGE SQL
    DETERMINISTIC
    MODIFIES SQL DATA
    SQL SECURITY DEFINER
    COMMENT 'Retrieves Multiple Stored Location Tags, Address, Location, etc. based on User_ID'
    BEGIN
        DECLARE flag INT(11);
        DECLARE locRecord VARCHAR(255);

            IF EXISTS (SELECT * FROM `location_map` WHERE `user_id` = User_Id ) THEN  
                BEGIN
                    SET @viewQry = CONCAT('CREATE OR REPLACE VIEW `someDB`.`temp` as SELECT *, 1 as flag FROM `location_map` WHERE `user_id` = ',User_Id,';');
                    PREPARE stmt FROM @viewQry; 
                    EXECUTE stmt; 
                    DEALLOCATE PREPARE stmt;
                    SELECT * FROM temp;
                END;            
            ELSE
                SELECT 0 AS locRecord, 0 AS flag;
            END IF;
    END$$

DELIMITER ;

关于mysql - 在存储过程中检索多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55058771/

相关文章:

Mysql 查询具有多个子查询,并按不同条件进行分组

php - 使用 GROUP_CONCAT 的 SQL 查询出现意外结果

sql - 从函数返回记录集(虚拟表)

php - 如何使用存储过程的字符串 id 插入多条记录?

php - MySQL 双表 INNER JOIN,LEFT JOINED 到第三个表,只有一行具有最低值

sql - Oracle嵌套xml解析

mysql - 当 TableA.attr 更新时更新 TableB.attr MySQL

mysql - 查询被屏蔽的用户

php - 返回多个结果 mysql 和 php

mysql - 如何在MySql和Sql Server之间自动来回传输数据?