Как построить условную процедуру для работы (if-then-insert-else-update) на нескольких таблицах, используя MySQL в phpMyAdmin - PullRequest
0 голосов
/ 08 октября 2018

Я использую MySQL для управления базой данных.

У меня есть 2 таблицы с именами IDENTITY и OPTIONS в базе данных с именем WIFI.
IDENTITY содержит 2 поля: USERNAME и PASSWORD.
OPTIONS содержит 3 поля: USERNAME, WIFI_SSID и WIFI_PASSWORD.
И есть процедура, принимающая эти переменные в качестве аргумента:
arg01_USERNAME
arg02_PASSWORD
arg03_WIFI_SSID
arg04_WIFI_PASSWORD * 1010 для I ** в ** ** **phpMyAdmin для выполнения этой операции:

Эта процедура должна проверить, соответствуют ли arg01_USERNAME и arg02_PASSWORD данным в IDENTITY.Если данные не найдены, то ничего не делать.В противном случае найдите arg01_USERNAME в таблице OPTIONS и обновите WIFI_SSID и WIFI_PASSWORD с помощью arg03_WIFI_SSID и arg04_WIFI_PASSWORD.Если arg01_USERNAME не найден в OPTIONS, вставьте новую запись в OPTIONS.

Вот SQL-запрос для определения процедуры:

CREATE DEFINER=`WIFI`@`localhost` PROCEDURE `INSERT`(IN `arg01_USERNAME` INT(20) UNSIGNED, IN `arg02_PASSWORD` VARCHAR(32), IN `arg03_WIFI_SSID` VARCHAR(32) CHARSET utf8, IN `arg04_WIFI_PASSWORD` VARCHAR(32) CHARSET utf8)
    NO SQL
IF EXISTS (
    SELECT COUNT(*) 
    FROM `WIFI`.`IDENTITY` 
    WHERE `USERNAME` = arg01_USERNAME AND `PASSWORD` = arg02_PASSWORD)
THEN
    INSERT INTO `WIFI`.`OPTIONS` (
        `USERNAME`,
        `WIFI_SSID`,
        `WIFI_PASSWORD`
    ) VALUES (
        arg01_USERNAME,
        arg03_WIFI_SSID,
        arg04_WIFI_PASSWORD
    )
    ON DUPLICATE KEY UPDATE
        `WIFI_SSID` = arg03_WIFI_SSID,
        `WIFI_PASSWORD` = arg04_WIFI_PASSWORD
END IF;
ENGINE=InnoDB DEFAULT CHARSET=utf8

Не могли бы вы указать мнечто не так с этим кодом?
Когда я пытаюсь определить процедуру, используя этот код, phpMyAdmin сообщает мне, что есть синтаксическая ошибка рядом с частью кода «END IF» (ошибка 1064).
Извините за мойплохой английский.

1 Ответ

0 голосов
/ 08 октября 2018
  • Вам необходимо переопределить разделитель на что-то другое, например: $$, чтобы синтаксический анализатор не запускал выполнение запроса, когда видит ;
  • В конце переопределите разделитель обратнодо ;.

Попробуйте:

DELIMITER $$

CREATE DEFINER=`WIFI`@`localhost` PROCEDURE `INSERT`(IN `arg01_USERNAME` INT(20) UNSIGNED, IN `arg02_PASSWORD` VARCHAR(32), IN `arg03_WIFI_SSID` VARCHAR(32) CHARSET utf8, IN `arg04_WIFI_PASSWORD` VARCHAR(32) CHARSET utf8)
    NO SQL
IF EXISTS (
    SELECT COUNT(*) 
    FROM `WIFI`.`IDENTITY` 
    WHERE `USERNAME` = arg01_USERNAME AND `PASSWORD` = arg02_PASSWORD)
THEN
    INSERT INTO `WIFI`.`OPTIONS` (
        `USERNAME`,
        `WIFI_SSID`,
        `WIFI_PASSWORD`
    ) VALUES (
        arg01_USERNAME,
        arg03_WIFI_SSID,
        arg04_WIFI_PASSWORD
    )
    ON DUPLICATE KEY UPDATE
        `WIFI_SSID` = arg03_WIFI_SSID,
        `WIFI_PASSWORD` = arg04_WIFI_PASSWORD;
END IF $$

DELIMITER ;
...