DML Supplier
Probleem
We moeten de gegevens van een leverancier kunnen inserten, updaten, deleten en selecteren. De selectie moet kunnen gebeuren op basis van de naam, de code en de contactpersoon. De Supplier tabel heeft één foreign key kolom met de naam IdCountry. De waarde in deze kolom verwijst naar een waarde in de primary key kolom Id van de tabel Country. In de SelectOne stored procedure moet de naam van het land mee opgehaald worden. Immers de gebruiker geeft niets om id's, die gebruiken wij, programmeurs, intern om de tabellen aan elkaar te koppelen.
Design
Op basis van het Mikmak logisch model maken we de stored procedures. Naast de standaard stored procedures, Insert, Update, Delete, SelectOne, SelectAll, maken we voor elke tabelkolom waarbij de Searchable is ingesteld op SELECTBY maken we een stored procedure waarbij er gezocht kan worden op deze kolom in de tabel.
| Naam | Beschrijving |
| SupplierInsert | bevat 1 OUTPUT parameter om de nieuw Id te retourneren naar het calling programma |
| SupplierUpdate | deze stored procedure updatet alle kolommen van de rij met de opgegeven Id |
| SupplierSelectOne | lees 1 rij in uit de tabel op basis van de Id, neem alle kolommen mee voor het detail venster |
| SupplierSelectAll | lees alle rijen in uit de tabel maar alleen de kolommen die we in de lijst willen laten zien (zie List kolom in logisch model) |
| SupplierSelectByCode | lees 1 rij in uit de tabel op basis van de Code maar alleen de kolommen die we in de lijst willen laten zien (zie List kolom in logisch model) |
| SupplierSelectByName | lees 1 rij in uit de tabel op basis van de Name maar alleen de kolommen die we in de lijst willen laten zien (zie List kolom in logisch model) |
| SupplierSelectByContact | lees 1 rij in uit de tabel op basis van de Contact maar alleen de kolommen die we in de lijst willen laten zien (zie List kolom in logisch model) |
Oplossing
Insert
-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Wednesday 6th of January 2016 11:45:34 AM
-- DML Insert Stored Procedure for Supplier
--
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierInsert'))
BEGIN
DROP PROCEDURE SupplierInsert
END
GO
CREATE PROCEDURE "SupplierInsert"
(
@Code NVARCHAR (10) ,
@Name NVARCHAR (255) ,
@Contact NVARCHAR (255) ,
@Address NVARCHAR (255) ,
@City NVARCHAR (255) ,
@Region NVARCHAR (80) ,
@PostalCode VARCHAR (20) ,
@IdCountry INT ,
@Phone VARCHAR (40) ,
@Mobile VARCHAR (40) ,
@Id INT output
)
AS
BEGIN
INSERT INTO "Supplier"
(
"Supplier"."Code",
"Supplier"."Name",
"Supplier"."Contact",
"Supplier"."Address",
"Supplier"."City",
"Supplier"."Region",
"Supplier"."PostalCode",
"Supplier"."IdCountry",
"Supplier"."Phone",
"Supplier"."Mobile"
)
VALUES
(
@Code,
@Name,
@Contact,
@Address,
@City,
@Region,
@PostalCode,
@IdCountry,
@Phone,
@Mobile
);
set @Id = SCOPE_IDENTITY();
END
GO
De Insert stored procedure testen
We beginnen met het inserten van een leverancier met een Country Id die niet bestaat. Hiermee wil ik tonen wat een foreign key constraint in SQL precies betekent. We hebben het land met Country Id = 1 daarnet gedeleted. Als we nu een leverancier willen toegvoegen met IdCountry = 1 krijgen we een foutmelding omdat we een leverancier willen inserten met een Country Id die niet in de tabel Country bestaat.
We proberen opnieuw maar nu met een bestand Country Id:
Update
De Update stored procedure gelijkt op de Insert. Maar hier geef je de Id mee van de rij die je wilt updaten. Hier geldt ook de foreign key constraint. De IdCountry die je meegeeft moet in de tabel Country bestaan. Anders krijg je een foutmelding.
-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Thursday 7th of January 2016 11:02:23 AM
-- DML Update Stored Procedure for Supplier
--
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierUpdate'))
BEGIN
DROP PROCEDURE SupplierUpdate
END
GO
CREATE PROCEDURE "SupplierUpdate"
(
@Code NVARCHAR (10) ,
@Name NVARCHAR (255) ,
@Contact NVARCHAR (255) ,
@Address NVARCHAR (255) ,
@City NVARCHAR (255) ,
@Region NVARCHAR (80) ,
@PostalCode VARCHAR (20) ,
@IdCountry INT ,
@Phone VARCHAR (40) ,
@Mobile VARCHAR (40) ,
@Id INT
)
AS
BEGIN
UPDATE "Supplier"
SET
"Code" = @Code,
"Name" = @Name,
"Contact" = @Contact,
"Address" = @Address,
"City" = @City,
"Region" = @Region,
"PostalCode" = @PostalCode,
"IdCountry" = @IdCountry,
"Phone" = @Phone,
"Mobile" = @Mobile
WHERE "Supplier"."Id" = @Id;
END
GO
We testen de Update stored procedure en veranderen de IdCountry waarde;
Delete
We maken eerste de stored procedure:
-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Thursday 7th of January 2016 11:02:23 AM
-- DML Delete Stored Procedure for Supplier
--
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierDelete'))
BEGIN
DROP PROCEDURE SupplierDelete
END
GO
CREATE PROCEDURE "SupplierDelete"
(
@Id INT
)
AS
BEGIN
DELETE FROM "Supplier"
WHERE "Supplier"."Id" = @Id;
END
GO
We testen de Delete stored procedure en we deleten de leverancier met Id = 1:
We voegen onze leverancier opnieuw toe:
exec SupplierInsert 'LEV00001AA', 'De Schoenmaker', 'Jan Jannsens', 'De Eerstestraat 1',
'Antwerpen', 'Antwerpen', '2000', '2', '032458987', '0486665478', @Id output
print @Id
select * from Supplier
SelectOne
De SelectOne stored procedure is speciaal. We moeten immers niet alleen de IdCountry waarde ophalen maar ook de naam van het land. Daarvoor hebben we een inner join nodig om de tabel Supplier te linken aan de tabel Country. Let erop dat we alle kolommen laten voorafgaan door de naam van de tabel om abiguïteit te vermijden. De kolomnaam Name en Code bijvoorbeeld komen zowel voor in de tabel Country als in de tabel Supplier.
-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Thursday 7th of January 2016 11:02:23 AM
-- DML SelectOne Stored Procedure for Supplier
--
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierSelectOne'))
BEGIN
DROP PROCEDURE SupplierSelectOne
END
GO
CREATE PROCEDURE "SupplierSelectOne"
(
@Id INT
)
AS
BEGIN
SELECT "Supplier"."Code",
"Supplier"."Name",
"Supplier"."Contact",
"Supplier"."Address",
"Supplier"."City",
"Supplier"."Region",
"Supplier"."PostalCode",
"Supplier"."IdCountry",
"Country"."Name" as CountryName,
"Supplier"."Phone",
"Supplier"."Mobile"
FROM "Supplier"
INNER JOIN "Country" ON "Supplier"."IdCountry" = "Country"."Id"
WHERE "Supplier"."Id" = @Id;
END
GO
We testen de stored procedure:
SelectAll
We moeten in Mikmak logisch model om te gaan kijken welke kolommen getoond moeten worden. In de List kolom staat YES als de kolom in de SelectAll stored procedure moet worden opgenomen.
-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Thursday 7th of January 2016 11:44:53 AM
-- DML SelectAll Stored Procedure for table Supplier
--
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierSelectAll'))
BEGIN
DROP PROCEDURE SupplierSelectAll
END
GO
CREATE PROCEDURE "SupplierSelectAll"
AS
BEGIN
SELECT "Supplier"."Code",
"Supplier"."Name",
"Country"."Name" as "CountryName",
"Supplier"."IdCountry",
"Supplier"."Id"
FROM "Supplier"
INNER JOIN "Country"
ON "Supplier"."IdCountry" = "Country"."Id"
ORDER BY "Name";
END
GO
We testen de SelectAll stored procedure uit:
SelectByCode
We maken eerste de stored procedure:
-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Thursday 7th of January 2016 11:44:53 AM
-- DML SelectByCode Stored Procedure for table Supplier
--
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierSelectByCode'))
BEGIN
DROP PROCEDURE SupplierSelectByCode
END
GO
CREATE PROCEDURE "SupplierSelectByCode"
(
@Code NVARCHAR (10)
)
AS
BEGIN
SELECT "Supplier"."Code",
"Supplier"."Name",
"Country"."Name" as "CountryName",
"Supplier"."IdCountry",
"Supplier"."Id"
FROM "Supplier"
INNER JOIN "Country" as "Country"
ON "Supplier"."IdCountry" = "Country"."Id"
WHERE "Supplier"."Code" = @Code
ORDER BY "Supplier"."Code";
END
GO
En testen die vervolgens
exec SupplierSelectByCode 'LEV00001AA'
SelectByName
We maken eerst de stored procedure:
-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Thursday 7th of January 2016 11:44:53 AM
-- DML SelectByName Stored Procedure for table Supplier
--
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierSelectByName'))
BEGIN
DROP PROCEDURE SupplierSelectByName
END
GO
CREATE PROCEDURE "SupplierSelectByName"
(
@Name NVARCHAR (255)
)
AS
BEGIN
SELECT "Supplier"."Code",
"Supplier"."Name",
"IdCountry-Country"."Name" as "IdCountryName",
"Supplier"."IdCountry",
"Supplier"."Id"
FROM "Supplier"
INNER JOIN "Country" as "IdCountry-Country"
ON "Supplier"."IdCountry" = "IdCountry-Country"."Id"
WHERE "Supplier"."Name" = @Name
ORDER BY "Supplier"."Name";
END
GO
En testen die uit:
exec SupplierSelectByName 'De Schoenmaker'
SelectByContact
We maken de stored procedure:
-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Thursday 7th of January 2016 11:44:53 AM
-- DML SelectByContact Stored Procedure for table Supplier
--
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierSelectByContact'))
BEGIN
DROP PROCEDURE SupplierSelectByContact
END
GO
CREATE PROCEDURE "SupplierSelectByContact"
(
@Contact NVARCHAR (255)
)
AS
BEGIN
SELECT "Supplier"."Code",
"Supplier"."Name",
"Country"."Name" as "CountryName",
"Supplier"."IdCountry",
"Supplier"."Id"
FROM "Supplier"
INNER JOIN "Country"
ON "Supplier"."IdCountry" = "Country"."Id"
WHERE "Supplier"."Contact" = @Contact
ORDER BY "Supplier"."Contact";
END
GO
En testen de stored procedure uit:
exec SupplierSelectByContact 'Jan Jannsens'
SelectByIdCountry
We beginnen met de stored procedure te maken:
-- modernways.be -- created by an orm apart -- Entreprise de modes et de manières modernes -- MySql DML -- Created : Thursday 7th of January 2016 11:44:53 AM -- DML SelectByIdCountry Stored Procedure for table Supplier -- USE Mikmak; -- Vooraleer de stored procedure te creëren, test als -- de die al bestaat. Als de SP al bestaat -- moet je die eerst droppen IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierSelectByIdCountry')) BEGIN DROP PROCEDURE SupplierSelectByIdCountry END GO CREATE PROCEDURE "SupplierSelectByIdCountry" ( @IdCountry INT ) AS BEGIN SELECT "Supplier"."Code", "Supplier"."Name", "Country"."Name" as "CountryName", "Supplier"."IdCountry", "Supplier"."Id" FROM "Supplier" INNER JOIN "Country" ON "Supplier"."IdCountry" = "Country"."Id" WHERE "Supplier"."IdCountry" = @IdCountry; END GO
En testen de stored procedure uit:
exec SupplierSelectByIdCountry 3