Jumat, 29 Maret 2013

fungsi menarik (SELECT SCOPE_IDENTITY(), SELECT LAST_INSERT_ID() dan RETURNING PK)



Yuph kali ini kita akan membahas fungsi menarik (SELECT SCOPE_IDENTITY(), SELECT LAST_INSERT_ID() dan RETURNING PK) yang dimiliki oleh database2x terkenal seperti SQL Server, MySQL dan Firebird.
Dari nama fungsinya kita bisa menebak kegunaan dari fungsi diatas yaitu untuk mendapatkan nilai ID terakhir (biasanya bertipe angka) yang diinputkan.
Saya dan mungkin Anda biasanya dalam merancang tabel untuk selalu menambahkan field ID dengan attribut IDENTITY/AUTONUMBER dan sekaligus dijadikan sebagai PRIMARY KEY.
Tentunya hal ini kita lakukan untuk mempermudah dalam proses manipulasi data (edit dan delete).
Contoh beberapa tabel yang biasanya menggunakan field ID untuk PRIMARY KEY dan sekaligus diset dengan attribut IDENTITY/AUTONUMBER

Bagi yang males membaca referensi (termasuk sy :D) biasa menuliskan kode berikut untuk mengINSERTkan dan mendapatkan nilai ID yang terakhir, kita ambil contoh tabel provinsi.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Sub btnInsert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInsert.Click
    Dim lastID As Long = 0

    ' langkah 1 - menambahkan data
    strSql = "INSERT INTO provinsi (keterangan) VALUES (@1)"
    Using cmd As New SqlClient.SqlCommand(strSql, conn)
        With cmd
            .Parameters.Clear()
            .Parameters.AddWithValue("@1", "Riau")

            .ExecuteNonQuery()
        End With
    End Using

    ' langkah 2 - mengambil id terakhir dg memanfaatkan fungsi MAX
    strSql = "SELECT MAX(id) FROM provinsi"
    Using cmd As New SqlClient.SqlCommand(strSql, conn)
        lastID = Convert.ToInt32(cmd.ExecuteScalar())
    End Using

    ' tampilkan ID terakhir
    MessageBox.Show("Last ID : " & lastID.ToString())
End Sub
Sekarang kita lihat bedanya jika memanfaatkan fungsi SELECT SCOPE_IDENTITY().
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub btnInsert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInsert.Click
    Dim lastID As Long = 0

    strSql = "INSERT INTO provinsi (keterangan) VALUES (@1) SELECT SCOPE_IDENTITY()" ' ada tambahan SELECT SCOPE_IDENTITY()
    Using cmd As New SqlClient.SqlCommand(strSql, conn)
        With cmd
            .Parameters.Clear()
            .Parameters.AddWithValue("@1", "Riau")

            lastID = Convert.ToInt32(.ExecuteScalar())
        End With
    End Using

    MessageBox.Show ("Last ID : " & lastID.ToString())
End Sub
Gimana lebih simple kan ? :)
Oke sekarang kita lihat kode untuk MySQL(SELECT LAST_INSERT_ID) dan Firebird (RETURN KOLOM_PK).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
' MySQL
Private Sub btnInsert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInsert.Click
    Dim lastID As Long = 0

    strSql = "INSERT INTO provinsi (keterangan) VALUES (@1); SELECT LAST_INSERT_ID()"
    Using cmd As New MySqlClient.MySqlCommand(strSql, conn)
        With cmd
            .Parameters.Clear()
            .Parameters.AddWithValue("@1", "Riau")

            lastID = Convert.ToInt32(.ExecuteScalar())
        End With
    End Using

    MessageBox.Show ("Last ID : " & lastID.ToString())
End Sub

' Firebird
Private Sub btnInsert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInsert.Click
    Dim lastID As Long = 0

    strSql = "INSERT INTO provinsi (keterangan) VALUES (@1) RETURNING ID" ' ID -> kolom primary key
    Using cmd As New FirebirdClient.FbCommand(strSql, conn)
        With cmd
            .Parameters.Clear()
            .Parameters.AddWithValue("@1", "Riau")

            lastID = Convert.ToInt32(.ExecuteScalar())
        End With
    End Using

    MessageBox.Show ("Last ID : " & lastID.ToString())
End Sub