MySQL 具有复杂 SELECT 的过程在 table 个名称上给出 "Undeclared Variable"
MySQL procedure with complex SELECT gives "Undeclared Variable" on table names
我正在尝试创建我的第一套 MySQL 程序。在这种情况下,我希望有一个简单的调用将 4 table 中的相关信息整理成一个结果,并 return 离散选择的字段作为结果。为此,我写了这个:
CREATE PROCEDURE `DatabaseName.GetCityIdentity`
(
IN CityId BIGINT(20) UNSIGNED,
OUT
`id` BIGINT(20) UNSIGNED,
`provId` BIGINT(20) UNSIGNED,
`countryId` BIGINT(20) UNSIGNED,
`currencyId` BIGINT(20) UNSIGNED,
`cityName` VARCHAR(64),
`latitude` DECIMAL(10,6),
`longitude` DECIMAL(10,6),
`provName` VARCHAR(64),
`provAbbr` VARCHAR(4),
`countryName` VARCHAR(64),
`countryAbbr` VARCHAR(4),
`currencyName` VARCHAR(64),
`currencySymbol`VARCHAR(8),
`fullName` VARCHAR(256),
`abbrName` VARCHAR(80)
)
BEGIN
SELECT
`c`.`id` INTO `id`, `c`.`name` INTO `cityName`, `c`.`provId` INTO `provId`, `c`.`latitude` INTO`latitude`, `c`.`longitude` INTO `longitude`,
`p`.`name` INTO `provName`, `p`.`abbr` INTO `provAbbr`, `p`.`countryId` INTO `countryId`,
`y`.`name` INTO `countryName`, `y`.`abbr` INTO `countryAbbr`, `y`.`defaultCurrency` INTO `currencyId`,
`d`.`name` INTO `currencyName`, `d`.`symbol` INTO `currencySymbol`,
CONCAT(`c`.`name`, ', ', `p`.`name`, ', ', `y`.`Name`) INTO `fullName`,
CONCAT(`c`.`name`, ', ', `p`.`abbr`, ', ', `y`.`abbr`) INTO `abbrName`
FROM `cities` AS `c`
LEFT JOIN `provinces` AS `p` ON `c`.`provId` = `p`.`id`
LEFT JOIN `countries` AS `y` ON `p`.`countryId` = `y`.`id`
LEFT JOIN `currencies` AS `d` ON `y`.`defaultCurrency` = `d`.`id`
WHERE (`c`.`id` = CityId) LIMIT 1
END;
不幸的是,我在 SELECT
查询 ("Error: 1327: Undeclared variable: c") 中收到有关 Table 名称的错误。那么我应该如何构建这个 SELECT
使其按预期工作,而不引用 table 名称?
我尝试删除所有 "AS x
" 语句,并只使用实际的 table 名称,但是,当然,我得到了完全相同的错误,只是变量名被table 姓名...
我确定这对普通的 (My)SQL 开发人员来说是一件 obvious/simple 的事情,但到目前为止,这对我来说似乎非常反直觉..
PS:如果重要的话,我正在使用 MySQL Workbench 来完成此操作。
我认为您的语法不正确;请尝试将 INTO 放在 select 下方,如下所示;
DELIMITER //
CREATE PROCEDURE `DatabaseName.GetCityIdentity`
(
IN CityId bigint(20) unsigned,
OUT
`id` BIGINT(20) UNSIGNED,
`provId` BIGINT(20) UNSIGNED,
`countryId` BIGINT(20) UNSIGNED,
`currencyId` BIGINT(20) UNSIGNED,
`cityName` VARCHAR(64),
`latitude` DECIMAL(10,6),
`longitude` DECIMAL(10,6),
`provName` VARCHAR(64),
`provAbbr` VARCHAR(4),
`countryName` VARCHAR(64),
`countryAbbr` VARCHAR(4),
`currencyName` VARCHAR(64),
`currencySymbol`VARCHAR(8),
`fullName` VARCHAR(256),
`abbrName` VARCHAR(80)
)
BEGIN
SELECT
`cities`.`id`,
`cities`.`name`,
`cities`.`provId`,
`cities`.`latitude`,
`cities`.`longitude`,
`provinces`.`name`,
`provinces`.`abbr`,
`provinces`.`countryId`,
`countries`.`name`,
`countries`.`abbr`,
`countries`.`defaultCurrency`,
`currencies`.`name`,
`currencies`.`symbol`,
CONCAT(`cities`.`name`, ', ', `provinces`.`name`, ', ', `country`.`Name`),
CONCAT(`cities`.`name`, ', ', `provinces`.`abbr`, ', ', `country`.`abbr`)
INTO `id`, `cityName`, `provId`, `latitude`, `longitude`, `provName`,
`provAbbr`, `countryId`, `countryName`, `countryAbbr`,
`currencyId`, `currencyName`, `currencySymbol`, `fullName`,
`abbrName`
FROM `cities`
LEFT JOIN `provinces` ON `cities`.`provId` = `provinces`.`id`
LEFT JOIN `countries` ON `provinces`.`countryId` = `countries`.`id`
LEFT JOIN `currencies` ON `countries`.`defaultCurrency` = `currencies`.`id`
WHERE (`cities`.`id` = CityId) LIMIT 1;
END //
DELIMITER ;
我正在尝试创建我的第一套 MySQL 程序。在这种情况下,我希望有一个简单的调用将 4 table 中的相关信息整理成一个结果,并 return 离散选择的字段作为结果。为此,我写了这个:
CREATE PROCEDURE `DatabaseName.GetCityIdentity`
(
IN CityId BIGINT(20) UNSIGNED,
OUT
`id` BIGINT(20) UNSIGNED,
`provId` BIGINT(20) UNSIGNED,
`countryId` BIGINT(20) UNSIGNED,
`currencyId` BIGINT(20) UNSIGNED,
`cityName` VARCHAR(64),
`latitude` DECIMAL(10,6),
`longitude` DECIMAL(10,6),
`provName` VARCHAR(64),
`provAbbr` VARCHAR(4),
`countryName` VARCHAR(64),
`countryAbbr` VARCHAR(4),
`currencyName` VARCHAR(64),
`currencySymbol`VARCHAR(8),
`fullName` VARCHAR(256),
`abbrName` VARCHAR(80)
)
BEGIN
SELECT
`c`.`id` INTO `id`, `c`.`name` INTO `cityName`, `c`.`provId` INTO `provId`, `c`.`latitude` INTO`latitude`, `c`.`longitude` INTO `longitude`,
`p`.`name` INTO `provName`, `p`.`abbr` INTO `provAbbr`, `p`.`countryId` INTO `countryId`,
`y`.`name` INTO `countryName`, `y`.`abbr` INTO `countryAbbr`, `y`.`defaultCurrency` INTO `currencyId`,
`d`.`name` INTO `currencyName`, `d`.`symbol` INTO `currencySymbol`,
CONCAT(`c`.`name`, ', ', `p`.`name`, ', ', `y`.`Name`) INTO `fullName`,
CONCAT(`c`.`name`, ', ', `p`.`abbr`, ', ', `y`.`abbr`) INTO `abbrName`
FROM `cities` AS `c`
LEFT JOIN `provinces` AS `p` ON `c`.`provId` = `p`.`id`
LEFT JOIN `countries` AS `y` ON `p`.`countryId` = `y`.`id`
LEFT JOIN `currencies` AS `d` ON `y`.`defaultCurrency` = `d`.`id`
WHERE (`c`.`id` = CityId) LIMIT 1
END;
不幸的是,我在 SELECT
查询 ("Error: 1327: Undeclared variable: c") 中收到有关 Table 名称的错误。那么我应该如何构建这个 SELECT
使其按预期工作,而不引用 table 名称?
我尝试删除所有 "AS x
" 语句,并只使用实际的 table 名称,但是,当然,我得到了完全相同的错误,只是变量名被table 姓名...
我确定这对普通的 (My)SQL 开发人员来说是一件 obvious/simple 的事情,但到目前为止,这对我来说似乎非常反直觉..
PS:如果重要的话,我正在使用 MySQL Workbench 来完成此操作。
我认为您的语法不正确;请尝试将 INTO 放在 select 下方,如下所示;
DELIMITER //
CREATE PROCEDURE `DatabaseName.GetCityIdentity`
(
IN CityId bigint(20) unsigned,
OUT
`id` BIGINT(20) UNSIGNED,
`provId` BIGINT(20) UNSIGNED,
`countryId` BIGINT(20) UNSIGNED,
`currencyId` BIGINT(20) UNSIGNED,
`cityName` VARCHAR(64),
`latitude` DECIMAL(10,6),
`longitude` DECIMAL(10,6),
`provName` VARCHAR(64),
`provAbbr` VARCHAR(4),
`countryName` VARCHAR(64),
`countryAbbr` VARCHAR(4),
`currencyName` VARCHAR(64),
`currencySymbol`VARCHAR(8),
`fullName` VARCHAR(256),
`abbrName` VARCHAR(80)
)
BEGIN
SELECT
`cities`.`id`,
`cities`.`name`,
`cities`.`provId`,
`cities`.`latitude`,
`cities`.`longitude`,
`provinces`.`name`,
`provinces`.`abbr`,
`provinces`.`countryId`,
`countries`.`name`,
`countries`.`abbr`,
`countries`.`defaultCurrency`,
`currencies`.`name`,
`currencies`.`symbol`,
CONCAT(`cities`.`name`, ', ', `provinces`.`name`, ', ', `country`.`Name`),
CONCAT(`cities`.`name`, ', ', `provinces`.`abbr`, ', ', `country`.`abbr`)
INTO `id`, `cityName`, `provId`, `latitude`, `longitude`, `provName`,
`provAbbr`, `countryId`, `countryName`, `countryAbbr`,
`currencyId`, `currencyName`, `currencySymbol`, `fullName`,
`abbrName`
FROM `cities`
LEFT JOIN `provinces` ON `cities`.`provId` = `provinces`.`id`
LEFT JOIN `countries` ON `provinces`.`countryId` = `countries`.`id`
LEFT JOIN `currencies` ON `countries`.`defaultCurrency` = `currencies`.`id`
WHERE (`cities`.`id` = CityId) LIMIT 1;
END //
DELIMITER ;