En STORED PROCEDURE (SP) er SQL-kode, som du har gemt, så koden kan bruges igen og igen.
Hvis du har en SQL-forespørgsel, du skriver igen og igen, vil det være en fordel at gemme den som en SP. Du skal så bare “kalde” den for at få udført SQL koden.
Du kan også sende parametre/variabler til en SP. Hvilket gør at én SP kan bruges til flere forskellige udtræk.
Det kan f.eks. være; kundenummer, produktnummer, dato/måned/år eller lignede du brugere som parameter/variabel.
Syntaks for en STORED PROCEDURE
CREATE PROCEDURE procedure_navn
AS
sql_kode;
GO;
Når du skal “køre”/afvikle en STORED PROCEDURE skal du bruge denne SQL kommando:
EXEC procedure_navn;
En SP bliver gemt i databasen, du kan se hvilke SP der ligger på den enkelte database i mappen Stored Procedueres
Der er flere fordele ved at bruge SP:
Der er dog også nogle ulemper ved at bruge SP:
Når du skal oprette en SP er det nødvendigt først at bruge en anden SQL kommando, DELIMITER.
Problemet er at vi ønsker at sende hele SQL kommandoen for SP til serveren. I den SQLkode der indgår i SP’en er der en “indlejret” SQL kode afsluttes med ;.
Derfor kan man med MySQL bruge DELIMITER når man starter og afslutter en SP, da semikolon ikke længere kan bruges.
Du kan bruge flere forskellige “tegn” til DELIMITER f.eks. // eller $$
Her sættes DELIMITER til // og tilbage til ;
DELIMITER //
CREATE PROCEDURE procedure_navn
AS
sql_kode;
GO;
DELIMITER ;
Det er ikke kun når du opretter SP at det er nødvendigt, det glæder f.eks. også når du skal oprette Trigger.
En af de store fordele ved en SP er at du kan bruge variabler, hvilket gør dine SP’er mere fleksible.
Når du vil bruge en variabel skal du angive (dimensionere) dens datatype. Det er de samme datatyper som ved oprettelse af felter i en tabel du skal bruge.
Eksempel Northwind med én variabel (Aar) af typen INT - her er det retur typen af funktionen YEAR der afgør datatypen.
DELIMITER $$
CREATE PROCEDURE OrderByYear(Aar INT)
BEGIN
SELECT * FROM Orders
WHERE YEAR(OrderDate) = Aar;
END $$
DELIMITER ;
Når du vil afvikle denne SP gøres det på følgende måde.
Eksempel med året 1996
CALL OrderByYear(1996);
Det er også muligt at brugere flere variabler. De skal bare angives adskilt af et ,
Eksempel fra Northwind
DELIMITER $$
CREATE PROCEDURE OrderByYearMonth(Aar INT, Mdr INT)
BEGIN
select
Products.ProductID,
Products.ProductName
from Products
join Order_Details
on Products.ProductID = Order_Details.ProductID
join Orders
on Order_Details.OrderID = Orders.OrderID
where year(Orders.OrderDate) = Aar and
month(Orders.orderdate) = Mdr;
END $$
DELIMITER ;
Når du skal afvikle en SP med flere variabler skal angive dem i samme rækkefølge som de er oprettet.
CALL OrderByYearMonth (1997, 5);
Du kan få vist de SP’er der er i den enkelte database med denne SQL kommando
SHOW PROCEDURE STATUS WHERE db = 'database_navn';
Hvis du gerne vil se SQLkoden for en bestemt SP kan du bruge denne SQL kommando:
SHOW CREATE PROCEDURE procedure_navn;
Du sletter en SP ved at brugere denne SQL kommando
DROP PROCEDURE `datbase_navn`.`sp_navn`;
Tip - Du kan også højreklikke på en SP i Workbench og vælge DROP Stored Procedure
En Trigger er SQL kode, der afvikles automatisk, når en af følgende handlinger sker
på den tabel hvor triggeren er oprettet.
Du kan betragte en TRIGGER som en speciel STORED PROCEDURE. Forskellen er at en TRIGGER bliver afviklet automatisk ved en af de tre førnævnte handlinger. Mens en STORED PROCEDURE skal afvikles “manuelt”.
Triggere er gode til opgaver som:
Du opretter en TRIGGER på følgende måde:
CREATE TRIGGER
trigger_navn
trigger_time
trigger_event
ON tabel_navn
FOR EACH ROW
BEGIN
SQL kode
END;
Eksemple fra Northwind
DELIMITER $$
CREATE TRIGGER before_employee_update
BEFORE UPDATE ON Employees
FOR EACH ROW
BEGIN
INSERT INTO employees_audit
SET action = 'update',
EmployeeID = OLD.EmployeeID,
LastName = OLD.LastName,
changedat = NOW();
END $$
DELIMITER ;
En TRIGGER bliver gemt “under”/på en tabel - den tabel som en af de tre handlinger udføres på.
Du kan med denne SQL kommando se dine TRIGGER
SHOW TRIGGERS;
eller
SHOW TRIGGERS FROM northwind;
eller
SHOW TRIGGERS FROM northwind
WHERE `table` = 'Employees';
Bemærk tegnet før og efter table
Der er også en anden måde du kan se de forskellige TRIGGER du har. Det er sådan at definitionen på dine TRIGGERE bliver gemt i en system tabel ved navn: information_schema
Se alle TRIGGERE på en bestemt database
SELECT * FROM
information_schema.triggers
WHERE
trigger_schema = 'database_navn';
Der er også muligt at finde alle TRIGGERS for en bestemt tabel.
SELECT * FROM
information_schema.triggers
WHERE
trigger_schema = 'database_navn'
AND event_object_table = 'table_navn';
Du sletter en TRIGGER ved at bruge denne SQL kommando
DROP TRIGGER trigger_navn;
slides for dag 5 - slides dag 5
Noter for dag 5 - Noter dag 5
Helt færdigt ER-diagram
Stored Procedure
Trigger