Minggu, 02 Oktober 2011

Tugas Pemodelan & Simulasi

Linear Congruential Generators atau yang biasa disingkat sebgai "LCG" adalah suatu teknik untuk meng-generate bilang "pseudo random". 


Cara mencari LCG adalah:
ni = (a.ni-1 + b) mod (m)

Dalam tugas kali ini soal yang diberikan adalah:
A. ni = (7ni-1 + 5) mod (32); n0 = 7
B. ni = (5ni-1 + 11) mod (512); n0 = 535
C. ni = (5ni-1 + 11) mod (512); n0 = 818



Jawaban dari soal di atas adalah sebagai berikut : 




Nama : Nanda Cahya Priaditya
Nim : 08410100045
Tugas Pemodelan Simulasi

Minggu, 25 September 2011

Resume Pemrograman Basis Data 3


SQL Cursor ( Oracle )

Cursor digunakan dalam script PL/SQL untuk menampilkan data yang tersimpan di dalam database. Ada dua macam cursor yaitu implicit cursor (kursor implisit) dan explicit cursor(kursor eksplisit). Implicit cursor adalah cursor yang tidak perlu dideklarasikan pada bagian declaration, sedangkan explicit cursor harus dideklarasikan di bagian declaration.
Berikut ini adalah template untuk implicit cursor:
select [daftar kolom]
into [daftar variabel]
from [daftar tabel]
where [syarat]
contoh:
select first_name, last_name, salary
into nama_depan, nama_belakang, gaji
from employees
where first_name = ‘Susan’;
Berikut ini adalah contoh script PL/SQL yang menggunakan implicit cursor:
declare
nama_cari employees.first_name%type;
nama_depan employees.first_name%type;
alamat_email employees.email%type;
telepon employees.phone_number%type;
begin
nama_cari := '&masukkan_nama';
select first_name, email, phone_number
into nama_depan, alamat_email, telepon
from employees
where first_name = nama_cari;
dbms_output.put_line('Nama: '||nama_depan);
dbms_output.put_line('Email:'||alamat_email||'@SemogaJaya.co.id');
dbms_output.put_line('Telepon: '||telepon);
end;
/

sedangkan ini adalah template untuk explicit cursor:
declare
cursor [nama_cursor_bebas] is
   select [daftar_kolom]
   from [daftar_tabel]
   where [syarat];

begin
open [nama_cursor_bebas];
loop
   fetch [nama_cursor_bebas] into [daftar_variabel];
   exit when [nama_cursor_bebas] %notfound;
   [aksi_lain]
end loop;
close [nama_cursor_bebas];
end;
/
Explicit cursor harus melalui empat tahap yaitu declare, open, fetch dan close. Berikut ini adalah penjelasannya:
  1. Pada tahap declarecursor dideklarasikan pada blok PL/SQL. Cursor perlu dideklarasikan karena sifat cursor yang menyerupai variable (dapat dipanggil dalam blok utama program) namun deklarasi untuk cursor diletakkan setelah deklarasivariable lain, tepat sebelum awal program (begin)
  2. Pada tahap opencursor dibuka (query dalam cursor dieksekusi dan hasilnya ditampung dalam memory)
  3. Pada tahap fetch, satu baris data dalam cursor diambil dan ditransfer ke variablepenampung yang ada pada klausa into. Karena jumlah baris data kemungkinan lebih dari satu maka biasanya fetch diletakkan dalam looping yang akan berhenti begitu semua baris data dalam cursor selesai di-fetch ke variable penampung
  4. Pada tahap closecursor ditutup dan hasil query dalam cursor dihapus darimemory
Berikut ini adalah contoh script PL/SQL yang menggunakan explicit cursor:
declare
nama_cari employees.first_name%type;
nama_depan employees.first_name%type;
alamat_email employees.email%type;
telepon employees.phone_number%type;
cursor anu is
   select first_name, email, phone_number
   from employees
   where first_name = nama_cari;

begin
nama_cari := '&masukkan_nama';
open anu;
loop
   fetch anu into nama_depan, alamat_email, telepon;
   exit when anu%notfound;
   dbms_output.put_line('Nama: '||nama_depan);
   dbms_output.put_line('Email: '||alamat_email||'@SemogaJaya.co.id');
   dbms_output.put_line('Telepon: '||telepon);
   dbms_output.put_line(‘-----------------------------------------------------------’);
end loop;
close anu;
end;
/
SQL Function

Function adalah sebuah blok PL/SQL yang dapat mengembalikan nilai. Maka dari itu dalam pembuatannya harus menggunakan statemen RETURN untuk proses pengembalian nilai.
Syntax untuk membuat function :
CREATE OR REPLACE FUNCTION nama_function
(parameter_1 tipedata, parameter_2 tipedata, …) IS
RETURN tipedata_function IS
variabel-variabel_lokal
BEGIN
Statemen;
……
RETURN nilai_function;
END;
Contoh :
CREATE OR REPLACE PROCEDURE LAP_DEPARTMEN AS
BEGIN
  for deptid in (SELECT d.department_id, department_name,count(employee_id)
jml
  FROM departments d, employees e
       WHERE d.department_id = e.department_id(+)
       GROUP BY d.department_id, department_name)
  loop
dbms_output.put_line(deptid.department_id||‘Kode dari departemen‘ || deptid.department_name||‘ dengan
jumlah karyawan = ‘ || deptid.jml);
  for emp in (select employee_id, last_name from employees where department_id=deptid.department_id)
loop
dbms_output.put_line(‘  ‘||emp.employee.id||‘||emp.last_name);
       end; loop;
 end loop;
END LAP_DEPARTMEN;

Selasa, 20 September 2011

Resume Pemrograman Basis Data 2

PL/SQL

Struktur Blok PL/SQL

Terdapat dua macam blok pada PL/SQL yaitu blok bernama dan blok tidak bernama (anonymous block), dimana blok-blok ini akan membentuk suatu unit PL/SQL. Blok-blok yang bernama bisa disimpan dan dapat berupa procedure, function serta trigger. Sedangkan blok yang tidak bernama tidak dapat disimpan dalam database kecuali jika dipakai sebagai subblok dalam sebuah unit PL/SQL bernama.
            Secara umum, satu blok PL/SQL yang lengkap terdiri atas tiga bagian, yaitu: declaration section (bagian deklarasi variabel), executable section (bagian pengeksekusian) serta exception section (bagian penanganan kesalahan). Berikut ini penggambarannya:

[DECLARE
     ...]    à DECLARATION SECTION
BEGIN
     ...     à EXECUTABLE SECTION
[EXCEPTION
     ...]    à EXCEPTION SECTION
END;


Dengan declaration dan exception bersifat opsional, maka satu bok PL/SQL paling tidak terdiri atas executable section.
Contoh:
begin
      null;
end;
Catatan: Null dipakai untuk menyatakan nilai yang tidak diketahui, sehingga untuk contoh di atas, blok PL/SQL tersebut tidak melakukan proses apapun.

1)     DECLARATION SECTION
            Digunakan untuk mendefinisikan atau mendeklarasikan variabel, konstanta, cursor dan seluruh exception yang didefinisikan oleh user yang akan digunakan pada bagian eksekusi. Penulisan blok ini dimulai dengan menulis DECLARE.
Contoh:
declare
v_nama      mahasiswa.nama%type;
v_nim       mahasiswa.nim%type;


2)     EXECUTABLE SECTION
            Digunakan untuk mengeksekusi atau menjalankan blok perintah PL/SQL seperti pengulangan, percabangan, perintah SQL dan perintah cursor. Berisi statement SQL untuk memanipulasi data pada basis data dan statement PL/SQL untuk memanipulasi data dalam blok.
Contoh:
declare
v_nama      mahasiswa.nama%type;
v_nim       mahasiswa.nim%type;
begin
select nim, nama into v_nim, v_nama
from pegawai
where nim=30108001
dbms_output.put_line(v_nama);
exception
  when no_data_found then
      dbms_output.put_line(‘gak ada’);
end;

3)     EXCEPTION SECTION
            Merupakan bagian yang akan diaktifkan bila terjadi kesalahan atau pengecualian pada saat menjalankan program PL/SQL. Exception section terdiri atas predefined dan user defined. Sebagai contoh exception predefined NO_DATA_FOUND akan diaktifkan bila perintah DML SQL tidak menemukan data dalam klausa WHERE.
Contoh:
declare
v_nama      mahasiswa.nama%type;
v_nim       mahasiswa.nim%type;
begin
select nim, nama into v_nim, v_nama
from pegawai
where nim=30108001
dbms_output.put_line(v_nama);
exception
         when no_data_found then
          dbms_output.put_line(‘gak ada’);
end;

Struktur Kondisional

Perintah IF terdiri atas tiga bentuk, yaitu IF THEN, IF THEN ELSE, serta IF THEN ELSEIF. Struktur dari ketiganya ditampilkan dalam satu rumusan umum sebagai berikut:
IF kondisi 1 THEN
      Baris perintah...
[ELSIF kondisi 2 THEN
      Baris perintah...]
...
[ELSE
      baris perintah..]
END IF;











Baris pada baris perintah dapat berupa perintah IF sehingga akan membentuk blok IF bersarang. Bagian ELSIF bisa muncul beberapa kali sesuai dengan kebutuhan sedangkan bagian ELSE biasanya dipakai untuk menangani kondisi jika semua kondisi pada kalang IF... THEN atau ELSIF... THEN tidak terpenuhi. Namun bagian ELSE ini bisa saja tidak digunakan.
contoh:
declare
 penuh exception;
 n1 number;
 n2 number;
begin
 if b1>n2 then
      raise penuh;
 else
      dbms_ouput.put_line(‘bisa’);
 end if;
end;

 

Struktur Iterasi

Pernyataan Loop
Untuk perintah LOOP, akan dilakukan pengulangan terus-menerus. Bentuk umum dari pernyataan LOOP sebagai berikut:
LOOP
      //Baris perintah
END LOOP;

Karena tidak mempunyai kondisi untuk keluar dari iterasi, maka perlu digunakan perintah EXIT. Perintah EXIT dapat digunakan dengan cara seperti berikut:

EXIT WHEN kondisi;

Contoh:
DECLARE
   x number;
BEGIN
   x := 0;
   LOOP
x := x + 1;
EXIT WHEN x > 5; -- exit loop immediately
   END LOOP;
   dbms_output.put_line('Hasil looping : '||x);
END;

Bisa juga digunakan format seperti ini:
IF kondisi THEN
EXIT;
END IF;


Contoh:
DECLARE
   x number;
BEGIN
   x := 0;
   LOOP
      x := x + 1;
      IF x > 5 THEN
            EXIT; -- exit loop immediately
      END IF;
dbms_output.put_line('Hasil looping ke- '||x);
   END LOOP;
END;

DECLARE
   vno  number;
BEGIN
vno:=1;
LOOP
insert into coba(no) values vno;
vno:=vno+1;
if vno > 10 then
      exit;
end if;
END LOOP;
END;

 

Pernyataan LOOP bisa diberi label atau nama, sintaksnya sebagai berikut :

<<label_name>>
LOOP
sequence_of_statements
END LOOP label_nama; //optional

 



Contoh:
<<outer>>
LOOP
  ...
  LOOP
...
      EXIT outer WHEN ... -- exit both loops
  END LOOP;
  ...
END LOOP outer;
Pada contoh diatas, saat EXIT maka akan keluar dari kedua looping yang ada.

Pernyataan While - Loop
Perintah WHILE-LOOP akan terus melakukan iterasi (memproses baris perintah secara berulang) selama KONDISI bernilai TRUE. Bentuk umum dari pernyataan LOOP sebagai berikut:
WHILE kondisi LOOP
      //Baris perintah
END LOOP;

Contoh:
DECLARE
   x number;
BEGIN
   x := 0;
   WHILE x <= 5 LOOP
      x := x + 1;
      dbms_output.put_line('Hasil looping ke- '||x);
   END LOOP;  
END;

Selain dapat digunakan pada perintah LOOP, perintah EXIT ini juga dapat digunakan pada WHILE-LOOP untuk menambahkan kondisi tertentu. Namun perintah EXIT ini hanya bisa digunakan dalam loop saja.

Contoh:
DECLARE
   vno      number;
BEGIN
vno:=1;
WHILE vno <= 10 LOOP
insert into coba(no) values vno;
EXIT WHEN vno = 10;
vno:=vno+1;
END LOOP;
END;

Pernyataan For - Loop
Struktur pengulangan For digunakan untuk menghasilkan pengulangan sejumlah kali tanpa penggunaan kondisi apapun. Stuktur ini menyebabkan aksi diulangi sejumlah beberapa kali (tertentu). Bentuk umum struktur for ada dua macam yaitu : menaik (ascending) atau menurun (descending). Sintaksnya sebagai berikut :

FOR counter IN [REVERSE] i_terendah .. i_teratas LOOP
      Baris perintah
END LOOP;

Perintah FOR-LOOP melakukan iterasi selama nilai COUNTER berada dalam range nilaii_terendah dan i_teratas. Pada FOR-LOOP, counter tidak perlu dideklarasikan. Penggunaan kata kunci RESERVE akan menyebabkan nilai counter dimulai dari i_teratas ke i_terendah. Dua titik antara i_terendah dan i_teratas merupakan operator rentang nilai. i_terendah maupun i_terkecil bisa berupa nilai integer ataupun variabel yang bernilai integer yang sudah dideklarasikan sebelumnya. i_upper harus lebih besar dari i_lower dan jika tidak maka iterasi tidak akan dilakukan.

Contoh:
BEGIN
FOR vno IN 1..10 LOOP
insert into coba(no) values vno;
dbms_output.put_line('Hasil looping ke- '||x);
END LOOP;
END;

BEGIN
FOR vno IN REVERSE 1..10 LOOP
insert into coba(no) values vno;
dbms_output.put_line('Hasil looping ke- '||x);
END LOOP;
END;







Ruang Lingkup Pernyataan FOR – LOOP
Contoh :
DECLARE
  ctr INTEGER; -- global variable
BEGIN
  ...
  FOR ctr IN 1..25 LOOP
...
IF ctr > 10 THEN ... -- refers to loop counter
END IF;
  END LOOP;
END;
Untuk menuju ke variabel global, harus ditambahkan label dan notasi dot.

Contoh :
<<main>>
DECLARE
  ctr INTEGER;
  ...
BEGIN
  ...
  FOR ctr IN 1..25 LOOP
...
IF main.ctr > 10 THEN -- refers to global variable
  ...
END IF;
  END LOOP;
END main;

Hal ini juga berlaku untuk nested loop.
Contoh :
<<main>>
DECLARE
  ctr INTEGER;
  ...
BEGIN
  <<outer>>
  FOR step IN 1..25 LOOP
FOR step IN 1..10 LOOP
  ...
  IF outer.step > 15 THEN
...
        END IF;
END LOOP;
  END LOOP outer;
END main;

Selain dapat digunakan pada perintah LOOP, perintah EXIT ini juga dapat digunakan pada FOR-LOOP untuk menambahkan kondisi tertentu. Namun perintah EXIT ini hanya bisa digunakan dalam loop saja.

Contoh:
BEGIN
   FOR j IN 1..10 LOOP
FETCH c1 INTO mhs_rec;
EXIT WHEN c1%NOTFOUND;
...
  END LOOP;
END;


BEGIN
  <<outer>>
  FOR i IN 1..5 LOOP
...
FOR j IN 1..10 LOOP
  FETCH c1 INTO mhs_rec;
  EXIT outer WHEN c1%NOTFOUND; -- exit both FOR loops
  ...
END LOOP;
  END LOOP outer;
  -- control passes here
END;

Perintah GOTO
Perintah ini digunakan untuk mengarahkan proses ke baris yang ditandai dengan label tertentu. Bentuk umum pemakaian perintah ini adalah:

GOTO nama_label;
Untuk memberikan label pada suatu baris tertentu, gunakan format penamaan label seperti berikut ini:

<<nama_label>>

Penggunaan perintah GOTO dalam jumlah yang banyak akan menyebabkan suatu blok PL/SQL menjadi tidak terstruktur. Karena itu sebaiknya penggunaan GOTO ini dihindari.
Contoh:

DECLARE
   x number;
BEGIN
   x := 0;
   LOOP
      x := x + 1;
      IF x = 5 THEN
            GOTO EndOfLoop;
      END IF;
   END LOOP;
   <<EndOfLoop>>dbms_output.put_line('Hasil looping : '||x);
END;

Contoh:
create or replace procedure coba
      (v_nim mahasiswa.nim %type) is
     
      cursor mhs_cur is
        select nim, nama, alamat
        from mahasiswa
        where nim=v_nim;
     
      mhs_rec mhs_cur%rowtype;                       
begin
 open mhs_cur;

 <<iterasi>>
 fetch mhs _cur into mhs _rec;

 if mhs _cur%notfound then
      goto lbl_end;
 end if;

 dbms_output.put_line(mhs _rec.nama_pegawai||' '||
 mhs_rec.alamat||' '|| mhs_rec.gaji);

 goto iterasi;

Dengan adanya perintah “goto iterasi”, proses berikutnya menuju baris “<<iterasi>>” yang berada beberapa sebelum baris goto tersebut. Selanjutnya, perintah-perintah yang mengikutinya akan diproses sesuai dengan urutannya (sekuensial). Sedangkan perintah “<<lbl_end>>” menentukan proses berikutnya adalah baris “<<lbl_end>>” yang berada setelah perintah goto tersebut.
      Namun demikian, pada saat menggunakan perintah goto harus diperhatikan hal-hal berikut:

  • perintah goto tidak boleh menuju label yang berada dalam perintah IF, LOOP, blok lain dan blok yang menjadi sub bloknya.
  • Sebuah label harus diikuti oleh paling tidak sebuah perintah eksekusi PL/SQL. Kata atau reserved word seperti END, END IF dan END LOOP tidak termasuk sebagai perintah eksekusi. Tetapi NULL termasuk perintah eksekusi.