Sunteți pe pagina 1din 19

SET SERVEROUTPUT ON

DECLARE
v_a NUmber;
v_b NUMBER;
v_total NUMBER;
BEGIN
v_a :=35;
v_b :=15;
v_total :=v_a+v_b;
DBMS_OUTPUT.PUT_LINE(v_a||' + '||v_b||' = '||v_total);
END;
Substitution Variables
-----------------------
DECLARE
v_a NUmber :=&a;
v_b NUMBER :=&b;
v_total NUMBER := v_a+v_b;
BEGIN
DBMS_OUTPUT.PUT_LINE(v_a||' + '||v_b||' = '||v_total);
END;
/
DECLARE
v_a NUmber :=&a;
v_b NUMBER :=&b;
v_division NUMBER := v_a/v_b;
BEGIN
DBMS_OUTPUT.PUT_LINE(v_a||' / '||v_b||' = '||v_division);
END;
/
Enter value for a: 8
Enter value for b: 0
DECLARE
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at line 4
DECLARE
v_a NUmber :=&a;
v_b NUMBER :=&b;
v_division NUMBER;
BEGIN
v_division := v_a/v_b;
DBMS_OUTPUT.PUT_LINE(v_a||' / '||v_b||' = '||v_division);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/

ITERATIVE CONTROL (loop)


------------------
EXX
Dispaly the integer less than 40
---------0--------10--------20--------30
---------1--------11--------21--------31
---------2--------12--------22--------32
---------3--------13--------23--------33
---------4--------14--------24--------34
---------5--------15--------25--------35
---------6--------16--------26--------36
---------7--------17--------27--------37
---------8--------18--------28--------38
---------9--------19--------29--------39
--------10--------20--------30--------40
solution
.........
DECLARE
x NUMBER := 0;
v_display VARCHAR2(200);
v_loop NUMBER := 0;
BEGIN
LOOP
LOOP
v_display :=v_display||LPAD(x+v_loop*10,10,'-');
v_loop :=v_loop+1;
EXIT WHEN v_loop = 4;
END LOOP;
DBMS_OUTPUT.PUT_LINE(v_display);
v_display := '';
v_loop :=0;
x := x+1;
EXIT WHEN x>10;
END LOOP;
END;
EXX
---
Display the sum of theintegers less or equal 10.
soln
----
total NUMBER := 0
counter NUMBER := 0
Logic Explanation
-----------------
------counter =====> 0------>10
| total := total + counter ===> 0
| counnter := counter+1 ====> 1
| total := total + counter ====> 1
| counter := counter + 1 ====> 2
| total := total + counter ====> 3
.....
| counter := counter + 1 =====> 10
| total := total + counter ====> ???
DECLARE
total NUMBER := 0;
counter NUMBER := 0;
BEGIN
LOOP
total := total + counter;
counter := counter + 1;
EXIT WHEN counter > 10;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Total : '||total);
END;
/
EXX
---
Display the total of odd numbers and the total of even numbers offr the integers
less or equal to ten
soln
----
alt 1
DECLARE
v_E NUMBER := 0;
v_O NUMBER := 0;
BEGIN
FOR i IN 1..10 LOOP
IF mod(i,2) = 0 THEN
v_E := v_E + i;
ELSE
v_O := v_O + i;
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Even :'||' '||v_E);
DBMS_OUTPUT.PUT_LINE('Odd :'||' '||v_O);
END;
/
alt 2
DECLARE
v_E NUMBER := 0;
v_O NUMBER := 0;
v_int NUMBER := 0;
BEGIN
LOOP
v_int := v_int + 1;
IF mod(v_int,2) = 0 THEN
v_E := V_E + v_int;
ELSE
v_O := v_O + v_int;
END IF;
EXIT WHEN v_int = 10;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Even :'||' '||v_E);
DBMS_OUTPUT.PUT_LINE('Odd :'||' '||v_O);
END;
/
alt 3
DECLARE
v_even NUMBER := 0;
v_odd NUMBER := 0;
BEGIN
FOR v_counter IN 1..10 LOOP
IF (v_counter-TRUNC(v_counter/2)*2) = 0 THEN
v_even := v_even + v_counter;
ELSE
v_odd := v_odd + v_counter;
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Even :'||' '||v_even);
DBMS_OUTPUT.PUT_LINE('Odd :'||' '||v_odd);
END;
/

--------------------
MULTIPLICATION TABLE
--------------------
Question
--------
Write a multiplication PlSQL block
DECLARE
v_num NUMBER := &number;
v_display VARCHAR2(100);
BEGIN
FOR i IN 1..10 LOOP
v_display := v_num * i;
DBMS_OUTPUT.PUT_LINE(v_num||' '||'*'||' '||i||' '||'='||' '||v_display);
END LOOP;
END;
alt2 (Aina)
----
DECLARE
v_num NUMBER := &Number;
BEGIN
FOR i IN 1..10 LOOP
DBMS_OUTPUT.PUT_LINE(v_num ||' x '||LPAD(i,2,' ')||' = '||LPAD(i*v_num,2
,' '));
END LOOP;
END;
EXX
---
=======================================================================
* ** * **
* **
*** ****
*** ****
***** ******
* **
*** ****
* **
=======================================================================
HINT: n Number of stars Number of lines
if n odd -----> n
n even -----> n-1
soln
-----
DECLARE
n_stars NUMBER :=&n;
n_lines NUMBER;
n_start NUMBER;
n_sign NUMBER := 1;
BEGIN
IF MOD(n_stars,2) = 0 THEN
n_lines := n_stars - 1;
n_start := 2;
ELSE
n_lines := n_stars;
n_start :=1;
END IF;
FOR I IN 1..n_lines LOOP
DBMS_OUTPUT.PUT_LINE(LPAD('*',n_start,'*'));
IF n_start = n_stars THEN
n_sign := -1;
END IF;
n_start :=n_start + n_sign * 2;
END LOOP;
END;
/
-------------------------------
Interaction with the database
-------------------------------
Display the last_name, first_name for one given employee_id.
DECLARE
v_last_name VARCHAR2(25);
v_first_name VARCHAR2(25);
v_employee_id NUMBER(6) :=&id;
BEGIN
SELECT last_name, first_name
INTO v_last_name, v_first_name
FROM employees
WHERE employee_id = v_employee_id;
DBMS_OUTPUT.PUT_LINE(' The employee''s name is '||v_first_name||' '||v_l
ast_name);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/

EXX
----
Display the employee's last_name, first_name, his/her manager's last_name for on
e given employee_id
soln
----
DECLARE
v_last_name VARCHAR2(25);
v_first_name VARCHAR2(25);
v_manager_name VARCHAR2(25);
v_employee_id NUMBER(6) :=&id;
BEGIN
SELECT e.last_name, e.first_name, m.last_name
INTO v_last_name, v_first_name, v_manager_name
FROM employees e JOIN employees m
ON (e.manager_id = m.employee_id)
WHERE e.employee_id = v_employee_id;
DBMS_OUTPUT.PUT_LINE(' The employee''s name is '||v_first_name||' '||v_l
ast_name);
DBMS_OUTPUT.PUT_LINE(' The manager''s name is '||v_manager_name);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
------------
USING %TYPE
------------
DECLARE
v_last_name EMPLOYEES.LAST_NAME%TYPE;
v_first_name EMPLOYEES.FIRST_NAME%TYPE;
v_employee_id EMPLOYEES.EMPLOYEE_ID%TYPE := &emp_id;
BEGIN
SELECT last_name, first_name
INTO v_last_name, v_first_name
FROM employees
WHERE employee_id = v_employee_id;
DBMS_OUTPUT.PUT_LINE(' The employee''s name is '||v_first_name||' '||v_l
ast_name);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
-------------
USING RECORDS
-------------
DECLARE
TYPE emptype IS
RECORD(last_name EMPLOYEES.LAST_NAME%TYPE,
first_name EMPLOYEES.FIRST_NAME%TYPE);
v_emp_rec emptype;
v_employee_id EMPLOYEES.EMPLOYEE_ID%TYPE := &emp_id;
BEGIN
SELECT last_name, first_name
INTO v_emp_rec
FROM employees
WHERE employee_id = v_employee_id;
DBMS_OUTPUT.PUT_LINE(' The employee''s name is '||v_emp_rec.first_name||
' '||v_emp_rec.last_name);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/

---------------
Using %ROWTYPE
---------------
DECLARE
v_emp_rec EMPLOYEES%ROWTYPE;
v_employee_id EMPLOYEES.EMPLOYEE_ID%TYPE := &emp_id;
BEGIN
SELECT * INTO v_emp_rec
FROM employees
WHERE employee_id = v_employee_id;
DBMS_OUTPUT.PUT_LINE(' The employee''s name is '||v_emp_rec.first_name||
' '||v_emp_rec.last_name);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
--------------
Using Cursors
---------------
memory area
Implicite Cursors Explicite cursors
---------------- -------------------
INSERT SELECT Returns m
ore than one row
DELETE
UPDATE
SELECT returns only one row
Example of Implicite cursor
---------------------------
give 10% of increase for the employees in the departments 10, 50, and 80, displa
y the number of employees processed.

BEGIN
UPDATE employees
SET salary=salary*1.1
WHERE department_id IN (10,50,80);
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT||' employees');
--COMMIT;
END;
/

-----------------
EXPLICITE CURSOR
-----------------
DECLARE THE CURSOR
OPEN the cursor
FETCH the cursor
CLOSE the cursor
Example
-------
Display the employee_id, last_name, first_name and salary for the employees in o
ne given department_id
soln
---
DECLARE
v_employees employees%ROWTYPE;
v_department_id employees.department_id%TYPE := &dept_id;
CURSOR v_emp_cur IS (SELECT * FROM employees
WHERE department_id=v_de
partment_id);
BEGIN
OPEN v_emp_cur;
LOOP
FETCH v_emp_cur INTO v_employees;
EXIT WHEN v_emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_employees.employee_id ||' '||
v_employees.last_name||
' '||
v_employees.first_name|
|' '||
v_employees.salary);
END LOOP;
DBMS_OUTPUT.PUT_LINE(v_emp_cur%ROWCOUNT|| ' Employees');
CLOSE v_emp_cur;
END;
/
Display the department_id and the employees_id, first name, last name and the sa
lary for the employoees inside one given department

soln alt 1
----------
DECLARE
v_employees employees%ROWTYPE;
v_department_id employees.department_id%TYPE := &dept_id;
CURSOR v_emp_cur IS (SELECT * FROM employees
WHERE department_id=v_de
partment_id);
CURSOR dept_cur IS (SELECT department_id, department_name from departmen
ts
where department_id = v_departme
nt_id);
dept_rec dept_cur%ROWTYPE;
v_text VARCHAR2(250);
BEGIN
OPEN dept_cur;
LOOP
FETCH dept_cur INTO dept_rec;
EXIT WHEN dept_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(dept_rec.department_id||' '||dept_rec.depar
tment_name);
DBMS_OUTPUT.PUT_LINE(LPAD('-',50,'-'));
v_department_id := dept_rec.department_id;
OPEN v_emp_cur;
LOOP
FETCH v_emp_cur INTO v_employees;
EXIT WHEN v_emp_cur%NOTFOUND;
v_text :=v_employees.employee_id ||' '||v_employees.last_name||' '||v_em
ployees.first_name;
v_text :=RPAD(v_text,30,' ')||LPAD(v_employees.salary,20,' ');
DBMS_OUTPUT.PUT_LINE(v_text);
END LOOP;
DBMS_OUTPUT.PUT_LINE(v_emp_cur%ROWCOUNT|| ' Employees');
CLOSE v_emp_cur;
END LOOP;
CLOSE dept_cur;
END;
/
soln alt 2(Aina)
----------------
DECLARE
v_department_id employees.department_id%TYPE := &dept_id;
CURSOR v_emp_cur IS (SELECT employee_id, first_name||' '||last_name name
, salary from employees
WHERE department_id=v_departmen
t_id);
v_employees v_emp_cur%ROWTYPE;
v_department_name departments.department_name%TYPE;
BEGIN
SELECT department_name INTO v_department_name
FROM departments WHERE department_id = v_department_id;
DBMS_OUTPUT.PUT_LINE(v_department_id||' '||v_department_name);
DBMS_OUTPUT.PUT_LINE(LPAD('-',52,'-'));
OPEN v_emp_cur;
LOOP
FETCH v_emp_cur INTO v_employees;
EXIT WHEN v_emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_employees.employee_id||' '||RPAD(v_employees.name
,40,' ')||
LPAD(v_employees.salary,8,' '));
END LOOP;
DBMS_OUTPUT.PUT_LINE(v_emp_cur%ROWCOUNT||' Employees');
CLOSE v_emp_cur;
END;
/
alt 3 (Using 1 Cursor)
-------------------------
DECLARE
v_department_id employees.department_id%TYPE := &dept_id;
CURSOR v_emp_cur IS (SELECT employee_id, first_name||' '||last_name name
, department_name, salary from employees right outer join departments using (dep
artment_id) WHERE department_id=v_department_id);
v_employees v_emp_cur%ROWTYPE;
v_department_name departments.department_name%TYPE;
v_salary employees.salary%TYPE := 0;
BEGIN
OPEN v_emp_cur;
LOOP
FETCH v_emp_cur INTO v_employees;
EXIT WHEN v_emp_cur%NOTFOUND;
IF v_emp_cur%ROWCOUNT=1 THEN
DBMS_OUTPUT.PUT_LINE(v_department_id||' '||v_employees.department_name);
DBMS_OUTPUT.PUT_LINE(LPAD('-',52,'-'));
END IF;
DBMS_OUTPUT.PUT_LINE(v_employees.employee_id||' '||RPAD(v_employees.name
,40,' ')||
LPAD(v_employees.salary,8,' '));
v_salary := v_salary + v_employees.salary;
END LOOP;
DBMS_OUTPUT.PUT_LINE(RPAD(v_emp_cur%ROWCOUNT||' Employees',40,' ')||LPAD
(v_salary,12,' '));
CLOSE v_emp_cur;
END;
/
alt 4 (FOR LOOP)
----------------
DECLARE
v_department_id employees.department_id%TYPE := &dept_id;
v_salary employees.salary%TYPE := 0;
v_row_count NUMBER := 0;
BEGIN
FOR v_emp_cur IN (SELECT employee_id, last_name, first_name, salary, dep
artment_name, department_id from employees JOIN departments USING (department_id
) WHERE department_id=v_department_id)
LOOP
IF v_row_count = 0 THEN
DBMS_OUTPUT.PUT_LINE(v_emp_cur.department_id||' '||v_emp_cur.dep
artment_name);
DBMS_OUTPUT.PUT_LINE(LPAD('-',52,'-'));
END IF;
DBMS_OUTPUT.PUT_LINE(RPAD(v_emp_cur.employee_id||' '||v_emp_cur.
last_name||' '||v_emp_cur.first_name,40,' ')||LPAD(TO_CHAR(v_emp_cur.salary,'99g
999d99'),12,' '));
v_salary := v_salary + v_emp_cur.salary;
v_row_count := v_row_count + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE(RPAD(v_row_count|| ' Employees Total :',42,' ')||TO
_CHAR(v_salary,'99g999d99'));
END;
/

-----------------------
PLSQL TABLE
-----------------------
DECLARATION
TYPE plsqltable_typename IS TABLE OF SCALAR_DATATYPE|RECORD_TYPE|ROWTYPE
INDEX BY BINARY_INTEGER;
plsqltablevariable plsqltable_typename;
Executable
plsqltalevariable(i) := value -- scalar data type
or
plsqltalevariable(i).fieldname := value -- For records or rowtype
PLSQL TABLE functions
plsqltablevariable.first ------> return the index of the first element
plsqltablevariable.last ------> return the index of the last element
plsqltablevariable.count ------> return the number elements
explanation
-------------
DECLARE
TYPE emptype IS RECORD(last_name employees.last_name%TYPE, first_name
employees.first_name%TYPE);
TYPE mytabletype IS TABLE OF emptype
INDEX BY BINARY_INTEGER;
emptable mytabletype;
BEGIN
emptable(5).last_name := 'One lastName';
emptable(5).first_name := 'First Name';
emptable(15).last_name := 'One LastName';
emptable(15).first_name := 'First Name';
DBMS_OUTPUT.PUT_LINE('emptable.first '||emptable.first);
DBMS_OUTPUT.PUT_LINE('emptable.last '||emptable.last);
DBMS_OUTPUT.PUT_LINE('emptable.count '||emptable.count);
DBMS_OUTPUT.PUT_LINE(emptable(emptable.first).last_name);
END;
/
EXAMPLE (USING PLSQL TABLE)
---------------------------
Display the department_id and the employees_id, first name, last name and the sa
lary for the employoees inside one given department
DECLARE
v_department_id employees.department_id%TYPE := &dept_id;
CURSOR v_emp_cur IS (SELECT employee_id, last_name, first_name, salary,
department_name, department_id FROM employees JOIN departments USING(de
partment_id) WHERE department_id = v_department_id);
TYPE emp_table_type IS TABLE OF v_emp_cur%ROWTYPE INDEX BY BINARY_INTEGE
R;
v_emp_table emp_table_type;
v_salary employees.salary%TYPE := 0;
BEGIN
OPEN v_emp_cur;
FETCH v_emp_cur BULK COLLECT INTO v_emp_table;
CLOSE v_emp_cur;
FOR i IN v_emp_table.first..v_emp_table.last
LOOP
IF i=1
THEN
DBMS_OUTPUT.PUT_LINE(v_emp_table(i).department_id||' '||v_emp_t
able(i).department_name);
DBMS_OUTPUT.PUT_LINE (LPAD('-',50,'-'));
END IF;
DBMS_OUTPUT.PUT_LINE(
v_emp_table(i).employee_id||' '||v_emp_table(i).last_name||' '|
|
v_emp_table(i).first_name||' '||v_emp_table(i).salary);
v_salary := v_salary + v_emp_table(i).salary;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' Total Salary : '||v_salary);
DBMS_OUTPUT.PUT_LINE(v_emp_table.count||' Employees');
END;
/
----------------------------
LIMITING PLSQL TABLE
----------------------------
output
------
1--> 5
198 OConnell Donald 2600
199 Grant Douglas 2600
200 Whalen Jennifer 4400
201 Hartstein Michael 13000
202 Fay Pat 6000
6--> 10
203 Mavris Susan 6500
204 Baer Hermann 10000
205 Higgins Shelley 12000
206 Gietz William 8300
100 King Steven 24000

DECLARE
v_limit NUMBER := &limit;
CURSOR v_emp_cur IS (SELECT * FROM employees);
TYPE emp_table_type IS TABLE OF employees%ROWTYPE INDEX BY BINARY_INTEGE
R;
v_emp_table emp_table_type;
v_salary employees.salary%TYPE := 0;
BEGIN
OPEN v_emp_cur;
LOOP
FETCH v_emp_cur BULK COLLECT INTO v_emp_table LIMIT v_limit;
EXIT WHEN v_emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_emp_cur%ROWCOUNT-v_emp_table.count+1||'--> '||v_e
mp_cur%ROWCOUNT);
FOR i IN v_emp_table.first..v_emp_table.last
LOOP
DBMS_OUTPUT.PUT_LINE(
v_emp_table(i).employee_id||' '||v_emp_table(i).last_name||' '|
|
v_emp_table(i).first_name||' '||v_emp_table(i).salary);
v_salary := v_salary + v_emp_table(i).salary;
END LOOP;
END LOOP;
DBMS_OUTPUT.PUT_LINE(v_emp_cur%ROWCOUNT-v_emp_table.count+1||'--> '||v_e
mp_cur%ROWCOUNT);
FOR i IN v_emp_table.first..v_emp_table.last
LOOP
DBMS_OUTPUT.PUT_LINE(
v_emp_table(i).employee_id||' '||v_emp_table(i).last_name||' '|
|
v_emp_table(i).first_name||' '||v_emp_table(i).salary);
v_salary := v_salary + v_emp_table(i).salary;
END LOOP;
DBMS_OUTPUT.PUT_LINE(v_emp_cur%ROWCOUNT|| ' Employees Total : '||v_salar
y);
CLOSE v_emp_cur;
END;
/
-------------------------------------------------
Display the list of employees in each department
-------------------------------------------------
alt 1
-----
DECLARE
v_employees employees%ROWTYPE;
v_department_id employees.department_id%TYPE;
CURSOR v_emp_cur IS (SELECT * FROM employees
WHERE department_id=v_de
partment_id);
CURSOR dept_cur IS (SELECT department_id, department_name from departmen
ts);
dept_rec dept_cur%ROWTYPE;
v_text VARCHAR2(250);
BEGIN
OPEN dept_cur;
LOOP
FETCH dept_cur INTO dept_rec;
EXIT WHEN dept_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(LPAD('-',50,'-'));
DBMS_OUTPUT.PUT_LINE(dept_rec.department_id||' '||dept_rec.depar
tment_name);
DBMS_OUTPUT.PUT_LINE(LPAD('-',50,'-'));
v_department_id := dept_rec.department_id;
OPEN v_emp_cur;
LOOP
FETCH v_emp_cur INTO v_employees;
EXIT WHEN v_emp_cur%NOTFOUND;
v_text :=v_employees.employee_id ||' '||v_employees.last_name||' '||v_em
ployees.first_name;
v_text :=RPAD(v_text,30,' ')||LPAD(v_employees.salary,20,' ');
DBMS_OUTPUT.PUT_LINE(v_text);
END LOOP;
DBMS_OUTPUT.PUT_LINE(v_emp_cur%ROWCOUNT|| ' Employees');
CLOSE v_emp_cur;
END LOOP;
CLOSE dept_cur;
END;
/
alt 2(Aina)
------
DECLARE
v_salary employees.salary%TYPE := 0;
v_row_count NUMBER := 0;
BEGIN
FOR vdept IN (SELECT department_id, department_name FROM departments)
LOOP
DBMS_OUTPUT.PUT_LINE(LPAD('-',50,'-'));
DBMS_OUTPUT.PUT_LINE(vdept.department_id||' '||vdept.department_
name);
DBMS_OUTPUT.PUT_LINE(LPAD('-',50,'-'));
v_salary := 0;
v_row_count := 0;
FOR v_emp_cur IN (SELECT employee_id, last_name, first_name, salary
FROM employees WHERE department_
id=vdept.department_id)
LOOP
DBMS_OUTPUT.PUT_LINE(v_emp_cur.employee_id||' '||v_emp_cur.last_
name||' '||
v_emp_cur.first_name||'
'||v_emp_cur.salary);
v_salary := v_salary + v_emp_cur.salary;
v_row_count := v_row_count + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE(v_row_count|| ' Employees Total : '||v_sala
ry);
END LOOP;
END;
/
EXX 1
---
Create a program that copies all departments to a table called old_dept. do not
use a cursor FOR loop. Display how many rows were copied.
soln
-----
Hint:
Creating the table structure
CREATE table old_dept as select * from departments where 1=2;
DECLARE
CURSOR dept_cur IS (SELECT * FROM departments);
v_dept_rec dept_cur%ROWTYPE;
BEGIN
OPEN dept_cur;
LOOP
FETCH dept_cur INTO v_dept_rec;
EXIT WHEN dept_cur%NOTFOUND;
INSERT INTO old_dept VALUES(v_dept_rec.department_id,v_dept_rec.departme
nt_name,v_dept_rec.manager_id,v_dept_rec.location_id);
END LOOP;
DBMS_OUTPUT.PUT_LINE(dept_cur%ROWCOUNT|| ' Employees processed');
CLOSE dept_cur;
COMMIT;
END;
EXX 2
----
Consider two tables having a column each of numbers. Get a number from each of t
he two tables, tehen insert the sum of rows into a third table. stop when all ro
ws have been fetched from either of the two tables.
A B C
1 2 3
4 5 9
10 11 21
22 23 45

CREATE TABLE A (A NUMBER);


CREATE TABLE B(B NUMBER);
CREATE TABLE C(C NUMBER);
DECLARE
v_table_name CHAR(1) := '&table_name';
v_num NUMBER := #
BEGIN
FOR i IN 1..v_num LOOP
IF v_table_name IN ('a','A') THEN
INSERT INTO A VALUES(TRUNC(DBMS_RANDOM.NORMAL*100));
ELSE
INSERT INTO B VALUES(TRUNC(DBMS_RANDOM.NORMAL*100));
END IF;
END LOOP;
END;
/

DECLARE
CURSOR a_cur IS (select * from A);
CURSOR b_cur IS (select * from B);
v_a NUMBER;
v_b NUMBER;
BEGIN
OPEN a_cur;
OPEN b_cur;
LOOP
FETCH a_cur INTO v_a;
EXIT WHEN a_cur%NOTFOUND;
FETCH b_cur INTO v_b;
EXIT WHEN b_cur%NOTFOUND;
INSERT INTO c VALUES(v_a+v_b);
END LOOP;
CLOSE b_cur;
CLOSE a_cur;
END;
/

EXX
---
Department: 90 Executive
--Job : AD_PRES President
------------100 King 24000
--Job : AD_VP Administration Vice President
------------101 Kochhar 17000
------------102 De Haan 17000
Department: 100 Finance
--Job : FI_MGR Finance Manager
------------108 Greenberg 12000
--Job : FI_ACCOUNT Accountant
------------109 Faviet 9000
------------110 Chen 8200
------------111 Sciarra 7700
------------112 Urman 7800

Aina soln (FOR LOOP)--incomplete


---------------------------------
DECLARE
BEGIN
FOR dept_cur IN (SELECT department_id, department_name FROM departments)
LOOP
-- Departments
FOR job_cur IN (SELECT distinct job_id, job_title
FROM employees JOIN jobs
USING (job_id)
WHERE department_id=dept_cur.dep
artment_id)
LOOP
-- jobs
FOR emp_cur IN (SELECT employee_id, last_name, first_nam
e, salary
FROM employees
WHERE department_id=dept_cur.dep
artment_id
AND job_id = job_cur.job_id)
LOOP
-- Employees
DBMS_OUTPUT.PUT_LINE('Department : '||dept_cur.d
epartment_id||' '||dept_cur.department_name);
END LOOP;
END LOOP;
END LOOP;
END;
/

alt 3(Aina) (complete)


----------------------
DECLARE
CURSOR dept_cur IS (SELECT * FROM departments);
CURSOR job_cur(p_department_id NUMBER) IS (SELECT DISTINCT job_id, job_
title
FROM employees JOIN jobs
USING (job_id)
WHERE department_id=p_department
_id);
CURSOR emp_cur(p_department_id NUMBER, p_job_id VARCHAR2)
IS (SELECT employee_id, last_name,
salary
FROM employees
WHERE department_id=p_department
_id
AND job_id=p_job_id);
v_dept_cur dept_cur%ROWTYPE;
v_job_cur job_cur%ROWTYPE;
v_emp_cur emp_cur%ROWTYPE;
BEGIN
OPEN dept_cur;
LOOP
FETCH dept_cur INTO v_dept_cur;
EXIT WHEN dept_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Department: '||v_dept_cur.department_id||'
'
||v_dept_cur.department_
name);
OPEN job_cur(v_dept_cur.department_id);
LOOP
FETCH job_cur INTO v_job_cur;
EXIT WHEN job_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('--'||'Job : '||v_job_cur.j
ob_id||' '||v_job_cur.job_title);
OPEN emp_cur(v_dept_cur.department_id,v_
job_cur.job_id);
LOOP
FETCH emp_cur INTO v_emp
_cur;
EXIT WHEN emp_cur%NOTFOU
ND;
DBMS_OUTPUT.PUT_LINE(v_e
mp_cur.employee_id||' '||
v_emp_cur.last_name||' '||
v_emp_cur.salary);
END LOOP;
CLOSE emp_cur;
END LOOP;
CLOSE job_cur;
END LOOP;
CLOSE dept_cur;
END;
/
sort the employees by last_name in descending order
---------------------------------------------------
TIPS (Ref Cursor)
soln
----
DECLARE
CURSOR dept_cur IS (SELECT * FROM departments);
CURSOR job_cur(p_department_id NUMBER) IS (SELECT DISTINCT job_id, job_
title
FROM employees JOIN jobs
USING (job_id)
WHERE department_id=p_department
_id);
emp_cur SYS_REFCURSOR;
v_sqlstmt VARCHAR2(250);
v_dept_cur dept_cur%ROWTYPE;
v_job_cur job_cur%ROWTYPE;
v_emp_cur employees%ROWTYPE;
BEGIN
OPEN dept_cur;
LOOP
FETCH dept_cur INTO v_dept_cur;
EXIT WHEN dept_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Department: '||v_dept_cur.department_id||'
'
||v_dept_cur.department_
name);
OPEN job_cur(v_dept_cur.department_id);
LOOP
FETCH job_cur INTO v_job_cur;
EXIT WHEN job_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('--'||'Job : '||v_job_cur.j
ob_id||' '||v_job_cur.job_title);
v_sqlstmt := 'SELECT * FROM employees ';
v_sqlstmt := v_sqlstmt||' WHERE department_id= '||v_dept_cur.dep
artment_id;
v_sqlstmt := v_sqlstmt||' AND job_id='''||v_job_cur.job_id;
v_sqlstmt := v_sqlstmt||''' ORDER BY last_name DESC';
OPEN emp_cur FOR v_sqlstmt;
LOOP
FETCH emp_cur INTO v_emp_cur;
EXIT WHEN emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('----------'||v_emp
_cur.employee_id||' '||
v_emp_cur.last_name||' '||v_emp_cur.sala
ry);
END LOOP;
CLOSE emp_cur;
END LOOP;
CLOSE job_cur;
END LOOP;
CLOSE dept_cur;
END;
/
EXX
---
Display the employee's id, last_name, salary and job_id for one department, sort
the output by job_id in descending order and salary in ascending order

soln
----
DECLARE
v_dept_id departments.department_id%TYPE := &dept_id;
emp_cur SYS_REFCURSOR;
v_emp_cur employees%ROWTYPE;
v_sqlstmt VARCHAR2(250);
v_text VARCHAR2(250);
BEGIN
v_sqlstmt := 'SELECT * FROM employees';
v_sqlstmt := v_sqlstmt||' WHERE department_id = '||v_dept_id;
v_sqlstmt := v_sqlstmt||' ORDER BY job_id desc, salary asc';
OPEN emp_cur FOR v_sqlstmt;
LOOP
FETCH emp_cur INTO v_emp_cur;
EXIT WHEN emp_cur%NOTFOUND;
v_text := v_emp_cur.employee_id||' '||v_emp_cur.last_name;
v_text := RPAD(v_text,10,' ')||LPAD(v_emp_cur.salary,10,' ')||'
'||v_emp_cur.job_id;
DBMS_OUTPUT.PUT_LINE(v_text);
END LOOP;
CLOSE emp_cur;
END;
/
---------------------------------------------------------
NAMED BLOCK (FUNCTIONS,PROCEDURES, PACKAGES AND TRIGGERS)
---------------------------------------------------------
CREATE PROCEDURE procedure_name(parameters...)
IS
declaration section
BEGIN
EXCEPTION
END;
---------------------------------------------------------
SQL>CONNECT SYS/ORACLE AS SYSDBA
SQL> CREATE PROCEDURE PRINT(p_message VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE(p_message);
END;
/
SQL> CREATE PUBLIC SYNONYM PRINT FOR PRINT;
SQL> GRANT execute on print to PUBLIC;
---------------------------------------
Multiplication Table Procedure
--------------------------------------
CREATE OR REPLACE PROCEDURE Multiply(p_num NUMBER)
IS
BEGIN
FOR i IN 1..10 LOOP
PRINT(p_num ||' x '|| LPAD(i,2,' ')||' = '||LPAD(i*p_num,2,' '));
END LOOP;
END;
SQL> EXECUTE multiply(4);
EXAMPLE
-------
Create one procedure named display_dept to display the employee's id, last_name,
salary and job_id for one department. Sort the output by job_id in descending o
rder and salary in ascending order
soln
----
CREATE PROCEDURE display_dept(p_department_id NUMBER)
IS
emp_cur SYS_REFCURSOR;
v_emp_cur employees%ROWTYPE;
v_sqlstmt VARCHAR2(250);
v_text VARCHAR2(250);
BEGIN
v_sqlstmt := 'SELECT * FROM employees';
v_sqlstmt := v_sqlstmt||' WHERE department_id = '||p_department_id;
v_sqlstmt := v_sqlstmt||' ORDER BY job_id desc, salary asc';
OPEN emp_cur FOR v_sqlstmt;
LOOP
FETCH emp_cur INTO v_emp_cur;
EXIT WHEN emp_cur%NOTFOUND;
v_text := v_emp_cur.employee_id||' '||v_emp_cur.last_name;
v_text := RPAD(v_text,10,' ')||LPAD(v_emp_cur.salary,10,' ')||'
'||v_emp_cur.job_id;
DBMS_OUTPUT.PUT_LINE(v_text);
END LOOP;
CLOSE emp_cur;
END;
/

S-ar putea să vă placă și