Mikmak MsSQL DML Product
Home

Mikmak MsSQL DML Product

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'

JI
2017-01-17 21:48:18