/* ------------------------------------------------------------------------- Jade Cheng ICS 321 Assignment 3 December 12, 2008 PART 2.2 Create a stored procedure that will create an instance of a person. This stored procedure must also be able to create an instance of a PERSON_SKILL, BADGE assignment, Full Time data or Part Time data depending on the employee status. Name this procedure CreatePersonInstance. Generate your own user defined error message for error conditions. ------------------------------------------------------------------------- */ USE DB9975 GO ------------------------------------------------------------------------------- -- These are optional tables to return a skill id or badge issuer for a name. -- These potentially simplify use of the CreatePersonInstance procedure -- defined below. CREATE FUNCTION GetSkillId(@Title NVARCHAR(50)) RETURNS INT AS BEGIN DECLARE @Result INT SELECT TOP 1 @Result = Id FROM SKILL WHERE Title = @Title RETURN @Result END GO ------------------------------------------------------------------------------- CREATE FUNCTION GetBadgeIssuerId(@Name NVARCHAR(50)) RETURNS INT AS BEGIN DECLARE @Result INT DECLARE @Pattern NVARCHAR(52) SET @Pattern = '%' + @Name + '%'; SELECT TOP 1 @Result = Id FROM PERSON_PROFILE JOIN PERSON ON PERSON_PROFILE.PersonId = PERSON.Id WHERE ProfileId = 'Scty' AND dbo.PersonName(PERSON.Id) LIKE @Pattern RETURN @Result END GO ------------------------------------------------------------------------------- -- NOTE: The assignment instructions seem to suggest that each person is -- always assigned one skill. This is not necessarily the case. The -- PERSON_SKILL table allows zero or more associations between people and -- skills. Regardless, this stored procedure will always create a person -- with an initially-assigned skill. CREATE PROCEDURE CreatePersonInstance( @BadgeIssuerId INT, @FirstName NVARCHAR(20), @LastName NVARCHAR(20), @MiddleName NCHAR(1), @DateOfBirth DATETIME, @EmploymentStatus NCHAR(1), @Money MONEY, @SkillId INT) AS -- Verify the employment status is valid. IF @EmploymentStatus NOT IN ('F', 'P') BEGIN RAISERROR('EmploymentStatus is invalid (F/P).', 16, -1, @EmploymentStatus) RETURN 50000 END -- Lock the database in here. Use the most restrictive lock because speed -- is not an issue. SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION -- Verify the skill id is valid. DECLARE @TempSkillTable TABLE ( one INT ) INSERT INTO @TempSkillTable SELECT TOP 1 1 FROM SKILL WHERE Id = @SkillId IF @@ROWCOUNT <> 1 BEGIN ROLLBACK TRANSACTION RAISERROR('Illegal skill id.', 16, -1, @SkillId) RETURN 50000 END -- Verify the badge issuer is valid. DECLARE @TempBadgeTable TABLE ( one INT ) INSERT INTO @TempBadgeTable SELECT TOP 1 1 FROM PERSON_PROFILE WHERE ProfileId='Scty' AND PersonId=@BadgeIssuerId; IF @@ROWCOUNT <> 1 BEGIN ROLLBACK TRANSACTION RAISERROR('Illegal badge issuer id.', 16, -1, @BadgeIssuerId) RETURN 50000 END -- Determine the next available badge id. DECLARE @BadgeId INT SELECT @BadgeId = MAX(Id) FROM BADGE; SET @BadgeId = @BadgeId + 1; -- Create the new badge record with this id. INSERT INTO BADGE (Id, IssuingPerson, IssueDate) VALUES (@BadgeId, @BadgeIssuerId, GETDATE()); -- Determine the next available person id. DECLARE @PersonId INT SELECT @PersonId = MAX(Id) FROM PERSON; SET @PersonId = @PersonId + 1; -- Create the new person record with this badge id. INSERT INTO PERSON ( Id, FirstName, LastName, MiddleName, DateOfBirth, EmploymentStatus, Badge ) VALUES ( @PersonId, @FirstName, @LastName, @MiddleName, @DateOfBirth, @EmploymentStatus, @BadgeId ); -- Create a record in the FULL_TIME or PART_TIME table. IF @EmploymentStatus = 'F' INSERT INTO FULL_TIME ( Id, AnnualWage ) VALUES ( @PersonId, @Money ); ELSE INSERT INTO PART_TIME ( Id, HourlySalary ) VALUES ( @PersonId, @Money ); -- Create a record in the PERSON_SKILL table that associates the new person -- with an initial skill. The assessment and review dates are initially -- null. INSERT INTO PERSON_SKILL ( SkillId, PersonId ) VALUES ( @SkillId, @PersonId ); COMMIT TRANSACTION -- Return the person id. SELECT Id FROM PERSON WHERE Id = @PersonId GO ------------------------------------------------------------------------------- -- The following commented section was used to test the procedures above. /* -- Find a skill called 'Bilingual'. DECLARE @SkillId INT SET @SkillId = dbo.GetSkillId('Bilingual') -- Find a badge issuer with the name 'Chen'. DECLARE @BadgeIssuerId INT SET @BadgeIssuerId = dbo.GetBadgeIssuerId('Chen') -- Create a new person. EXECUTE CreatePersonInstance @BadgeIssuerId, 'Cheng', 'Yu', NULL, '10/13/1984', 'F', 15000, @SkillId; -- Check that the id exists for the person just created. DECLARE @PersonId INT SELECT @PersonId = Id FROM PERSON WHERE FirstName = 'Cheng' AND LastName = 'Yu'; -- Display information about the person; join the full or part time tables. -- This returns: -- -- FirstName LastName MiddleName DateOfBirth EmpStatus Badge AnnualWage -- - --------- -------- ---------- ----------- --------- ----- ---------- -- 1 Cheng Yu NULL 1984-10-13 F 4276 15000.00 -- SELECT FirstName, LastName, MiddleName, DateOfBirth, EmploymentStatus, Badge, AnnualWage FROM PERSON LEFT JOIN FULL_TIME ON PERSON.Id = FULL_TIME.Id LEFT JOIN PART_TIME ON PERSON.Id = PART_TIME.Id WHERE PERSON.Id = @PersonId; -- Determine the badge id for the person just created. DECLARE @BadgeId INT SELECT @BadgeId = Badge FROM PERSON WHERE Id = @PersonId; -- Display the name of the person that issued the badge. -- This returns: -- -- (No column name) -- - ---------------- -- 1 Chen, Rue P -- SELECT dbo.PersonName(IssuingPerson) FROM BADGE WHERE Id = @BadgeId; -- Display the skill names associated with this person. -- This returns: -- -- Title (No column name) -- ---- ----------- ---------------- -- 1 Bilingual Yu, Cheng -- SELECT Title, dbo.PersonName(PersonId) FROM SKILL JOIN PERSON_SKILL ON SKILL.Id = PERSON_SKILL.SkillId WHERE PERSON_SKILL.PersonId = @PersonId; -- Remove the person records. EXECUTE DeletePersonInstance @PersonId GO */