【问题标题】:Can't create FUNCTION in mariadb无法在 mariadb 中创建 FUNCTION
【发布时间】:2019-06-28 19:36:17
【问题描述】:

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

我已经发布了我目前的工作,因为没有更好的词,版本。

【问题讨论】:

  • 您似乎缺少函数签名的 RETURNS 部分。
  • 我有一个使用 RETURNS 的版本,但它仍然卡住了。一定是别的东西。

标签: mysql mariadb


【解决方案1】:

您可能希望使用 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);

【讨论】:

  • 谢谢。我会试一试,然后告诉你。
  • 成功了。非常感谢。我将不得不研究那个 SELECT 语法,因为它对我来说没有意义,......但是。
  • 当一个变量(如v_found)被声明时,它没有值(=它是NULL)。如果随后的选择产生一行,则变量获得一个值(在本例中为 1)。同样,您可以检查 tid-variable 是否有值,
猜你喜欢
  • 1970-01-01
  • 2017-02-06
  • 2019-09-26
  • 2017-04-10
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 2023-03-02
相关资源
最近更新 更多