Создайте процедуру в MySQL / MariaDB и определите переменные причины ошибки # 1064 - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь создать SP в mysql / mariadb с объявленной переменной внутри - но я не вижу, что с ней не так!?!

DROP PROCEDURE IF EXISTS UpdateReceiverDevice;
DELIMITER $$

CREATE PROCEDURE `UpdateReceiverDevice`(IN `deviceIdentifier` VARCHAR(45), IN `deviceName` VARCHAR(45), IN `deviceLocation` VARCHAR(45), IN `informations` TEXT) NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY DEFINER
BEGIN
    DECLARE receiverDeviceId AS INT(11) DEFAULT 0
    SET receiverDeviceId = (SELECT ID FROM ReceiverDevice WHERE DeviceIdentifier = deviceIdentifier);
    IF (receiverDeviceId > 0) BEGIN
        UPDATE ReceiverDevice SET Informations = informations WHERE ID = receiverDeviceId;
    ELSE
        INSERT INTO ReceiverDevice (DeviceName, DeviceLocation, DeviceIdentifier, Informations) VALUES(deviceName, deviceLocation, deviceIdentifier, informations);
    END IF
END $$

DELIMITER ;

MySQL возвращает эту ошибку:

Ein oder mehrere Fehler sind aufgetreten während Ihre Anfrage verarbeitet wurde: Die folgende Abfrage ist fehlgeschlagen: "ПРОЦЕДУРА СОЗДАНИЯ UpdateReceiverDevice (IN deviceIdentifier VARCHAR (45), IN deviceName VARCHAR (45), IN deviceLocation VARCHAR (45), IN informations TEXT) НЕ ДЕТЕРМИНИСТИЧЕСКИЕ ИЗМЕНЕНИЯ SQL" DATA SQL SECURITY DEFINER DECLARE ASD INT INT (11) SET receiveDeviceId = (SELECT ID FROM ReceiverDevice WHERE DeviceIdentifier = deviceIdentifier) ​​ЕС. Информация) ЗНАЧЕНИЯ (имя устройства, расположение устройства, идентификатор устройства, информация) END IF "

MySQL meldet: # 1064 - Фелер в синтаксисе SQL. Bitte die korrekte Синтаксис im Handbuch nachschlagen bei 'ОБЪЯВЛЯЕТ приемникDeviceId КАК INT (11) УСТАНОВИТЬ ССЫЛКА ПРИБОРА = (ВЫБРАТЬ ID ОТ Re' в Цайле 1

Это мой сервер:

  • Тип сервера: MariaDB
  • Server-Version: 10.3.11-MariaDB-1: 10.3.11 + maria ~ bionic - mariadb.org бинарный дистрибутив
  • Protokoll-версия: 10
  • Server-Zeichensatz: UTF-8 Unicode (utf8)

1 Ответ

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

Подсказка в комментариях "Каждое утверждение должно быть прекращено" была очень полезной.

DROP PROCEDURE IF EXISTS UpdateReceiverDevice;
DELIMITER $$

CREATE PROCEDURE `UpdateReceiverDevice`(IN `deviceIdentifier` VARCHAR(45), IN `deviceName` VARCHAR(45), IN `deviceLocation` VARCHAR(45), IN `informations` TEXT) NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY DEFINER 
BEGIN
    DECLARE receiverDeviceId INT(11) DEFAULT 0;
    SELECT ID INTO receiverDeviceId FROM ReceiverDevice WHERE DeviceIdentifier = deviceIdentifier;

    IF receiverDeviceId > 0 THEN
        UPDATE ReceiverDevice SET Informations = informations WHERE ID = receiverDeviceId;
    ELSE
        INSERT INTO ReceiverDevice (DeviceName, DeviceLocation, DeviceIdentifier, Informations) VALUES(deviceName, deviceLocation, deviceIdentifier, informations);
    END IF;
END $$

DELIMITER ;
...