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 :
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; |
Hai ka, mau tanya bagaimana cara menyelesaikan ini ya ? stored procedure yang menggunakan cursor
BalasHapuskalau stored procedure itu dipanggil
membuat table temporary / variable
dan data web_reward diinput kedalam table tersebut
yang dimana data reward harus :
1. tgl hari ini didalam periode start date dan end date
2. keadaan active
3. harus memiliki Web_RewardDetails
4. kalau total reward amount didalam Web_RewardDetails melebihi 100000 tambahkan kolom Yes
5. kalau total reward amount didalam Web_RewardDetails dibawah 100000 tambahkan kolom No
kak no1 dan 2 dapat hasil output seperti itu kok tiba2 langsung keluar output yang masih gak nyambung dengan scriptnya
BalasHapus