无法在mariadb中创建功能

时间:2019-06-28 19:36:17

标签: mysql mariadb

我无法在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)

函数名称有问题吗?我已经多次更改了名称,并在各处更改了空白区域。我已经把分号弄乱了。我已经在函数的RETURN处添加了RETURNS语句。

由于缺少更好的词,我已经发布了我目前的工作。

1 个答案:

答案 0 :(得分:0)

您可能要使用PROCEDURE而不是FUNCTION,因为您没有返回值,也不想在查询中使用该函数。

代码的另一个问题是语法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);