Процедура MySQL со сложным SELECT дает «необъявленную переменную» для имен таблиц - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь создать свой первый набор процедур 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 для этого.

1 Ответ

0 голосов
/ 26 мая 2019

Я считаю, что ваш синтаксис неверен;пожалуйста, попробуйте поместить INTO ниже выбора следующим образом:

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 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...