我需要在call语句中使用变量执行存储过程

时间:2012-09-15 20:43:17

标签: mysql

我想编写一个名为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');

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

1 个答案:

答案 0 :(得分: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(也不需要更改分隔符)。