--kasutan andmebaasi, mis juba olemas on
use AdventureWorksDW2019
--loon uus tabel
create table currencies(
currencyID INT NOT NULL PRIMARY KEY identity (1,1),
countryName varchar(25),
currencyKey char(3)
);
--lisan andmed
insert into currencies (countryName, currencyKey) values(
'Japan', 'JPY'),('Denmark', 'DKK'),('Sweden', 'SEK');
select * from currencies
--loon protseduuri, mille abil saan muuta juba tabelisse sisestatud andmeid
create Procedure currencyUpdate
as
Begin
Begin Try
Begin Transaction
Update currencies set currencyKey = 'GBP', countryName = 'United Kingdom'
where currencyID = 1
Commit Transaction
End Try
Begin Catch
Rollback Transaction
End Catch
End
--käivitan protseduuri, tehes topeltklõpsu protseduuri nimele.
procedure currencyUpdate
select * from currencies
--muudan protseduuri niimodi, et see näitab edukalt/mitteedukalt seis tsikli lõpus
--ja et saada Rollback seis
alter procedure currencyUpdate
as
begin
begin try
begin transaction
--muutan siin andmed tagasi, nagu olnud tabeli loomiseajal
update currencies set currencyKey = 'JPY', countryName = 'Japan'
where currencyID = 1
--aga siin teen spetsiaalselt viga, et saada Rollback seis
update currencies set currencyKey = 'GBP', countryName = 'The United Kingdom of Great Britain and Northern Ireland'
where currencyID = 2
print 'transaktsioon committed!'
commit transaction
end try
begin catch
rollback transaction
print 'transaktsioon rolled back!'
end catch
end
--nagu näha, ei muutunud midagi, sest minu 'countryName' veerg ei luba rohkem kui
--25 sümbolit, seega esimene muudatus ei rakendunud ja kõik jäi samaks nagu enne
--tehingu käivitamist
XAMPP
-- kasutan andmebaasi, mis juba olemas on
use world_andmebaas
-- loon uus tabel
create table currencies(
currencyID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
countryName varchar(25),
currencyKey char(3)
);
-- lisan andmed
insert into currencies (countryName, currencyKey) values(
'Japan', 'JPY'),('Denmark', 'DKK'),('Sweden', 'SEK');
select * from currencies
-- loon protseduuri, mille abil saan muuta juba tabelisse sisestatud andmeid
DELIMITER //
CREATE PROCEDURE currencyUpdate()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
END;
START TRANSACTION;
UPDATE currencies
SET currencyKey = 'GBP', countryName = 'United Kingdom'
WHERE currencyID = 1;
COMMIT;
END;
//
DELIMITER ;
-- eemaldan vana protseduur, sest xampp-is 'alter table' ei tööta
DROP PROCEDURE IF EXISTS currencyUpdate;
-- -muudan protseduuri niimodi, et see näitab edukalt/mitteedukalt seis tsikli lõpus
-- ja et saada Rollback seis
DELIMITER //
CREATE PROCEDURE currencyUpdate()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SELECT 'transaktsioon rolled back!' AS staatus;
END;
START TRANSACTION;
-- muutan siin andmed tagasi, nagu olnud tabeli loomiseajal
UPDATE currencies
SET currencyKey = 'JPY', countryName = 'Japan'
WHERE currencyID = 1;
-- aga siin teen spetsiaalselt viga, et saada Rollback seis
UPDATE currencies
SET currencyKey = 'GBP', countryName = 'The United Kingdom of Great Britain and Northern Ireland'
WHERE currencyID = 2;
COMMIT;
SELECT 'transaktsioon committed!' AS staatus;
END;
//
DELIMITER ;
-- sel juhul ilmus teade tehingu eduka rakendamise kohta, kuid pöörake tähelepanu viimasele reale: Data truncated
-- see tähendab, et vaatamata 25 tähemärgi piirangule lõikas mysql kõik ära, mis sisse ei mahtunud, ja salvestas selle
-- soovi korral saab seda nõuet sundida nii, et see seda ei teeks, kuna standardi kohaselt ei pea mysql seda veaks