Stored Procedures, Function, Trigger, Dynamic SQL, Cursor Introduction SMART DATABASE
Apa Itu Smart Database?? Database yang menyimpan bisnis logic Database yang konsisten Database yang smart Database yang bukan hanya sekedar menyimpan data, tetapi dapat menjalankan bisnis logic dan dapat menjaga konsistensi data, sehingga dapat bekerja sebagai database yang smart
3-Tier Architecture
Object-Object Smart Database Stored Procedures Function Trigger Dynamic SQL Cursor
Apakah STORED PROCEDURES itu? STORED PROCEDURES Perintah SQL yang disimpan pada Database
a. Eksekusi yang sudah dikompilasi. b. Mengurangi trafik client/server. c. Efisiensi penggunaan code dan abtraksi pemrograman. d. Meningkatkan control keamanan pengguna. Keuntungan Menggunakan STORED PROCEDURES
Stored Procedures Syntax CREATE PROC[EDURE][schema.] procedure [ { @parameter [schema.] data_type } [VARYING ] [ = default ] [ OUT[PUT] ] ] [,...n ] [WITH Option [,...n ]] AS { sql_statement [;][...n ] EXTERNAL NAME assembly.class.method } [;] ALTER PROCEDURE EXEC Execute Procedure DROP PROCEDURE
STORED PROCEDURES Samples (1) CREATE PROCEDURE [dbo].[getproducts] AS SELECT ProductID, ProductName FROM Products EXEC GetProducts
STORED PROCEDURES Samples (2) CREATE PROCEDURE OrderSummary @MaxQuantity INT OUTPUT AS SELECT Ord.EmployeeID, SummSales = SUM(OrDet.UnitPrice * OrDet.Quantity) FROM Orders AS Ord JOIN [Order Details] AS OrDet ON (Ord.OrderID = OrDet.OrderID) GROUP BY Ord.EmployeeID ORDER BY Ord.EmployeeID SELECT @MaxQuantity = MAX(Quantity) FROM [Order Details] RETURN (SELECT SUM(Quantity) FROM [Order Details])
STORED PROCEDURES Samples (2) DECLARE @OrderSum INT DECLARE @LargestOrder INT EXEC @OrderSum = OrderSummary @MaxQuantity = @LargestOrder OUTPUT PRINT 'The size of the largest single order was: ' + CONVERT(CHAR(6), @LargestOrder) PRINT 'The sum of the quantities ordered was: ' + CONVERT(CHAR(6), @OrderSum)
STORED PROCEDURES Samples (3) CREATE PROCEDURE CustomerOrder @CustID nvarchar(5) AS SELECT orderid,customerid,orderdate FROM Orders WHERE CustomerID=@CustID EXEC CustomerOrder @CustID='WILMK'
Apakah FUNCTION itu? FUNCTION Kumpulan query yang disimpan menjadi satu
a. Penggunaan kembali code, sehingga mengurangi waktu pembuatan. b. Menyembunyikan detail SQL. c. Tersentralisasi, sehingga memudahkan jika bisnis logic mengalami perubahan. Keuntungan Menggunakan FUNCTION
Function adalah subprogram yang harus mengembalikan nilai (menggunakan keyword RETURN) Function digunakan pada perintah SELECT, tetapi stored procedures tidak dapat digunakan didalam perintah SELECT. Function hanya mempunyai parameter IN, sedangkan stored procedures dapat terdiri atas parameter OUT atau INOUT Perbedaan STORED PROCEDURES dan FUNCTION Stored Procedure dapat mengembalikan banyak nilai menggunakan parameter OUT, atau tidak mengembalikan nilai sama sekali.
Function Syntax CREATE FUNCTION [schema.] function ( [@parameter [ AS ][type_schema.] parameter_data_type [= default ] [,...n ] ]) RETURNS return_clause... [;] ALTER FUNCTION DROP FUNCTION
Ada 3 tipe User-Defined Functions : 1. Scalar 2. Inline Table-Valued 3. Multi-Statement Table-Valued Tipe Function
FUNCTION Samples (1) - Scalar CREATE FUNCTION WhichContinent (@Country nvarchar(15)) RETURNS varchar(30) AS BEGIN declare @Return varchar(30) select @Return = case @Country when 'Argentina' then 'South America' when 'Belgium' then 'Europe' when 'Brazil' then 'South America' when 'Canada' then 'North America' when 'Denmark' then 'Europe' when 'Finland' then 'Europe' when 'France' then 'Europe' else 'Unknown' end return @Return END
FUNCTION Samples (1) - Scalar PRINT dbo.whichcontinent('usa') SELECT dbo.whichcontinent(customers.country), customers.* FROM customers
FUNCTION Samples (2) Inline Table Valued CREATE FUNCTION CustomersByContinent (@Continent varchar(30)) RETURNS TABLE AS RETURN SELECT dbo.whichcontinent(customers.country) as continent, customers.* FROM customers WHERE dbo.whichcontinent(customers.country) = @Continent
FUNCTION Samples (2) Inline Table Valued SELECT * FROM CustomersbyContinent('North America') SELECT * FROM CustomersByContinent('South America') SELECT * FROM CustomersbyContinent('Unknown')
FUNCTION Samples (3) Multi Statement Table Valued CREATE FUNCTION dbo.customersbycountry( @Country varchar(15) ) RETURNS @CustomersbyCountryTab table ( [CustomerID] [nchar] (5), [CompanyName] [nvarchar] (40), [ContactName] [nvarchar] (30), [ContactTitle] [nvarchar] (30), [Address] [nvarchar] (60), [City] [nvarchar] (15), [PostalCode] [nvarchar] (10), [Country] [nvarchar] (15), [Phone] [nvarchar] (24), [Fax] [nvarchar] (24) ) AS BEGIN
FUNCTION Samples (3) Multi Statement Table Valued INSERT INTO @CustomersByCountryTab SELECT [CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address], [City], [PostalCode], [Country], [Phone], [Fax] FROM [Northwind].[dbo].[Customers] WHERE country = @Country
FUNCTION Samples (3) Multi Statement Table Valued DECLARE @cnt INT SELECT @cnt = COUNT(*) FROM @customersbycountrytab IF @cnt = 0 INSERT INTO @CustomersByCountryTab ( [CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address], [City], [PostalCode], [Country], [Phone], [Fax] ) VALUES ('','No Companies Found','','','','','','','','') RETURN END
FUNCTION Samples (3) Multi Statement Table Valued SELECT * FROM dbo.customersbycountry('usa') SELECT * FROM dbo.customersbycountry('canada') SELECT * FROM dbo.customersbycountry('adf')
Apakah TRIGGER itu? TRIGGER Sekumpulan perintah yang secara otomatis dijalankan apabila data didalam tabel berubah karena perintah SQL (insert, update, delete)
a. Melakukan update data otomatis ketika terjadi perubahan b. Mengimplementasikan sistem log. c. Validasi dan verifikasi data sebelum data tersebut tersimpan. Keuntungan Menggunakan TRIGGER
Timing Trigger FOR / AFTER, trigger dijalankan setelah DML Event pada tabel. INSTEAD OF, trigger dijalankan sebelum DML Event pada tabel. INSTEAD OF dapat dijalankan pada sebuah view. Event Trigger INSERT, trigger dijalankan pada saat melakukan penambahan data. UPDATE, trigger dijalankan pada saat melakukan update data. DELETE, trigger dijalankan pada saat data dihapus.
TRIGGER Samples (1) CREATE TABLE dbo.audittrail ( AuditTrailID Int IDENTITY (1, 1) NOT NULL, TableName VarChar (50) NOT NULL, ActionTaken Char (1) NOT NULL, ActionUser VarChar (50) NOT NULL, ActionDate DateTime NOT NULL ) ON [PRIMARY] Column Datatype NULL AuditTrailID Identity Not allowed TableName VarChar(50) Not allowed ActionTaken Char(1) Not allowed ActionUser VarChar(50) Not Allowed ActionDate DateTime Not Allowed
TRIGGER Samples (1) CREATE TRIGGER [AuditInsertUpdate] ON dbo.products FOR INSERT, UPDATE AS INSERT INTO AuditTrail (TableName, ActionTaken, ActionUser, ActionDate) VALUES ('Products', 'I', User_Name(), GetDate()) CREATE TRIGGER [AuditDelete] ON dbo.products FOR DELETE AS INSERT INTO AuditTrail (TableName, ActionTaken, ActionUser, ActionDate) VALUES ('Products', 'D', User_Name(), GetDate())
TRIGGER Samples (1) UPDATE dbo.products SET UnitPrice = 1 WHERE ProductID = 1 SELECT * FROM dbo.audittrail
TRIGGER Samples (2) CREATE TABLE [dbo].[triggertest] ([au_id] [int] NULL, [au_name] [varchar] (50)) CREATE TRIGGER tr_insertconcatname ON employees FOR INSERT AS DECLARE @EmpID INT DECLARE @ConcatName VARCHAR(50) SELECT @EmpID = (SELECT EmployeeID FROM Inserted) SELECT @ConcatName = (SELECT LastName + ', ' + FirstName FROM Inserted) INSERT TriggerTest VALUES (@EmpID,@ConcatName) INSERT employees (employeeid, lastname, firstname, title) VALUES (10,'Woody', 'Buck', Sales Manager )
TRIGGER Samples (2) CREATE TRIGGER tr_updateconcatname ON employees FOR UPDATE AS DECLARE @EmpID INT DECLARE @NewConcatName VARCHAR(50) SELECT @EmpID = (SELECT EmployeeID FROM Inserted) SELECT @NewConcatName = (SELECT Lastname + ', ' + Firstname FROM Inserted) UPDATE TriggerTest SET au_name = @NewConcatName WHERE au_id = @EmpID UPDATE employees SET firstname = 'Greg' WHERE EmployeeID = 10
TRIGGER Samples (2) CREATE TRIGGER tr_deleteconcatname ON employees FOR DELETE AS DECLARE @EmpID INT SELECT @EmpID =(SELECT EmployeeID FROM Deleted) DELETE FROM TriggerTest WHERE au_id = @EmpID DELETE FROM employees WHERE EmployeeID = 10
Apakah DYNAMIC SQL Itu? DYNAMIC SQL Suatu teknik pemrograman SQL Code yang memungkinkan menuliskan perintah SQL secara dinamis sebelum dieksekusi
4 a. Isi perintah SQL ditentukan pada saat sebelum dieksekusi. b. Fleksibilitas karena perintah SQL dianggap sebagai STRING. c. Tidak perlu compile ulang jika terjadi perubahan perintah SQL. Keuntungan Menggunakan DINAMIC SQL
Static SQL Dinamic SQL STATIC SQL Isi perintah tidak dapat dirubah pada saat eksekusi (runtime). Perintah SQL dianggap sebagai bagian dari program. Fleksibilitas rendah karena perintah SQL dianggap sudah fix/tetap. Sebagian proses dilakukan pada saat kompilasi sehingga secara umum performansi lebih baik dibanding Dynamic SQL. DYNAMIC SQL Isi perintah belum dapat diketahui sebelum eksekusi (runtime) shg harus ditentukan pada saat runtime. Perintah SQL dianggap sebagai string biasa sebelum proses eksekusi. Fleksibilitas tinggi karena perintah SQL dapat diubah-ubah pada saat eksekusi. Semua proses dilakukan pada saat eksekusi sehingga secara umum performansi kurang dibanding Static SQL.
Bagaimana menjalankan? Dinamic SQL Membuat Query dengan Parameter Menggunakan EXEC Menggunakan sp_executesql
Dynamic SQL Samples (1) DECLARE @City nvarchar(15) SET @city='paris' SELECT * FROM customers WHERE city=@city DECLARE @sqlcommand varchar(1000) DECLARE @columnlist varchar(75) DECLARE @city nvarchar(15) SET @columnlist = 'CustomerID, ContactName, City' SET @city = '''London''' SET @sqlcommand = 'SELECT ' + @columnlist + ' FROM customers WHERE City = ' + @city EXEC (@sqlcommand) DECLARE @sqlcommand nvarchar(1000) DECLARE @columnlist varchar(75) DECLARE @city nvarchar(15) SET @columnlist = 'CustomerID, ContactName, City' SET @city = '''London''' SET @sqlcommand = 'SELECT ' + @columnlist + ' FROM customers WHERE City = @city' EXECUTE sp_executesql @sqlcommand, N'@city nvarchar(75)', @city = @city
Dynamic SQL Samples (2) CREATE PROCEDURE GenericTableSelect @TableName VarChar(100) AS DECLARE @SQL VarChar(1000) SET @SQL = 'SELECT * FROM ' SET @SQL = @SQL + @TableName EXEC (@SQL) Dinamic SQL pada STORED PROCEDURE
Apakah CURSOR itu? CURSOR Object database yang dapat menampung banyak data untuk dimanipulasi baris per baris.
5 a. Menghasilkan data-data spesifik sesuai kebutuhan. b. Membantu penggunaan stored procedure yang berhubungan dengan manipulasi data. Keuntungan Menggunakan CURSOR
Daur Hidup Cursor» DECLARE, mendeklarasikan cursor sehingga terbentuk di memory Server Database.» OPEN, mengaktifkan cursor sehingga cursor dapat menampung data.» FETCH, mengambil data dari cursor untuk ditampung kedalam variabel.» WHILE, melakukan perulangan pada cursor jika operasi FETCH berhasil.» CLOSE, menonaktifkan cursor, tetapi bisa dibuka kembali.» DEALLOCATE, menghapus cursor, sehingga tidak bisa dibuka kembali.
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR FOR select_statement [FOR {READ ONLY UPDATE [OF column_name [,...n]]}] OPEN { { [GLOBAL] cursor_name } cursor_variable_name} CURSOR Syntax FETCH [[ NEXT PRIOR FIRST LAST ABSOLUTE {n @nvar} RELATIVE {n @nvar} ] FROM ] { { [GLOBAL] cursor_name } @cursor_variable_name} [INTO @variable_name[,...n] ] CLOSE { {[GLOBAL] cursor_name } cursor_variable_name } DEALLOCATE { { [GLOBAL] cursor_name } @cursor_variable_name}
CURSOR Samples DECLARE @ProductName nvarchar(40) DECLARE @idx int SET @idx=1 DECLARE @getproductname CURSOR SET @getproductname = CURSOR FOR SELECT ProductName FROM Products OPEN @getproductname FETCH NEXT FROM @getproductname INTO @ProductName WHILE @@FETCH_STATUS = 0 BEGIN PRINT 'Product #' + CAST(@idx AS char(3)) + @ProductName SET @idx= @idx+1 FETCH NEXT FROM @getproductname INTO @ProductName END CLOSE @getproductname DEALLOCATE @getproductname
Thank You & Good Luck THE END