2

特定の都市に住む学生の社会保障番号、姓、住所、都市、州、およびzipを一覧表示するSpecificCityという名前のストアドプロシージャを作成したいと思います。コールステートメントに特定の都市を含める必要があります。私はあなたたちが以前に私を助けてくれたことを知っています、そして私はこれにあなたの助けを本当に使うことができました。区切り文字が必要なのか、それとも単純なストアドプロシージャなのかはわかりません。私は取るべきステップさえ知らず、私はこれを行う方法を調べて理解することができません。

    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

ローカル変数のスコープと解決策で説明されているように:

ローカル変数は、テーブル列と同じ名前であってはなりません。ステートメントなどの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、プロシージャにステートメントが1つしかない場合は、使用する必要はありません(したがって、区切り文字を変更する必要もありません)。

于 2012-09-15T22:20:54.227 に答える