【问题标题】:I have a problem in my MySQL function to compare integers我的 MySQL 函数比较整数有问题
【发布时间】:2021-08-12 10:03:24
【问题描述】:

希望您对这个问题有所帮助。我在 Mysql 中创建了一个名为“Producto”的表(产品是西班牙语,我的数据库名称是西班牙语),属性为 nombre(名称)、stock(库存)和 precio(价格),并创建了一个计算可用库存的函数产品并与作为参数的数量进行比较。如果库存小于函数参数“can”(请求数量)则返回0,如果库存大于则返回1。



    CREATE TABLE producto
    (
    id_producto INT PRIMARY KEY AUTO_INCREMENT,
    nombre VARCHAR(50) NOT NULL UNIQUE,
    stock INT NOT NULL CHECK (stock > 0),
    precio DOUBLE(6,2) NOT NULL CHECK (precio > 0)
    );


这是我的功能:

CREATE FUNCTION f_consultar_stock(nom VARCHAR(50), can INT)
RETURNS INT
BEGIN
DECLARE v_can INT;
DECLARE v_valor INT;
SELECT stock INTO v_can FROM producto WHERE nombre = nom;
IF v_can > can THEN
    SET v_valor = 1;
ELSE
    SET v_valor = 0;
END IF;
RETURN v_valor;
END;


在执行函数创建之前,MySql 向我返回此错误
`22:15:04
CREATE FUNCTION f_consultar_stock(nom VARCHAR(50), can INT) RETURNS INT BEGIN DECLARE v_can INT
错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在第 4 行的 '' 附近使用正确的语法
0,00030 sec`

是什么原因?请帮助我,提前谢谢。

【问题讨论】:

    标签: mysql sql function database-design compare


    【解决方案1】:

    你可以从根本上简化逻辑,根本不使用任何局部变量:

    CREATE FUNCTION f_consultar_stock (
        in_nom VARCHAR(50),
        in_can INT
    )
    RETURNS INT
    BEGIN
        RETURN (SELECT p.stock > in_can FROM producto p WHERE p.nombre = in_nom);
    END;
    

    注意函数参数的前缀使用。 MySQL 中存储过程/函数的一个常见问题是参数名称与列名称冲突。使用in_out_ 等前缀有助于避免此类冲突。

    【讨论】:

      【解决方案2】:

      还可以添加分隔符,您可以将其简化为:

      delimiter //
      CREATE FUNCTION f_consultar_stock(nom VARCHAR(50), can INT)
      RETURNS INT
      BEGIN
      DECLARE v_valor INT;
      set v_valor = 0;
      IF (SELECT stock FROM producto WHERE nombre = nom) > can THEN
          SET v_valor = 1;
      ELSE
          SET v_valor = 0;
      END IF;
      RETURN v_valor;
      END //
      

      你甚至可以通过不使用 v_valor var 来简化它并直接返回值

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-13
        • 2012-09-15
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-18
        • 1970-01-01
        相关资源
        最近更新 更多