Mikmak MsSQL DML Product
CRUD stored procedures voor de Product tabel. De afspraak is dat de namen voor de stored procedurs beginnen met de naam van de tabel gevolgd door de naam van de CRUD handeling. De naam wordt in pascalnotatie geschreven.
Probleem
We moeten de gegevens van een product kunnen inserten, updaten, deleten en selecteren. De selectie moet kunnen gebeuren op basis van een gedeelte van de naam, en van de leverancier. De Product tabel heeft één foreign key kolom met de naam IdSupplier. De waarde in deze kolom verwijst naar een waarde in de primary key kolom Id van de tabel Supplier. In de SelectOne stored procedure moet de naam van de leverancier 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 |
| ProductInsert | bevat 1 OUTPUT parameter om de nieuw Id te retourneren naar het calling programma |
| ProductUpdate | deze stored procedure updatet alle kolommen van de rij met de opgegeven Id |
| ProductSelectOne | lees 1 rij in uit de tabel op basis van de Id, neem alle kolommen mee voor het detail venster |
| ProductSelectAll | 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) |
| ProductSelectLikeXName | lees 1 rij in uit de tabel op basis van een gedeelte van de productnaam maar alleen de kolommen die we in de lijst willen laten zien (zie List kolom in logisch model) |
| ProductSelectByIdSupplier | lees 1 rij in uit de tabel op basis van de Id van de leverancier maar alleen de kolommen die we in de lijst willen laten zien (zie List kolom in logisch model) |
| ProductSelectByNameSupplier | lees 1 rij uit de tabel op basis van de naam van de leverancier; in de where clausule moeten we dus vergelijken met de Name kolom uit een andere tabel, namelijk de Supplier tabel. |
Oplossing
Insert
De procedure maken
-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Saturday 9th of January 2016 01:46:21 PM
-- DML Insert Stored Procedure for Product
--
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'ProductInsert'))
BEGIN
DROP PROCEDURE ProductInsert
END
GO
CREATE PROCEDURE "ProductInsert"
(
@Description NVARCHAR (1024) ,
@Name NVARCHAR (255) ,
@Price FLOAT ,
@ShippingCost FLOAT ,
@TotalRating INT ,
@Thumbnail VARCHAR (255) ,
@Image VARCHAR (255) ,
@DiscountPercentage FLOAT ,
@Votes INT ,
@Id INT output,
@IdSupplier INT
)
AS
BEGIN
INSERT INTO "Product"
(
"Product"."Description",
"Product"."Name",
"Product"."Price",
"Product"."ShippingCost",
"Product"."TotalRating",
"Product"."Thumbnail",
"Product"."Image",
"Product"."DiscountPercentage",
"Product"."Votes",
"Product"."IdSupplier"
)
VALUES
(
@Description,
@Name,
@Price,
@ShippingCost,
@TotalRating,
@Thumbnail,
@Image,
@DiscountPercentage,
@Votes,
@IdSupplier
);
set @Id = SCOPE_IDENTITY();
END
GO
Test
use Mikmak
go
-- zoek eerst de id van de supplier op
declare @IdSupplier int
set @IdSupplier = (select Id from Supplier where Name = 'De Schoenmaker')
-- insert
declare @NewId int
exec ProductInsert 'Met deze schoenen loop je tot naar Timbuktu',
'Nice Boots', 20.5, 3.5, 5,
'http://www.ida.classy.be/wp18/Schoen_strikken.jpg',
'http://www.schilberg.nl/sinterklaas/2006/schoen1.jpg',
0.10, 245, @NewId OUTPUT, @IdSupplier
print @NewId
Update
De stored procedure maken
-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Saturday 9th of January 2016 01:46:21 PM
-- DML Update Stored Procedure for Product
--
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'ProductUpdate'))
BEGIN
DROP PROCEDURE ProductUpdate
END
GO
CREATE PROCEDURE "ProductUpdate"
(
@Description NVARCHAR (1024) ,
@Name NVARCHAR (255) ,
@Price FLOAT ,
@ShippingCost FLOAT ,
@TotalRating INT ,
@Thumbnail VARCHAR (255) ,
@Image VARCHAR (255) ,
@DiscountPercentage FLOAT ,
@Votes INT ,
@Id INT ,
@IdSupplier INT
)
AS
BEGIN
UPDATE "Product"
SET
"Description" = @Description,
"Name" = @Name,
"Price" = @Price,
"ShippingCost" = @ShippingCost,
"TotalRating" = @TotalRating,
"Thumbnail" = @Thumbnail,
"Image" = @Image,
"DiscountPercentage" = @DiscountPercentage,
"Votes" = @Votes,
"IdSupplier" = @IdSupplier
WHERE "Product"."Id" = @Id;
END
GO
Test
-- zoek eerst de id van de supplier op
declare @IdSupplier int
set @IdSupplier = (select Id from Supplier where Name = 'De Schoenmaker')
-- zoek dan de id van de product op
declare @IdProduct int
set @IdProduct = (select Id from Product where Name = 'Nice Boots')
-- update de beschrijving van het product
exec ProductUpdate 'Met deze schoenen loop je tot naar Timbuktu en nog verder!',
'Nice Boots', 20.5, 3.5, 5,
'http://www.ida.classy.be/wp18/Schoen_strikken.jpg',
'http://www.schilberg.nl/sinterklaas/2006/schoen1.jpg',
0.10, 245, @IdProduct, @IdSupplier
Delete
De stored procedure maken
-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Saturday 9th of January 2016 01:46:21 PM
-- DML Delete Stored Procedure for Product
--
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'ProductDelete'))
BEGIN
DROP PROCEDURE ProductDelete
END
GO
CREATE PROCEDURE "ProductDelete"
(
@Id INT
)
AS
BEGIN
DELETE FROM "Product"
WHERE "Product"."Id" = @Id;
END
GO
Test
use Mikmak go -- zoek de id van de product op declare @IdProduct int set @IdProduct = (select Id from Product where Name = 'Nice Boots') -- delete het product exec ProductDelete @IdProduct
Voeg het gedelete product weer toe. Let erop dat de Id nu 2 is. De Id's van gedelete rijen worden niet hergebruikt!
use Mikmak
go
-- zoek eerst de id van de supplier op
declare @IdSupplier int
set @IdSupplier = (select Id from Supplier where Name = 'De Schoenmaker')
-- insert
declare @NewId int
exec ProductInsert 'Met deze schoenen loop je tot naar Timbuktu',
'Nice Boots', 20.5, 3.5, 5,
'http://www.ida.classy.be/wp18/Schoen_strikken.jpg',
'http://www.schilberg.nl/sinterklaas/2006/schoen1.jpg',
0.10, 245, @NewId OUTPUT, @IdSupplier
print @NewId
SelectOne
We hebben niet alleen de Id van de leverancier nodig maar ook de Name.
-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Saturday 9th of January 2016 01:46:21 PM
-- DML SelectOne Stored Procedure for Product
--
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'ProductSelectOne'))
BEGIN
DROP PROCEDURE ProductSelectOne
END
GO
CREATE PROCEDURE "ProductSelectOne"
(
@Id INT
)
AS
BEGIN
SELECT "Description",
"Product"."Name",
"Price",
"ShippingCost",
"TotalRating",
"Thumbnail",
"Image",
"DiscountPercentage",
"Votes",
"Product"."Id",
"IdSupplier",
"Supplier"."Name" AS "SupplierName"
FROM "Product"
INNER JOIN Supplier
ON "Product"."IdSupplier" = "Supplier"."Id"
WHERE "Product"."Id" = @Id;
END
GO
Test
use Mikmak go -- zoek de id van de product op declare @IdProduct int set @IdProduct = (select Id from Product where Name = 'Nice Boots') -- delete het product exec ProductSelectOne @IdProduct
SelectAll
De stored procedure maken
-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Saturday 9th of January 2016 01:46:21 PM
-- DML SelectAll Stored Procedure for table Product
--
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'ProductSelectAll'))
BEGIN
DROP PROCEDURE ProductSelectAll
END
GO
CREATE PROCEDURE "ProductSelectAll"
AS
BEGIN
SELECT "Product"."Name",
"Product"."Price",
"Product"."ShippingCost",
"Product"."TotalRating",
"Product"."DiscountPercentage",
"Product"."Votes",
"Product"."Id",
"Supplier"."Name" as "SupplierName",
"Product"."IdSupplier"
FROM "Product"
INNER JOIN "Supplier"
ON "Product"."IdSupplier" = "Supplier"."Id"
ORDER BY "Name";
END
GO
Test
use Mikmak
go
exec ProductSelectAll
SelectXName
De X in de naam staat voor een willekeurige waarde in de naam. In de WHERE clausule van het SQL statement gebruiken we daarvoor de LIKE operator en twee % jokers, een voor de tekst die we zoeken en één erna.
De procedure maken
-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Saturday 9th of January 2016 01:46:21 PM
-- DML SelectLikeXName Stored Procedure for table Product
--
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'ProductSelectLikeXName'))
BEGIN
DROP PROCEDURE ProductSelectLikeXName
END
GO
CREATE PROCEDURE "ProductSelectLikeXName"
(
@Name NVARCHAR (255)
)
AS
BEGIN
SELECT "Product"."Name",
"Product"."Price",
"Product"."ShippingCost",
"Product"."TotalRating",
"Product"."DiscountPercentage",
"Product"."Votes",
"Product"."Id",
"Supplier"."Name" as "SupplierName",
"Product"."IdSupplier"
FROM "Product"
INNER JOIN "Supplier"
ON "Product"."IdSupplier" = "Supplier"."Id"
WHERE "Product"."Name" like CONCAT('%', @Name, '%')
ORDER BY "Product"."Name" ;
END
GO
Test
Alle drie de statements gaan het product met de naam 'Nice Boots' retourneren:
exec ProductSelectLikeXName 'boot' exec ProductSelectLikeXName 'nice' exec ProductSelectLikeXName 'boot'
SelectByIdSupplier
Maak de stored procedure
-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Saturday 9th of January 2016 01:46:21 PM
-- DML SelectByIdSupplier Stored Procedure for table Product
--
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'ProductSelectByIdSupplier'))
BEGIN
DROP PROCEDURE ProductSelectByIdSupplier
END
GO
CREATE PROCEDURE "ProductSelectByIdSupplier"
(
@IdSupplier INT
)
AS
BEGIN
SELECT "Product"."Name",
"Product"."Price",
"Product"."ShippingCost",
"Product"."TotalRating",
"Product"."DiscountPercentage",
"Product"."Votes",
"Product"."Id",
"Supplier"."Name" as "SupplierName",
"Product"."IdSupplier"
FROM "Product"
INNER JOIN "Supplier" as "Supplier"
ON "Product"."IdSupplier" = "Supplier"."Id"
WHERE "Product"."IdSupplier" = @IdSupplier;
END
GO
Test
-- zoek eerst de id van de supplier op declare @IdSupplier int set @IdSupplier = (select Id from Supplier where Name = 'De Schoenmaker') -- delete het product exec ProductSelectByIdSupplier @IdSupplier
SelectByNameSupplier
Deze stored procedure is anders dan de vorige. We willen nu niet meer zoeken op de Id van Supplier in de Product tabel, maar op de naam van de leverancier. Die staat niet in de tabel Product dus moeten we die koppelen aan de tabel Supplier en op de Name kolom van deze tabel zoeken.
-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Saturday 9th of January 2016 01:46:21 PM
-- DML SelectByNameSupplier Stored Procedure for table Product
--
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'ProductSelectByNameSupplier'))
BEGIN
DROP PROCEDURE ProductSelectByNameSupplier
END
GO
CREATE PROCEDURE "ProductSelectByNameSupplier"
(
@NameSupplier NVARCHAR(255)
)
AS
BEGIN
SELECT "Product"."Name",
"Product"."Price",
"Product"."ShippingCost",
"Product"."TotalRating",
"Product"."DiscountPercentage",
"Product"."Votes",
"Product"."Id",
"Supplier"."Name" as "SupplierName",
"Product"."IdSupplier"
FROM "Product"
INNER JOIN "Supplier" as "Supplier"
ON "Product"."IdSupplier" = "Supplier"."Id"
WHERE "Supplier"."Name" = @NameSupplier;
END
GO
Test
exec ProductSelectByNameSupplier 'De Schoenmaker'