You are on page 1of 6

SET SERVEROUTPUT ON;

--1
DECLARE
N NUMBER:=0;
BEGIN
WHILE N <=48
LOOP
N:=N+2;
DBMS_OUTPUT.PUT_LINE(N);
END LOOP;
END;

--2
DECLARE
X VARCHAR(100) := '';
Num INTEGER := &Num;
BEGIN
FOR i IN REVERSE 1..Num LOOP
FOR ii IN 1..Num-i LOOP
X := X || ' ';
END LOOP;

FOR ii IN 1..2*i-1 LOOP


X := X || '*';
END LOOP;
DBMS_OUTPUT.PUT_LINE (X);
X := '';
END LOOP;
FOR i IN 1..Num LOOP
FOR ii IN 1..Num-i LOOP
X := X || ' ';
END LOOP;
FOR ii IN 1..2*i-1 LOOP
X := X || '*';
END LOOP;
DBMS_OUTPUT.PUT_LINE (X);
X := '';
END LOOP;
END;

--3
DECLARE
N NUMBER:=0;
BEGIN
WHILE N <=95
LOOP
N:=N+5;
DBMS_OUTPUT.PUT_LINE(N);
END LOOP;
END;

--4
DECLARE
A NUMBER(2):=&A;
B NUMBER(2):=1;
C NUMBER(3);
BEGIN
WHILE B <=10
LOOP
C:=A*B;
DBMS_OUTPUT.PUT_LINE(A||'*'||B||'='||C);
B:=B+1;
END LOOP;
END;

--5
DECLARE
A NUMBER:=1;
V VARCHAR2(5):=1;
BEGIN
DBMS_OUTPUT.PUT_LINE(V);
FOR I IN 1..4
LOOP
IF SUBSTR(V,1,1)='1' THEN
V:='0'||V;
ELSE
V:='1'||V;
END IF;
DBMS_OUTPUT.PUT_LINE(V);
END LOOP;
END;

--6
DECLARE
EMPNOV NUMBER:=&InputIDEmployee;
ENAMEV EMPLOYEES.LAST_NAME%TYPE;
SALV EMPLOYEES.SALARY%TYPE;
HIREDATEV EMPLOYEES.HIRE_DATE%TYPE;
EXP NUMBER(7,2);
TA NUMBER(7,2);
DA NUMBER(7,2);
HRA NUMBER(7,2);
LIC NUMBER(7,2);
GROSS NUMBER(7,2);
S NUMBER:=0;
BEGIN
SELECT first_name ||' '||last_name,salary,HIRE_DATE INTO ENAMEV,SALV,HIREDATEV FROM
EMPLOYEES WHERE EMPLOYEE_ID=EMPNOV;
EXP:=ROUND(MONTHS_BETWEEN(SYSDATE,HIREDATEV)/12);
TA:=SALV*30/100;
DA:=SALV*20/100;
HRA:=SALV*15/100;
LIC:=SALV*5/100;
GROSS:=SALV+TA+DA+HRA-LIC;
DBMS_OUTPUT.PUT_LINE('NIP: '||EMPNOV);
DBMS_OUTPUT.PUT_LINE('Nama Pegawai: '||ENAMEV);
DBMS_OUTPUT.PUT_LINE('Gaji: $.'||SALV);
DBMS_OUTPUT.PUT_LINE('Bruto: $.'||GROSS);
DBMS_OUTPUT.PUT_LINE('Pengalaman Kerja: '||EXP||'Thn');
DBMS_OUTPUT.PUT_LINE('Tunjangan Transportasi: $.'||TA);
DBMS_OUTPUT.PUT_LINE('Tunjangan Pensiun: $.'||DA);
DBMS_OUTPUT.PUT_LINE('Tunjangan Sewa Rumah/Apartemen/Kos: $.'||HRA);
DBMS_OUTPUT.PUT_LINE('Biaya Asuransi Jiwa: $.'||LIC);
END;

--7
--Store Function
CREATE OR REPLACE FUNCTION REVERSE(STR VARCHAR2) RETURN VARCHAR2
IS
STR1 VARCHAR2(200);
S VARCHAR2(200);
N NUMBER(4);
BEGIN
FOR I IN 1..LENGTH(STR)
LOOP
S:=SUBSTR(STR,I,1);
N:=ASCII(S);
IF N BETWEEN 65 AND 90 THEN
STR1:=STR1||CHR(N+32);
ELSE
STR1:=STR1||CHR(N-32);
END IF;
END LOOP;
RETURN 'String (setelah pembalikan): '||STR1;
END;
--Caller
DECLARE
x VARCHAR2(200):='&InputString';
BEGIN
--SELECT REVERSE(x) FROM DUAL;
DBMS_OUTPUT.PUT_LINE('String (sebelum pembalikan): '||x);
DBMS_OUTPUT.PUT_LINE(REVERSE(x));
END;

--8
DECLARE
TYPE year_type IS
TABLE OF NUMBER INDEX BY binary_integer;
year_sales year_type;
tot_sales NUMBER := 0;
i NUMBER;
BEGIN
year_sales(2012) := &Thn2012;
year_sales(2013) := &Thn2013;
year_sales(2014) := &Thn2014;
year_sales(2015) := &Thn2015;
year_sales(2016) := &Thn2016;

FOR i IN 2012..2016
LOOP
tot_sales := tot_sales + year_sales(i);
dbms_output.put_line('Penjualan Tahun ' || i || ': Rp.' ||
year_sales(i)||',00');
END LOOP;
dbms_output.put_line('Total Penjualan= Rp.'|| tot_sales||',00');
END;

--9
DECLARE
n_pct employees.commission_pct%TYPE;
namegab VARCHAR2(50);
v_eval varchar2(10);
n_emp_id employees.employee_id%TYPE;
BEGIN
n_emp_id := &ID_Emp;
SELECT commission_pct, first_name ||' '|| last_name INTO n_pct, namegab FROM
employees WHERE employee_id = n_emp_id;
CASE n_pct
WHEN 0 THEN
v_eval := 'N/A';
WHEN 0.1 THEN
v_eval := 'Rendah';
WHEN 0.4 THEN
v_eval := 'Tinggi';
ELSE
v_eval := 'Standar';
END CASE;
IF n_pct IS NULL THEN
DBMS_OUTPUT.PUT_LINE('ID Pegawai ' || n_emp_id ||
' atas nama ' || TO_CHAR(namegab) ||
' tidak memiliki prosentase komisi ');
ELSE
DBMS_OUTPUT.PUT_LINE ('ID Pegawai ' || n_emp_id ||
' atas nama ' || TO_CHAR(namegab) ||
' memiliki prosentase komisi sebesar ' || TO_CHAR(n_pct)||
' yang digolongkan ' || v_eval);
END IF;
END;

--10
DECLARE
CURSOR name_cur IS SELECT first_name FROM employees
WHERE rownum <= 20;

TYPE name_array IS TABLE OF employees.first_name%TYPE INDEX BY BINARY_INTEGER;


first_name_tab name_array;
v_counter INTEGER := 0;
BEGIN

FOR name_rec IN name_cur LOOP


v_counter := v_counter + 1;
first_name_tab(v_counter) := name_rec.first_name;
DBMS_OUTPUT.PUT_LINE ('First Name('||v_counter||'): '||
first_name_tab(v_counter));
END LOOP;
END;

--11
DECLARE
CURSOR c1 IS
SELECT *
FROM employees
ORDER BY first_name, last_name;

TYPE t_emps IS TABLE OF employees%ROWTYPE


INDEX BY pls_integer;
v_emp_list t_emps;
BEGIN
OPEN c1;
FETCH c1 BULK COLLECT INTO v_emp_list;
CLOSE c1;

IF v_emp_list.COUNT > 0 THEN


FOR i IN v_emp_list.FIRST .. v_emp_list.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(v_emp_list(i).phone_number|| ' ' ||
v_emp_list(i).email);
END LOOP;
ELSE
DBMS_OUTPUT.PUT_LINE('Tidak Ada Data Pegawai Yang Ditemukan!');
END IF;
END;

--12
CREATE TABLE RegBckp AS SELECT * FROM REGIONS;

CREATE OR REPLACE TRIGGER Backup_Regions


AFTER INSERT ON Regions
FOR EACH ROW
BEGIN
INSERT INTO RegBckp VALUES (:NEW.REGION_ID, :NEW.REGION_NAME);
END;

INSERT INTO REGIONS VALUES (5, 'Australia');

SELECT * FROM Regions;


SELECT * FROM RegBckp;

--13
-- package specification
CREATE OR REPLACE PACKAGE emp_actions AS
PROCEDURE hire_employee (employee_id NUMBER, last_name VARCHAR2,
first_name VARCHAR2, email VARCHAR2, phone_number VARCHAR2,
hire_date DATE, job_id VARCHAR2, salary NUMBER, commission_pct NUMBER,
manager_id NUMBER, department_id NUMBER);
PROCEDURE fire_employee (emp_id NUMBER);
FUNCTION num_above_salary (emp_id NUMBER) RETURN NUMBER;
END emp_actions;

-- package body
CREATE OR REPLACE PACKAGE BODY emp_actions AS
PROCEDURE hire_employee (employee_id NUMBER, last_name VARCHAR2,
first_name VARCHAR2, email VARCHAR2, phone_number VARCHAR2, hire_date DATE,
job_id VARCHAR2, salary NUMBER, commission_pct NUMBER,
manager_id NUMBER, department_id NUMBER) IS
BEGIN
INSERT INTO employees VALUES (employee_id, last_name, first_name, email,
phone_number, hire_date, job_id, salary, commission_pct, manager_id,
department_id);
END hire_employee;
PROCEDURE fire_employee (emp_id NUMBER) IS
BEGIN
DELETE FROM employees WHERE employee_id = emp_id;
END fire_employee;
FUNCTION num_above_salary (emp_id NUMBER) RETURN NUMBER IS
emp_sal NUMBER(8,2);
num_count NUMBER;
BEGIN
SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id;
SELECT COUNT(*) INTO num_count FROM employees WHERE salary > emp_sal;
RETURN num_count;
END num_above_salary;
END emp_actions;

--Calling Package
CALL emp_actions.hire_employee(300, 'Belden', 'Enrique', 'EBELDEN',
'555.111.2222', '31-AUG-04', 'AC_MGR', 20000, .1, 101, 110);

BEGIN
DBMS_OUTPUT.PUT_LINE( 'Jumlah pegawai dengan gaji diatas ID pegawai 100 : ' ||
TO_CHAR(emp_actions.num_above_salary(100)));
END;

CALL emp_actions.fire_employee(300);

You might also like