Setelah lama ga update blog, malah ketemu soal tentang cursor yang menarik
1. Buatlah statement pl/sql dengan menggunakan cursor untuk menampilkan
employee_id, department_id, salary, dan rata-rata salary per departemen
maksimal 10 baris. Dan Tampilkan juga berapa rows yg ditampilkan.
 
  
SET SERVEROUTPUT ON 
  DECLARE 
  emp employees.employee_id%type; 
  dep employees.department_id%type; 
  sal employees.salary%type; 
  avsal employees.salary%type; 
  CURSOR emp_cursor 
  IS 
  SELECT employee_id, salary,
  department_id,(selectavg(salary) FROM employees 
  WHERE department_id= b.department_id) FROM employees b; 
  BEGIN 
  OPEN emp_cursor; 
  LOOP 
  FETCH emp_cursor into emp, sal, dep, avsal; 
  dbms_output.put_line('emp id: ' || emp || ' ' || 'department id :
  ' || dep || ' ' || 'salary : ' || sal || ' ' || 'average salary : ' ||
  avsal); 
  EXIT WHEN emp_cursor%ROWCOUNT = 10; 
  END LOOP; 
  dbms_output.put_line('jumlah baris= : ' || emp_cursor%ROWCOUNT); 
  CLOSE emp_cursor; 
  end; 
  / 
Hasilnya : 
  emp id: 198 department id : 50 salary : 2600 average salary : 3475,56 
  emp id: 199 department id : 50 salary : 2600 average salary : 3475,56 
  emp id: 200 department id : 10 salary : 4400 average salary : 4400 
  emp id: 201 department id : 20 salary : 13000 average salary : 10450 
  emp id: 202 department id : 20 salary : 7900 average salary : 10450 
  emp id: 203 department id : 40 salary : 6500 average salary : 6500 
  emp id: 204 department id : 70 salary : 10000 average salary : 10000 
  emp id: 205 department id : 110 salary : 12000 average salary : 10150 
  emp id: 206 department id : 110 salary : 8300 average salary : 10150 
  emp id: 100 department id : 90 salary : 1000 average salary : 11666,67 
  jumlah baris = : 10 
  PL/SQL procedure successfully completed. 
 | 
 
 
2.
Tampilkanlah first name, last name, dan salary dari tabel employees dengan
menggunakan cursor yang memiliki sebuah parameter. Kemudian Tampilkan data
karyawan tersebut dimana karyawan tersebut memiliki salary yang nilainya lebih
kecil dari salary dari parameter cursor
 
  
DECLARE 
  CURSOR cur_emps(salary_param NUMBER) IS 
  SELECT first_name, last_name, salary 
  FROM employees WHERE salary < salary_param; 
  f_name employees.first_name%type; 
  l_name employees.last_name%type; 
  gaji employees.salary%type; 
BEGIN 
  OPEN cur_emps(2500); 
  LOOP 
  FETCH cur_emps INTO  f_name, l_name, gaji; 
  EXIT WHEN cur_emps%NOTFOUND; 
  DBMS_OUTPUT.PUT_LINE(f_name || ' ' || l_name || ' memiliki gaji: '
  || gaji); 
  END LOOP; 
  CLOSE cur_emps; 
  END; 
  / 
Hasil jika nilai
  parameter=2500 
Steven King memiliki
  gaji: 1000  
  James Landry memiliki gaji: 2400  
  Steven Markle memiliki gaji: 2200  
  TJ Olson memiliki gaji: 2100  
  Ki Gee memiliki gaji: 2400  
  Hazel Philtanker memiliki gaji: 2200  
  Peter Tucker memiliki gaji: 1000  
  Tayler Fox memiliki gaji: 2100  
  PL/SQL procedure successfully completed. 
 | 
 
 
3.
Buatlah sebuah cursor yang digunakan untuk mengUPDATE salary karyawan menjadi 2
kali gaji awal dimana id karyawan tersebut adalah 109. Kemudian tampilkan pesan
‘Data Telah diUpdate’ ketika data telah berhasil diUPDATEdan tampilkan pesan
‘Karyawan tidak ditemukan’ ketika employee_id nya tidak terdapat dalam database.
 
  
  
 | 
  | 
 
  
DECLARE 
CURSOR cur_upd_salary(comp_emp_id NUMBER) IS 
  SELECT salary FROM employees WHERE employee_id
  = comp_emp_id 
      
  FOR UPDATE OF SALARY; 
  id employees.employee_id%type; 
BEGIN 
  OPEN cur_upd_salary(109); 
  FETCH cur_upd_salary INTO id; 
  IF SQL%NOTFOUND THEN 
  DBMS_OUTPUT.PUT_LINE ('Karyawan tidak ditemukan!'); 
  ELSE 
  UPDATE employees 
  SET salary = salary * 2 
  WHERE CURRENT OF cur_upd_salary; 
  DBMS_OUTPUT.PUT_LINE('UPDATE SUCCESS!'); 
  END IF; 
  CLOSE cur_upd_salary; 
END; 
  / 
 | 
 
 
4. Buatlah sebuah table yang sama dengan table
employees dengan nama employees2. Kemudian buatlah sebuah cursor yang berguna
untuk menghapus data karyawan yang memiliki employee_id = 120. Dan pastikan
data yang telah dihapus tidak dapat dikembalikan
 
  
  
CREATE TABLE employees2 
  AS 
  SELECT * FROM employees; 
  DECLARE 
  CURSOR cur_upd_emp(emp_id varchar2) IS 
  SELECT employee_id FROM employees2 WHERE employee_id
  = emp_id 
  FOR UPDATE; 
  id employees.employee_id%TYPE; 
  BEGIN 
    OPEN cur_upd_emp(120); 
  FETCH cur_upd_emp into id; 
    IF cur_upd_emp%FOUND then 
  DELETE FROM employees2 
    WHERE CURRENT
  OF cur_upd_emp; 
    COMMIT; 
    ELSE 
    
  DBMS_OUTPUT.PUT_LINE('data
  not found'); 
    END IF; 
    CLOSE cur_upd_emp; 
  END; 
  / 
 | 
 
 
5. Buatlah sebuah Anonymous block untuk case berikut ini
Gunakan CURSOR dan WHERE CURRENT OF cursor sebagai solusi
Case :
Lakukan update terhadap data lokasi beberapa nama department berikut :
- Department “Recruiting” dan “Administration” akan diupdate lokasinya sama
dengan  lokasi department  “Human Resources”
- Department  “Retail Sales” dan  “Government Sales” akan diupdate
lokasinya sama dengan department “Sales”
Notes :
- Buatlah agar perubahan tersebut
     tidak dapat dirollback
 
- Buatlah exception jika terjadi
     table departments sedang dilock Tampilkan pesan ‘ Row of Departments table is locked’ (error number is –54, dapat menggunakan PRAGMA
     EXCEPTION_INIT)
 
- Jika terjadi error lainnya
     tampilkan RAISE_APPLICATION_ERROR nomor -20001, pesannya ‘Unknown Error‘
 
 
   | 
   | 
 
  
 
 | 
 
 | 
DECLARE 
CURSOR dept_cursor  IS SELECT * FROM departments 
  WHERE department_namein('Recruiting','Administration','Retail Sales','Government
  Sales') for update; 
  Loc1 departments.location_id%type; 
  Loc2 departments.location_id%type; 
  Loc departments.location_id%type; 
  row_lock EXCEPTION; 
  PRAGMA
  EXCEPTION_INIT(row_lock, -54); 
  BEGIN 
  SELECT select location_id INTO loc1 from departmentswhere department_name ='Human Resources'; 
  SELECT location_id INTO loc2 from departments wheredepartment_name='Sales'; 
  for dept_record in dept_cursor 
  loop 
  if ( dept_record.department_name ='Recruiting' or dept_record.department_name
  ='Administration' )  then 
  loc:=loc1;   else 
  loc:=loc2; 
  END IF; 
  UPDATE departments set location_id =loc 
  WHERE current of dept_cursor; 
  COMMIT; 
  end loop; 
  EXCEPTION 
  WHEN row_lock THEN 
  DBMS_OUTPUT.PUT_LINE('Row of Departments table is locked'); 
  WHEN OTHERS THEN 
  RAISE_APPLICATION_ERROR (-20001,'Unknown Error'); 
  end; 
 |