mod-pbd-6

3
1 Pemograman Basisdata “ROUTINGS – User-Defined Function & Store Procedure” Modul VI Objective: 1. Memahami Konsep Procedure dan Function di T-SQL. 2. Penggunaan Parameter dalam Procedure dan Function di T-SQL. 3. Cara Pengaksesan Procedure dan Function di T-SQL. Rutinitas/Routings adalah objek diprogram yang merangkum kode untuk menghitung sebuah hasil atau untuk melaksanakan aktivitas. SQL Server mendukung tiga jenis rutinitas: user-defined Function, Stored Procedure, dan Trigger. SQL Server memungkinkan Anda untuk memilih apakah akan mengembangkan rutinitas dengan T-SQL atau dengan Microsoft. NET kode didasarkan pada integrasi CLR dalam produk tersebut. Karena fokus modul-modul ini adalah T- SQL, contoh di sini menggunakan T-SQL. Secara umum, ketika tugas di tangan terutama melibatkan manipulasi data, T-SQL biasanya merupakan pilihan yang lebih baik. Ketika tugas ini lebih lanjut tentang logika berulang, manipulasi string, atau operasi komputasi intensif,. NET kode biasanya merupakan pilihan yang lebih baik. User-Defined Functions Tujuan dari user-defined function (UDF) adalah untuk membungkus logika untuk menghitung sesuatu, didasarkan pada parameter input, dan mengembalikan hasilnya. SQL Server mendukung UDF skalar dan table-value(Inline). UDF skalar mengembalikan nilai tunggal; UDF table-value kembali meja. Salah satu manfaat menggunakan UDF adalah bahwa Anda dapat memasukkan mereka dalam perintah query. UDF skalar dapat muncul di mana saja di query di mana ekspresi yang mengembalikan nilai tunggal dapat muncul (misalnya, dalam SelectList tersebut). Tabel UDF dapat muncul di klausa FROM query. Contoh dalam bagian ini adalah UDF skalar. Sebagai contoh, kode berikut membuat UDF disebut dbo.GetAgethat mengembalikan usia seseorang dengan tanggal lahir tertentu (@birthdate argumen) pada tanggal acara tertentu (@EVENTDATE argumen) IF OBJECT_ID('dbo.GetAge') IS NOT NULL DROP FUNCTION dbo.GetAge; GO CREATE FUNCTION dbo.GetAge ( @birthdate AS DATE, @eventdate AS DATE ) RETURNS INT AS BEGIN RETURN DATEDIFF(year, @birthdate, @eventdate) - CASE WHEN 100 * MONTH(@eventdate) + DAY(@eventdate) < 100 * MONTH(@birthdate) + DAY(@birthdate) THEN 1 ELSE 0 END; END; GO Fungsi menghitung jarak perbedaan usia dalam tahun, antara tahun yaitu kelahiran dan tahun event, dikurangi 1 tahun dalam kasus-kasus dimana tahun, bulan event, dan hari lebih kecil dari bulan dan hari kelahiran. Ekspresi 100 * Month + day, hanyalah sebuah trik untuk menggabungkan bulan dan hari. Sebagai contoh, untuk hari kedua belas di bulan Februari, ekspresi menghasilkan integer 212. Perhatikan bahwa fungsi dapat memiliki lebih dari sekedar klausa RETURN didalamnya. Hal ini dapat memiliki kode dengan elemen aliran, perhitungan, dan banyak lagi. Tetapi fungsi harus memiliki klausa RETURN yang mengembalikan nilai. Untuk menunjukkan menggunakan UDF dalam query, kode berikut adalah query ke tabel HR.Employees dan memanggil fungsi getAge dalam SelectList untuk menghitung usia setiap karyawan saat ini.

Upload: fahrizal-nuansa

Post on 19-Jan-2016

6 views

Category:

Documents


0 download

DESCRIPTION

MOD-PBD-6

TRANSCRIPT

Page 1: MOD-PBD-6

1

Pemograman Basisdata “ROUTINGS – User-Defined Function & Store Procedure”

Modul VI

Objective:

1. Memahami Konsep Procedure dan Function di T-SQL.

2. Penggunaan Parameter dalam Procedure dan Function di T-SQL.

3. Cara Pengaksesan Procedure dan Function di T-SQL.

Rutinitas/Routings adalah objek diprogram yang merangkum kode untuk menghitung sebuah hasil atau

untuk melaksanakan aktivitas. SQL Server mendukung tiga jenis rutinitas: user-defined Function, Stored

Procedure, dan Trigger. SQL Server memungkinkan Anda untuk memilih apakah akan mengembangkan

rutinitas dengan T-SQL atau dengan Microsoft. NET

kode didasarkan pada integrasi CLR dalam produk tersebut. Karena fokus modul-modul ini adalah T-

SQL, contoh di sini menggunakan T-SQL. Secara umum, ketika tugas di tangan terutama melibatkan

manipulasi data, T-SQL biasanya merupakan pilihan yang lebih baik. Ketika tugas ini lebih lanjut

tentang logika berulang, manipulasi string, atau operasi komputasi intensif,. NET kode biasanya

merupakan pilihan yang lebih baik.

User-Defined Functions

Tujuan dari user-defined function (UDF) adalah untuk membungkus logika untuk menghitung sesuatu,

didasarkan pada parameter input, dan mengembalikan hasilnya.

SQL Server mendukung UDF skalar dan table-value(Inline). UDF skalar mengembalikan nilai tunggal; UDF

table-value kembali meja. Salah satu manfaat menggunakan UDF adalah bahwa Anda dapat

memasukkan mereka dalam perintah query. UDF skalar dapat muncul di mana saja di query di mana

ekspresi yang mengembalikan nilai tunggal dapat muncul (misalnya, dalam SelectList tersebut). Tabel

UDF dapat muncul di klausa FROM query. Contoh dalam bagian ini adalah UDF skalar.

Sebagai contoh, kode berikut membuat UDF disebut dbo.GetAgethat mengembalikan usia seseorang

dengan tanggal lahir tertentu (@birthdate argumen) pada tanggal acara tertentu (@EVENTDATE

argumen)

IF OBJECT_ID('dbo.GetAge') IS NOT NULL DROP FUNCTION dbo.GetAge; GO CREATE FUNCTION dbo.GetAge ( @birthdate AS DATE, @eventdate AS DATE ) RETURNS INT AS BEGIN RETURN DATEDIFF(year, @birthdate, @eventdate) - CASE WHEN 100 * MONTH(@eventdate) + DAY(@eventdate) < 100 * MONTH(@birthdate) + DAY(@birthdate) THEN 1 ELSE 0 END; END; GO

Fungsi menghitung jarak perbedaan usia dalam tahun, antara tahun yaitu kelahiran dan tahun

event, dikurangi 1 tahun dalam kasus-kasus dimana tahun, bulan event, dan hari lebih kecil dari bulan

dan hari kelahiran. Ekspresi 100 * Month + day, hanyalah sebuah trik untuk menggabungkan bulan dan

hari. Sebagai contoh, untuk hari kedua belas di bulan Februari, ekspresi menghasilkan integer 212.

Perhatikan bahwa fungsi dapat memiliki lebih dari sekedar klausa RETURN didalamnya. Hal ini

dapat memiliki kode dengan elemen aliran, perhitungan, dan banyak lagi. Tetapi fungsi harus memiliki

klausa RETURN yang mengembalikan nilai.

Untuk menunjukkan menggunakan UDF dalam query, kode berikut adalah query ke tabel

HR.Employees dan memanggil fungsi getAge dalam SelectList untuk menghitung usia setiap karyawan

saat ini.

Page 2: MOD-PBD-6

2

Pemograman Basisdata “ROUTINGS – User-Defined Function & Store Procedure”

Modul VI

SELECT empid, firstname, lastname, birthdate, dbo.GetAge(birthdate, SYSDATETIME()) AS age FROM HR.Employees

Result set:

empid firstname lastname birthdate age ----------- ---------- -------------------- ----------------------- ----------- 1 Sara Davis 1958-12-08 00:00:00.000 55 2 Don Funk 1962-02-19 00:00:00.000 52 3 Judy Lew 1973-08-30 00:00:00.000 40 4 Yael Peled 1947-09-19 00:00:00.000 66 5 Sven Buck 1965-03-04 00:00:00.000 49 6 Paul Suurs 1973-07-02 00:00:00.000 40 7 Russell King 1970-05-29 00:00:00.000 43 8 Maria Cameron 1968-01-09 00:00:00.000 46 9 Zoya Dolgopyatova 1976-01-27 00:00:00.000 38 (9 row(s) affected)

Stored Procedure

Stored procedure adalah rutinitas sisi server yang mengekapsulasi kode T-SQL. Stored Procedure

dapat memiliki input dan output parameter, mereka dapatmengebalikan hasil set query(Row/Baris dari

sebuah atau beberapa table), dan mereka diizinkan untuk memanggil kode yang memiliki row efek(DML

statement). Anda tidak hanya dapat memodifikasi data melalui Stored Procedure, Anda juga dapat

menerapkan perubahan skema melalui mereka.

Dibandingkan dengan menggunakan kode ad-hoc , penggunaan Stored Procedure memberikan

banyak manfaat :

1. Stored Procedure meng-enkapsulasi logika . Jika Anda perlu mengubah pelaksanaan Stored

Procedure , Anda dapat menerapkan perubahan di satu tempat dalam database dan prosedur

akan diubah untuk semua pengguna prosedur.

2. Stored Procedure memberikan kontrol yang lebih baik dari sisi keamanan. Anda dapat memberikan

suatu akses user untuk menjalankan prosedur tanpa memberikan pengguna akses langsung untuk

melakukan kegiatan yang mendasarinya. Sebagai contoh, anggaplah bahwa Anda ingin

mengizinkan pengguna tertentu untuk menghapus pelanggan dari database , tetapi Anda tidak

ingin memberikan mereka izin langsung untuk menghapus baris dari table Customers. Anda ingin

memastikan bahwa permintaan untuk menghapus pelanggan divalidasi - misalnya , dengan

memeriksa apakah pelanggan membuka order atau membuka debit, dan Anda juga mungkin ingin

untuk mengaudit permintaan . Dengan tidak memberikan izin langsung untuk menghapus baris dari

Tabel Customers melainkan pemberian izin untuk menjalankan prosedur yang menangani tugas

tersebut, Anda memastikan bahwa semua validasi dan audit yang diperlukan selalu terjadi . Selain

itu, Stored Procedure dapat membantu mencegah injeksi SQL , terutama ketika mereka mengganti

ad hoc - SQL dari klien dengan parameter .

3. Anda dapat menggabungkan semua kode penanganan kesalahan(modul berikutnya) dalam

prosedur , secara diam-diam mengambil tindakan korektif jika relevan.

4. Stored Procedure memberikan manfaat kinerja. Stored Procedure menggunakan kembali execute

plan secara default, sedangkan SQL Server lebih konservatif dengan penggunaan kembali ad-

hoc plan. pembaharuan execute plan dalam Stored procedure lebih lama dibandingkan ad hoc

plan. Manfaat kinerja lain dari menggunakan Stored Procedure adalah pengurangan lalu lintas

jaringan. Aplikasi klien perlu untuk menyerahkan nama prosedur dan argumen untuk SQL Server.

Server memproses semua kode prosedur dan mengembalikan hanya output kembali ke pemanggil.

Tidak ada lalu lintas back -and-forth dikaitkan dengan langkah-langkah perantara prosedur.

Sebagai contoh sederhana, kode berikut membuat Stored Procedure disebut

Sales.GetCustomerOrders. Prosedur menerima ID pelanggan (@custid) dan rentang tanggal

(@fromdate dan @todate) sebagai masukan. Prosedur mengembalikan baris dari Sales.Orderstable

mewakili order yang dilakukan oleh pelanggan yang diminta dalam rentang tanggal yang diminta

sebagai result set, dan jumlah baris yang terkena sebagai parameter output (@numrows).

IF OBJECT_ID('Sales.GetCustomerOrders', 'P') IS NOT NULL DROP PROC Sales.GetCustomerOrders; GO CREATE PROC Sales.GetCustomerOrders @custid AS INT,

Page 3: MOD-PBD-6

3

Pemograman Basisdata “ROUTINGS – User-Defined Function & Store Procedure”

Modul VI

@fromdate AS DATETIME = '19000101', @todate AS DATETIME = '99991231', @numrows AS INT OUTPUT AS SET NOCOUNT ON; SELECT orderid, custid, empid, orderdate FROM Sales.Orders WHERE custid = @custid AND orderdate >= @fromdate AND orderdate < @todate; SET @numrows = @@rowcount; GO

Berikut ini adalah contoh melaksanakan prosedur, meminta informasi mengenai order yang dilakukan

oleh pelanggan dengan ID 1 di tahun 2007. Kode mengambil nilai parameter output @numrowsin ke

variabel lokal @rcand untuk menunjukkan berapa banyak baris yang dipengaruhi oleh query.

DECLARE @rc AS INT; EXEC Sales.GetCustomerOrders @custid = 1, @fromdate = '20070101', @todate = '20080101', @numrows = @rc OUTPUT; SELECT @rc AS numrows;

Result Set:

orderid custid empid orderdate ----------- ----------- ----------- ----------------------- 10643 1 6 2007-08-25 00:00:00.000 10692 1 4 2007-10-03 00:00:00.000 10702 1 4 2007-10-13 00:00:00.000 numrows ----------- 3 (1 row(s) affected)

Jalankan kode lagi, memberikan ID pelanggan yang tidak ada di Table Orders (misalnya, ID pelanggan

100). Anda mendapatkan output sebagai berikut menunjukkan bahwa ada nol perintah kualifikasi.

orderid custid empid orderdate ----------- ----------- ----------- ----------------------- numrows ----------- 0 (1 row(s) affected)

Latihan

1. Bualtah procedure dengan nama IncDiscount untuk menaikan diskon secara dinamis setiap konsumen

yang dipilih, misal pelanggan dengan id 1 dan kenaikan diskon adalah 10% untuk setiap barang yang

dipesannya.

2. Buatlah fungsi untuk memunculkan setiap nama produk dan jumlah quantitas yang dipesan oleh konsumen

tertentu, konsumen dengan id 1