Я пытаюсь создать свой первый набор процедур MySQL. В этом случае я хочу, чтобы простой вызов сопоставлял релевантную информацию из 4 таблиц в один результат и возвращал дискретный выбор полей в качестве результата. С этой целью я написал это:
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
(«Ошибка: 1327: необъявленная переменная: c»). Так как мне построить этот SELECT
таким образом, чтобы он работал как задумано, без ссылки на имена таблиц?
Я попытался удалить все операторы "AS x
" и использовать вместо них только фактические имена таблиц, но, конечно, я получаю точно такую же ошибку, просто с заменой имени переменной на имя таблицы ...
Я уверен, что это очевидная / простая вещь для обычного (Моего) разработчика SQL, но это пока кажется мне чрезвычайно нелогичным ..
PS: Если это имеет значение, я использую MySQL Workbench для этого.