2

我想编写一个名为 SpecificCity 的存储过程,它将列出居住在特定城市的学生 ssn、姓氏、地址、城市、州和邮编。我需要将特定城市放在通话声明中。我知道你们以前帮助过我,我真的可以在这方面使用你们的帮助。我不知道它是否必须有一个分隔符或者它是否可以是一个简单的存储过程。我什至不知道要采取的步骤,我看了看也不知道该怎么做。

    CREATE TABLE student ( SSN CHAR(9) , LastName VARCHAR(25), FirstName VARCHAR(25), MiddleName VARCHAR(25) NULL, Address VARCHAR(50) NULL, City VARCHAR(25) NULL, State CHAR(2) NULL, Zip CHAR(9) NULL, DateOfBirth DATETIME NULL, Salary FLOAT(8,2) not null,
    ParkingSpace INT, Gender CHAR(1) NULL, DptNumber SMALLINT, SuperID CHAR(9), constraint pkField PRIMARY KEY(ssn) ;


    Delimiter //
    create procedure spSpecificCity(IN city VARCHAR(25))
    BEGIN
    SELECT SSN, LASTNAME, ADDRESS, CITY, STATE, ZIP
    FROM STUDENT
    WHERE CITY = CITY;
    END //

    DELIMITER ;

    CALL spSpecificCity('Brooklyn');

当我尝试这样做时,它只会将布鲁克林放在每个名字旁边的城市列中。我正在尝试,但我不知道该怎么做。

4

1 回答 1

1

Local Variable Scope and Resolution中所述:

局部变量不应与表列同名。如果一条 SQL 语句,例如SELECT ... INTO语句,包含对列的引用和同名声明的局部变量,则 MySQL 当前将该引用解释为变量的名称。

因此,您应该将city参数重命名为与您希望引用的任何列不同的名称。我通常采用以下划线作为局部变量前缀的约定:

CREATE PROCEDURE spSpecificCity(IN _city VARCHAR(25))
BEGIN
  SELECT SSN,
         LastName,
         Address,
         City,
         State,
         Zip
  FROM   student
  WHERE  city = _city;
END

或者,您可以通过使用表前缀限定列引用来避免歧义:

CREATE PROCEDURE spSpecificCity(IN city VARCHAR(25))
BEGIN
  SELECT student.SSN,
         student.LastName,
         student.Address,
         student.City,
         student.State,
         student.Zip
  FROM   student
  WHERE  student.city = city;
END

BEGIN ... END顺便说一句,如果您的过程仅包含一条语句,则不需要使用(因此也不需要更改分隔符)。

于 2012-09-15T22:20:54.227 回答