首页 > 解决方案 > 如何格式化这个 MySQL 存储过程?

问题描述

我在格式化这个 MySQL 存储过程时遇到了困难,我已经编写了 SQL Server 存储过程,但是 mysql 不断导致问题。有这方面经验的人可以看看,让我知道我缺少什么格式吗?

CREATE PROCEDURE dbo.spInsertPropertyAndUnit (
  IN AccountId INTEGER,
  IN Address VARCHAR(255),
  IN AddressNumber VARCHAR(255),
  IN City VARCHAR(255),
  IN State VARCHAR(255),
  OUT PropertyId INTEGER
)

BEGIN
  DECLARE PropertyId INTEGER;

  -- make property
  INSERT INTO tblProperties 
    (Address, AddressNumber, City, State)
  VALUES (
    IFNULL(Address, ''),
    IFNULL(AddressNumber, ''),
    IFNULL(City, ''),
    IFNULL(State, '')
  )
  SET PropertyId = CAST(SCOPE_IDENTITY() AS INTEGER)

  -- make a default unit
  INSERT INTO tblUnits (PropertyId, UnitNumber)
  VALUES (PropertyId, 1)

  -- Make an Accountpropertymembership
  INSERT INTO tblAccountPropertyMemberships (AccountId, PropertyId, MembershipRoleId)
  VALUES (AccountId, PropertyId, 0)

  SELECT PropertyId FROM tblProperties WHERE PropertyId = @PropertyId
END

标签: mysqlstored-procedures

解决方案


获取最后一个自增 ID 的函数是LAST_INSERT_ID().

您不能使用@PropertyID来访问名为PropertyID. 同样,您不能使用@AccountID来访问AccountID参数。

您不需要声明变量PropertyID,因为它已经声明为OUT参数。

您需要;在每个语句的末尾。使用该DELIMITER指令指定备用查询分隔符,以便您可以;在过程中使用。

最后,您可以简单地使用SELECT PropertyId来返回变量的值,您不需要查询表本身。

DELIMITER $$
CREATE PROCEDURE dbo.spInsertPropertyAndUnit (
  IN AccountId INTEGER,
  IN Address VARCHAR(255),
  IN AddressNumber VARCHAR(255),
  IN City VARCHAR(255),
  IN State VARCHAR(255),
  OUT PropertyId INTEGER
)

BEGIN
  PropertyId INTEGER;

  -- make property
  INSERT INTO tblProperties 
    (Address, AddressNumber, City, State)
  VALUES (
    IFNULL(Address, ''),
    IFNULL(AddressNumber, ''),
    IFNULL(City, ''),
    IFNULL(State, '')
  );
  SET PropertyId = LAST_INSERT_ID();

  -- make a default unit
  INSERT INTO tblUnits (PropertyId, UnitNumber)
  VALUES (PropertyId, 1);

  -- Make an Accountpropertymembership
  INSERT INTO tblAccountPropertyMemberships (AccountId, PropertyId, MembershipRoleId)
  VALUES (AccountId, PropertyId, 0);

  SELECT PropertyId;
END
$$
DELIMITER ;

推荐阅读