MySQL Upsert – UPDATE If Row Exist With Multiple Columns As Parameter

Like the other RDBMS out there, MySQL has a feature such as Upsert Statement. Upsert Statement means it’s query will update the row if data / row that match with our key or parameters (contraint, foreign key, or some columns we use as key in where clause) already exist. But if data / row doesn’t exist before, it will insert as a new row in our table.

Continue reading

[SOLVED] Problem Double Entry Because Trigger After Insert In SQL Server

Recently I got a problem with trigger in SQL Server, the trigger I made was provoke an anomaly. The goal is after insert a data in a table, I need to update a column within it with a external data.

The problem when insert 1 row data, it generates 2 row with the exactly same data. I tried to remove the trigger I created before, and insert a new data again, the problem is gone. Here it is my trigger source code:

Continue reading

User REVIEW for PostgreSQL

Sometimes we need a database user only for review (read-only) purposes, this user used just for view some data or all data in a database, not for insert, delete and other CRUD activities in a database.

So if you want to create a REVIEW user in PostgreSQL, you have to grant access for SELECT and EXECUTE in a schema or database, and you have to grant access that user into schema itself. These script will help you out to create review user in PostgreSQL :

CREATE USER review WITH PASSWORD 'password_review';

GRANT SELECT ON ALL TABLES IN SCHEMA schema_name TO review;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA schema_name TO review;
GRANT USAGE ON SCHEMA schema_name TO review;

Solution for MySQL (XAMPP) Can’t Start in OS X Yosemite

Beberapa hari yang lalu saya baru saja upgrade OS X dari Mavericks menjadi Yosemite (10.10), namun barusan saja saya mengoperasikan MySQL server di Mac saya yang sudah pakai baju barunya :D. Saya memakai XAMPP versi 1.8.3-1 yang sudah terpasang sejak lama, sejak masih pakai OS X Mountain Lion. Sampai akhirnya saya upgrade dari Mavericks ke Yosemite, tetap pakai XAMPP versi 1.8.3-1, namun di XAMPP yang versi 1.8.3-1 mengalami masalah yaitu tidak bisa start service MySQL. Saya sudah coba beberapa kali start lagi dan lagi service MySQL nya dari Application Manager kepunyaan XAMPP, tapi tetap tidak menunjukkan hasil yang baik, atau masih tetap tidak bisa run service MySQL-nya.

Setelah browsing solusi paling banyak adalah upgrade versi XAMPP ke yang terbaru, tapi saya tidak berkeinginan untuk upgrade XAMPP. Karena pasti harus download lagi, tau sendiri lah kapasitas file installer XAMPP kan besar, jadi males banget buat download lagi :P. Tapi akhirnya ketemu juga solusi yang simple dan sangat mudah diterapkan untuk mengatasi masalah tidak bisa start/run service MySQL XAMPP 1.8.3-1 di Yosemite ini, adalah dengan cara berikut : Continue reading

Contoh Function Di Oracle Menghitung Jumlah Huruf Konsonan Dan Vokal Dari Inputan

Soal ini didapat dari Praktikum Basis Data Lanjut mengenai pembahasan Function dan Procedure di Database Oracle. Okey, berikut ini merupakan sintaks function untuk menghitung karakter selain angka serta membedakan mana yang termasuk huruf vokal dan konsonan berdasarkan inputan user :

CREATE OR REPLACE FUNCTION VOKAL_KONSONAN (KATA IN VARCHAR2)
RETURN VARCHAR2 IS HASIL VARCHAR2(255);
KONSONAN NUMBER;
VOKAL NUMBER;
BEGIN
IF LENGTH(TRIM(TRANSLATE(KATA, '+-.0123456789', ' '))) IS NULL THEN
HASIL := 'Teks yang kamu masukkan mengandung karakter angka';
ELSE
KONSONAN := LENGTH(REPLACE(TRANSLATE(KATA, 'aAeEiIoOuU', ' '), ' ', NULL));
VOKAL := LENGTH(REPLACE(KATA, ' ', NULL)) - KONSONAN;
END IF;
RETURN HASIL;
END;
/

Untuk menjalankan atau mencoba sintaks diatas setelah dieksekusi dan berhasil membuat function, bisa memakai sintaks atau query berikut ini :

SELECT VOKAL_KONSONAN('Rendra Kurniawan') FROM DUAL;

Semoga bermanfaat 🙂

Praktikum Basis Data (Oracle) – Part 3

Ini merupakan lanjutan dari postingan sebelumnya yaitu Praktikum Basis Data Oracle Part 2. Mohon maaf kepada teman-teman jika upload-nya telat, maklum karena banyak kegiatan di luar :). Oke langsung saja, berikut ini yang bisa aku sharing untuk Part 3 :

  1. Insert record baru dalam jumlah banyak menggunakan 1 query
  2. Merubah date format pada saat eksekusi query
  3. Melihat constraint yang ada pada suatu tabel
  4. Menampilkan seluruh tabel yang ada pada schema tertentu
  5. Menampilkan semua user dan schema yang ada
  6. Menggabungkan data antara 2 tabel menggunakan “Merge” dilengkapi berbagai kondisi (When Matched, Delete When Not Matched, dll)

Pertama (Insert Banyak Record Dengan 1 Query)

Maksudnya adalah jika ingin memasukkan data ke dalam suatu tabel lebih dari 1 record menggunakan 1 query yang bisa dieksekusi dalam 1 waktu. Berikut ini adalah source code nya :

INSERT ALL
INTO MATKUL_04900 VALUES (7, 1, ‘Alpro’, 3, ‘Dosen’)
INTO MATKUL_04900 VALUES (8, 1, ‘English’, 3, ‘Dosen’)
INTO MATKUL_04900 VALUES (9, 1, ‘Agama’, 3, ‘Dosen’)
INTO MATKUL_04900 VALUES (10, 1, ‘PBO’, 3, ‘Dosen’)
INTO MATKUL_04900 VALUES (11, 1, ‘KP’, 3, ‘Ibu Dosen’)
INTO MATKUL_04900 VALUES (12, 1, ‘KKN’, 3, ‘Dosen’)
SELECT * FROM DUAL;

Kedua (Merubah Date Format Query)

Penjelasan singkat dari judul kedua ini adalah, jika pada waktu eksekusi sebuah query entah itu untuk insert record atau select query, jika salah satu field merupakan parameter yang dibutuhkan untuk suatu kondisi, pastinya format tanggal perlu diatur sesuai value parameter yang diinginkan. Misalkan begini, di dalam record mempunyai value seperti “10/31/2012” namun kita ingin merubah formatnya menjadi “31/10/2012” tanpa harus merubah value (semoga bisa paham yang sebenarnya aku maksudkan, :mrgreen:), berikut ini adalah source-nya (Contoh untuk insert record) :

-- Inilah poin pentingnya --
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD';
-- Poin penting --

INSERT ALL
INTO TAB_MOD3_02 VALUES ('1001','Rendra','1990/01/23','P','Surabaya','SMPN 2 Mojosari',100)
INTO TAB_MOD3_02 VALUES ('1002','Kurniawan','1990/02/23','P','Mojokerto','SMPN 2 Mojosari',100)
INTO TAB_MOD3_02 VALUES ('1003','Rain','1990/03/23','P','Sidoarjo','SMPN 2 Mojosari',100)
SELECT * FROM DUAL;

Ketiga (Menampilkan Constraint)

Berikut ini adalah contoh query untuk menampilkan constraint yang ada pada tabel :

SELECT CONSTRAINT_NAME, R_CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME FROM USER_CONSTRAINTS ORDER BY CONSTRAINT_TYPE ASC;

Keempat (Menampilkan Seluruh Tabel Pada Schema)

SELECT TABLE_NAME, COLUMN_NAME FROM USER_TAB_COLUMNS ORDER BY TABLE_NAME ASC;

Kelima (Menampilkan User & Schema)

Berikut adalah contoh query untuk menampilkan daftar user dan schema yang ada pada Oracle :

SELECT SYS_CONTEXT('userenv','db_name') AS NAMA_DB, SYS_CONTEXT('userenv','session_user') AS NAMA_SCHEMA FROM DUAL;

Keenam (Merge Data)

Dibawah ini merupakan contoh query untuk menggabungkan data dari beberapa tabel menggunakan fungsi Merge.

MERGE INTO TAB_MOD3_02 b USING(
SELECT nopes, nmsis, ttl, jk, almtsis,
asalsek, bindo, bing, mat, ipa, poin
FROM TAB_MOD3_01
WHERE nopes = '1001') a ON (b.nopes = a.nopes)
WHEN MATCHED THEN UPDATE SET b.danem = ((a.bindo + a.bing + a.mat + a.ipa + a.poin)/5)
DELETE WHERE (a.nmsis = '') WHEN NOT MATCHED THEN
INSERT (b.nopes, b.nmsis, b.ttl, b.jk, b.almtsis, b.asalsek, b.danem)
VALUES (a.nopes, a.nmsis, a.ttl, a.jk, a.almtsis, a.asalsek,
((a.bindo + a.bing + a.mat + a.ipa + a.poin)/5))
WHERE (a.nopes <> '');

Yap, sekian untuk Part 3 ini, semoga bisa bermanfaat… sampai ketemu di Part 4 selanjutnya 🙂

Praktikum Basis Data (Oracle) – Part 2

Well well,,, kali ini aku mau share lanjutan dari post sebelumnya yaitu Praktikum Basis Data Oracle Part 1 dimana sebelumnya membahas mengenai pembuatan user, tablespace dan syart-syarat awal yang diperlukan untuk memulai pembahasan/pembelajaran pada umumnya mengenai Oracle Database.

Di Part 2 ini aku ingin share mengenai beberapa hal, diantaranya adalah :

  1. Membuat sebuah tabel dilengkapi dengan constraint
  2. Mengubah nama tabel (rename table)
  3. Merubah nama field/kolom dari sebuah tabel
  4. Menghapus tabel
  5. Menambahkan index, menambah constraint pada tabel
  6. Membuat tabel dengan meng-copy / berdasarkan struktur dari tabel lain
  7. Melihat constraint yang ada pada suatu tabel

Yah,,, lumayan poin yang akan dibahas kali ini, semoga bisa bermanfaat bagi semua 🙂

Pertama (Membuat Tabel Dilengkapi Constraint)

Berikut ini contoh untuk membuat suatu tabel dengan nama TaMod2 dengan 5 field/kolom, lihat script query berikut :

CREATE TABLE TaMod2 (
kode_user INT,
nama_user VARCHAR(30) NOT_NULL,
telepon VARCHAR(12),
email VARCHAR(25),
alamat VARCHAR(100),
CONSTRAINT pk_user PRIMARY KEY(kode_user));

Kedua (Merubah Nama Tabel)

Misalkan dari tabel diatas, kita akan merubah namanya dari TaMod2 menjadi TabMod2, maka bisa menggunakan query seperti berikut ini :

RENAME TaMod2 TO TabMod2;

Ketiga (Merubah Nama Kolom & Merubah Tipe Data Field/Kolom)

-- Query untuk merubah nama field / kolom
-- Contohnya untuk merubah kolom nama_user menjadi nama_pengguna
ALTER TABLE TabMod2 RENAME COLUMN nama_user TO nama_pengguna;

-- Query untuk merubah tipe data dari field tertentu pada tabel
-- Contoh berikut adalah merubah tipe data dari field kode_user
-- yang mana awalnya bertipe data INT, dirubah menjadi VARCHAR
ALTER TABLE TabMod2 MODIFY (kode_user VARCHAR(10));

Keempat (Menghapus Tabel)

Untuk menghapus tabel di Oracle, ada 2 metode yang perlu diketahui, yaitu dihapus secara biasa tapi masih tersisa di Recycle Bin-nya Oracle, atau benar-benar dihapus tanpa bekas. Berikut ini adalah query yang bisa kalian pakai, pertama adalah menghapus secara biasa dan query yang kedua untuk benar-benar menghapus tabel tanpa sisa di BIN (Recycle Bin Oracle).

DROP TABLE TabMod2;

Dengan query diatas (Drop), kita masih bisa mengembalikan atau meng-undo agar tabel bisa kembali lagi, gag jadi terhapus, bisa pakai query ini :

FLASHBACK TABLE TabMod2 TO BEFORE DROP;

Dan berikut ini query untuk melihat isi RECYCLE BIN-nya Oracle, jika ada tabel yang dihapus dengan query DROP pasti masuk disini.

SELECT * FROM RECYCLEBIN;

Dan ini adalah query untuk menghapus Tabel tanpa masuk di RECYCLE BIN, hampir sama dengan fungsi Shift+Del, querynya adalah :

PURGE TABLE TabMod2;
-- Contoh untuk menghapus tabel di RECYCLE BIN
PURGE TABLE "BIN$KIkRl/BNTzmEdg9BW4Z3Pg==$0";
-- Dan beberapa pengetahuan lain yang hampir sama dengan PURGE ALL
PURGE RECYCLEBIN;
PURGE DBA_RECYCLEBIN;
PURGE USER_RECYCLEBIN;

Kelima (Menambahkan Index / Constraint di Suatu Tabel)

CREATE INDEX FK_EMAIL ON TabMod2 (email ASC);

ALTER TABLE TabMod2
	ADD CONSTRAINT FK_EMAIL FOREIGN KEY (KD_EMAIL)
		REFERENCES TB_EMAIL (ID_EMAIL);

Keenam (Membuat Tabel Dengan Copy Struktur Tabel Lain)

Sebelumnya, misalkan kita buat tabel baru dengan nama Tab_Nama_01 dengan query berikut ini :

CREATE TABLE Tab_Nama_01 (
nomor_peserta varchar(12) PRIMARY KEY NOT NULL,
CONSTRAINT nopes CHECK(LENGTH(nomor_peserta)=12),
nama_siswa varchar(50) NOT NULL,
t_lahir varchar(20) NOT NULL, ttl DATE NOT NULL,
gender char(1) NOT NULL, nama_ayah varchar(50) NOT NULL,
nama_ibu varchar(50) NOT NULL,
nama_wali varchar(50) NOT NULL,
telepon varchar(15) NOT NULL,
almt_sis varchar(150) NOT NULL, kota varchar(50) NOT NULL,
kab varchar(50) NOT NULL, n_b_indo NUMBER NOT NULL,
n_b_ingg NUMBER NOT NULL, n_mat NUMBER NOT NULL,
n_ipa NUMBER NOT NULL, asal_sek varchar(70) NOT NULL,
tahun NUMBER(4) NOT NULL,
CONSTRAINT th CHECK(LENGTH(tahun)=4));

Kemudian, kita akan membuat tabel baru dengan nama Tab_Nama_02 dengan beberapa field yang meniru struktur dari tabel pertama yaitu Tab_Nama_01, berikut ini contoh querynya :

CREATE TABLE Tab_Nama_02 AS SELECT
a.*,
((a.n_b_indo + a.n_b_ingg + a.n_mat + a.n_ipa)/4) danem,
TO_DATE(a.TTL, 'MONTH') bulan,
TO_DATE(a.TTL, 'DD') tanggal,
TO_DATE(a.TTL, 'YYYY') tahun_lahir,
SUBSTR(nama_siswa,1, INSTR(nama_siswa,',')-1) nama_depan,
SUBSTR(nama_siswa,(INSTR(nama_siswa,',')+1),LENGTH(nama_siswa)) nama_belakang
FROM TAB_NAMA_01 a;

Ketujuh (Melihat Constraint Dari Tabel)

Beriku ini adalah contoh query untuk melihat atau menampilkan constarint apa aja pada table yang udah pernah kita buat sebelumnya. Ada beberapa cara :

-- 1
SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'Tab_Nama_02';
-- 2
SELECT * FROM ALL_CONSTRAINTS WHERE TABLE_NAME = 'Tab_Nama_02';
-- 3
SELECT CONSTRAINT_NAME, COLUMN_NAME FROM USER_CONS_COLOM WHERE TABLE_NAME = 'Tab_Nama_01';

Yap… akhirnya sampai ujung juga. Capek juga ya, haha.. oke deh semoga bermanfaat bagi teman-teman. Sampai jumpa lagi ya di PART 3.

Praktikum Basis Data (Oracle) – Part 1

Dengan dimulainya tahun ajaran baru untuk Praktikum Basis Data Semester ini, aku punya ide untuk share pengalaman tentang hal terkait yang mana sudah pernah aku jalani di semester sebelumnya. Aku harap bisa bermanfaat khususnya bagi yang sedang Praktikum Basis Data Oracle atau bagi teman-teman lainnya yang lagi belajar mengenai Oracle 🙂

Pada bagian pertama ini, aku ingin share mengenai beberapa hal berikut :

  1. Membuat User baru di Oracle
  2. Membuat Tablespace untuk User tertentu di Oracle
  3. Memberikan hak akses agar user bisa login, bisa membuat Table, user bisa membuat Tablespace,  user dapat membuat View, Store Procedure, Trigger dan komponen DBMS lainnya.
  4. Contoh sederhana untuk membuat tabel baru dan insert record baru pada tabel tersebut.

Pertama (Membuat Tablespace Oracle)

Tablespace yang dibuat tersendiri ini nantinya berguna untuk user tertentu sebagai lokasi penyimpanan datanya, seperti tabel, view dan lain sebagainya. Tablespace ini berupa suatu file dengan ekstensi / bertipe file “.ora“, yang disimpan pada lokasi sesuai pilihan kita. Misalkan kita akan membuat suatu tablespace dengan nama praktikum yang disimpan pada file praktikum.ora, berikut ini query-nya :

CREATE TABLESPACE praktikum DATAFILE 'D:\Oracle\praktikum.ora'
SIZE 1M
AUTOEXTEND ON NEXT 500K
MAXSIZE 3M;

Script diatas bisa dijalankan melalui SQL Plus atau Interface lainnya yang mendukung operasi database Oracle. Keterangan dari script diatas adalah sebagai berikut :

  1. Baris pertama adalah untuk membuat tablespace dengan nama tersebut yang disimpan pada Drive D:/ dengan path tersebut.
  2. Baris kedua untuk menentukan berapa besar kapasitas file tablespace ini
  3. Baris ketiga merupakan ketentuan untuk file tablespace tersebut jika kapasitas penyimpanan melampaui batas yang ditentukan di baris kedua, istilahnya akan membengkak sebesar 500Kb tiap kali terjadi pembengkakan
  4. Baris terakhir adalah ketentuan berapa besar maksimal ukuran tablespace ini (Tidak bisa bengkak lagi).

Kedua (Membuat User Baru di Oracle)

Berikut ini contoh query untuk membuat user baru di Oracle menggunakan tablespace yang sudah dibuat pada poin pertama tadi.

CREATE USER rendra IDENTIFIED BY kurniawan DEFAULT TABLESPACE praktikum;

Ketiga (Memberi Hak Akses Pada User Oracle)

Setelah berhasil membuat user baru, sekarang diberi hak akses agar bisa melakukan beberapa hal seperti, login, membuat table, membuat view dan membuat tablespace. Sintaks yang bisa digunakan adalah sebagai berikut :

GRANT CONNECT, RESOURCE TO rendra;
GRANT CREATE VIEW TO rendra;
GRANT TRIGGER TO rendra;

Konsep untuk memberi hak akses adalah seperti script diatas, jika pemberian hak akses diatas masih kurang, bisa ditambahkan sendiri sesuai format seperti tersebut diatas.

Keempat (Membuat Table Baru & Insert Record)

Setelah pemberian hak akses, silahkan coba masuk/login sebagai user yang baru dibuat tadi dengan perintah conn rendra kemudian masukkan passwordnya. Setelah berhasil masuk/login, mencoba untuk membuat 2 buah tabel yaitu tabel mhs dan jurusan. Contoh perintahnya seperti ini :

CREATE TABLE MHS(NPM VARCHAR(15) NOT NULL,NAMA_LENGKAP VARCHAR(70),GENDER CHAR(1) NOT NULL,
TTL VARCHAR(50),
PRIMARY KEY(NPM) USING INDEX);

CREATE TABLE JURUSAN(
KD_JURUSAN INT NOT NULL,
NM_JURUSAN VARCHAR(50),
CONSTRAINT NM_JURUSAN_U PRIMARY KEY(KD_JURUSAN) USING INDEX);

Dan script dibawah ini adalah untuk insert data di tabel yang barusan dibuat tadi :

INSERT INTO MHS VALUES ('06.2009.1.04900', 'Rendra Kurniawan', 'L', 'Mojokerto, 23 Mei 1990', 1);

Bonus, script ini adalah contoh untuk membuat View di Oracle :

CREATE VIEW lihat_mhs AS
SELECT MHS.NPM, MHS.NAMA_LENGKAP, JURUSAN.NM_JURUSAN
FROM MHS INNER JOIN
JURUSAN ON MHS.KD_JURUSAN = JURUSAN.KD_JURUSAN
ORDER BY MHS.NPM ASC;

Okelah,,, sekian semoga bermanfaat… sampai ketemu di PART selanjutnya ya…
Thanks

Query MySQL Untuk Menghitung Umur/Usia

Malam ini aku ingin share salah satu pengetahuan mengenai SQL Query (Khususnya di MySQL) dengan studi kasus bagaimana caranya kita bisa memperoleh atau mengetahui berapa umur / usia dari data seseorang yang ada di dalam database. Jadi misalkan dalam suatu tabel, anggap saja nama tabelnya adalah tabel “karyawan” dimana terdapat satu field/kolom dengan nama “tanggal_lahir”, terdapat suatu record value dari data karyawan perusahaan dengan struktur sebagai berikut :

nama_karyawan tanggal_lahir
Rendra Kurniawan 2012/05/23

Dari contoh diatas, saya ingin mengetahui berapa umur Rendra saat ini (Dengan tanggal saat ini sebagai patokan)? Query berikut bisa kalian coba :

SELECT nama_karyawan, tanggal_lahir, (YEAR(CURDATE())-YEAR(tanggal_lahir)) AS umur FROM karyawan

Maka akan didapatkan hasil sebagai berikut :

nama_karyawan tanggal_lahir umur
Rendra Kurniawan 2012/05/23 22

Yap, sekian semoga bisa bermanfaat di lain waktu 🙂
Terima Kasih