Не могу создать ФУНКЦИЮ в mariadb - PullRequest
0 голосов
/ 28 июня 2019

Я не могу создать функцию в версии mariadb: 10.1.37-MariaDB-0 + deb9u1 Debian 9.6

Новое в программировании mariadb / mysql.Я перемещаю данные электронной таблицы в базу данных.

Нет хранимых процедур или функций, и я использую учетную запись с полными привилегиями.Я заполняю таблицу компьютеров, которая должна ссылаться на запись магазина в таблице магазинов.В хранилище может быть несколько машин, поэтому машина не является полем в таблице хранилищ.

Я просто пытаюсь получить правильный синтаксис для создания функции, чтобы затем я мог пакетировать последовательность чисел.Первоначально это была большая серия операторов SELECT и IF, а сценарий задыхался от операторов IF.Я прочитал в чьем-то посте, что операторы IF могут использоваться только в функциях и процедурах.Это правда?

Ошибка, которую я получаю, используя 'SOURCE gen.mach.store.bat;'в интерактивном режиме или 'mysql -u fullpriv -pabc1234

ERROR 1064 (42000) at line 4 in file: 'gen.mach.store.bat': You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'BEGIN
  DECLARE tid MEDIUMINT;
  SET tid:=-1 ;
  SELECT tid:=id FROM stores WHER' at line 2
Query OK, 0 rows affected, 1 warning (0.00 sec)

код:

USE SWIMAT ;
DROP FUNCTION IF EXISTS sMachine;
DELIMITER $$
CREATE FUNCTION sMachine( sstore MEDIUMINT , smach MEDIUMINT )
BEGIN
  DECLARE tid MEDIUMINT;
  SET tid:=-1 ;
  SELECT tid:=id FROM stores WHERE name="ChainX" AND number=sstore;
  IF tid != -1 THEN
    INSERT INTO machines(store,sn) VALUES (tid,smach);
  END IF;
END
$$
DELIMITER ;
DROP FUNCTION IF EXISTS sMachine;

Если я изменяю Создать код на

CREATE AGGREGATE FUNCTION sMachine( sstore MEDIUMINT , smach MEDIUMINT )

, ошибка близка к '(sstore MEDIUMINT, smach MEDIUMINT)

Что-то не так с именем функции?Я несколько раз менял имя и повсеместно изменял пустое пространство.Я облажался с точкой с запятой.В какой-то момент я добавил оператор RETURNS с RETURN в функции.

Я опубликовал свою текущую работу, из-за отсутствия лучшего слова, версии.

1 Ответ

0 голосов
/ 28 июня 2019

Возможно, вы захотите использовать ПРОЦЕДУРУ вместо ФУНКЦИИ, так как вы не возвращаете значение и не собираетесь использовать функцию в запросе.

Другая проблема с кодом - синтаксис SELECT tid:=id, вместо него используйте SELECT ... INTO.

USE SWIMAT ;
DROP PROCEDURE IF EXISTS sMachine;
DELIMITER $$
CREATE PROCEDURE sMachine( sstore MEDIUMINT , smach MEDIUMINT )
BEGIN
  DECLARE tid MEDIUMINT;
  DECLARE v_found MEDIUMINT;

  SELECT id, 1 into tid, v_found
  FROM stores 
  WHERE name="ChainX" AND number=sstore;

  IF (v_found = 1) THEN
    INSERT INTO machines(store,sn) VALUES (tid,smach);
  END IF;
END
$$

Затем вы можете использовать процедуру с:

CALL sMachine(1,2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...