WEEK-12 Cursor With Parameter: Create
WEEK-12 Cursor With Parameter: Create
set serveroutput on
CREATE TABLE employees
( employee_id
last_name
email
hire_date
job_id
department_id
salary
manager_id
);
number(10)
varchar2(50)
varchar2(30),
date,
varchar2(30),
number(10),
number(6),
number(6)
not null,
not null,
Table created.
SQL>
SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id,
salary,department_id ,manager_id)
2
values ( 1001, 'Lawson', '[email protected]', '01-JAN2002','MGR', 30000,1 ,1004);
1 row created.
SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id,
salary, department_id ,manager_id)
2
values ( 1002, 'Wells', '[email protected]', '01-JAN-2002', 'D
BA', 20000,2, 1005 );
1 row created.
SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id,
salary, department_id ,manager_id)
2
values( 1003, 'Bliss', '[email protected]', '01-JAN-2002', 'P
ROG', 24000,3 ,1004);
1 row created.
SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id,
salary, department_id, manager_id)
2
values( 1004,
GR',25000 ,4, 1005);
1 row created.
SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id,
salary, department_id, manager_id)
2
values( 1005, 'Viper', 'sdillon@a .com', SYSDATE, 'PROG',
20000, 1, 1006);
1 row created.
SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id,
salary, department_id,manager_id)
2
values( 1006, 'Beck', '[email protected]', SYSDATE, 'PROG', 200
00, 2, null);
1 row created.
SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id,
salary, department_id, manager_id)
2
values( 1007, 'Java', '[email protected]', SYSDATE, 'PROG', 200
00, 3, 1006);
1 row created.
SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id,
salary, department_id, manager_id)
2
values( 1008, 'Oracle', '[email protected]', SYSDATE, 'DBA', 2
0000, 4, 1006);
1 row created.
SQL>
SQL>
SQL> declare
2
cursor cursorValue (p_deptid in number)
3
is select *
4
from employees
5
where department_id = p_deptid;
6
7
l_emp employees%rowtype;
8 begin
9
open cursorValue(30);
10
loop
11
fetch cursorValue into l_emp;
12
exit when cursorValue%notfound;
13
dbms_output.put('Employee id ' || l_emp.employee_id || ' is ');
14
dbms_output.put_line(l_emp.last_name);
15
end loop;
16
close cursorValue;
17
18
dbms_output.put_line('Getting employees for department 90');
19
open cursorValue(90);
20
loop
21
fetch cursorValue into l_emp;
22
exit when cursorValue%notfound;
23
dbms_output.put('Employee id ' || l_emp.employee_id || ' is ');
24
dbms_output.put_line(l_emp.last_name);
25
end loop;
26
close cursorValue;
27 end;
28 /
Getting employees for department 90
PL/SQL procedure successfully completed.
SQL>
SQL> drop table employees;
Table dropped.
SQL> --
SQL>
SQL>
2
3
4
5
6
7
8
9
10
11
Table created.
NOT NULL,
SQL>
SQL> -- prepare data
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,
End_Date,
Salary, City,
Description)
2
values ('01','Jason',
'Martin', to_date('19960725','YYYY
MMDD'), to_date('20060725','YYYYMMDD'), 1234.56, 'Toronto', 'Programmer')
3 /
1 row created.
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,
End_Date,
Salary, City,
Description)
2
values('02','Alison',
'Mathews', to_date('19760321','YYYY
MMDD'), to_date('19860221','YYYYMMDD'), 6661.78, 'Vancouver','Tester')
3 /
1 row created.
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,
End_Date,
Salary, City,
Description)
2
values('03','James',
'Smith',
to_date('19781212','YYYY
MMDD'), to_date('19900315','YYYYMMDD'), 6544.78, 'Vancouver','Tester')
3 /
1 row created.
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,
End_Date,
Salary, City,
Description)
2
values('04','Celia',
'Rice',
to_date('19821024','YYYY
MMDD'), to_date('19990421','YYYYMMDD'), 2344.78, 'Vancouver','Manager')
3 /
1 row created.
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,
End_Date,
Salary, City,
Description)
2
values('05','Robert',
'Black',
to_date('19840115','YYYY
MMDD'), to_date('19980808','YYYYMMDD'), 2334.78, 'Vancouver','Tester')
3 /
1 row created.
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,
End_Date,
Salary, City,
Description)
2
values('06','Linda',
'Green',
to_date('19870730','YYYY
MMDD'), to_date('19960104','YYYYMMDD'), 4322.78,'New York', 'Tester')
3 /
1 row created.
LAST_NAME
START_DAT END_DATE
SALARY CITY
DESCRIPTI
25-JUL-96 25-JUL-06
1234.56 Toronto
Programme
Mathews
Smith
Rice
Black
Green
Larry
Cat
21-MAR-76
12-DEC-78
24-OCT-82
15-JAN-84
30-JUL-87
31-DEC-90
17-SEP-96
6661.78
6544.78
2344.78
2334.78
4322.78
7897.78
1232.78
Tester
Tester
Manager
Tester
Tester
Manager
Tester
21-FEB-86
15-MAR-90
21-APR-99
08-AUG-98
04-JAN-96
12-FEB-98
15-APR-02
Vancouver
Vancouver
Vancouver
Vancouver
New York
New York
Vancouver
8 rows selected.
SQL>
SQL>
SQL> -- In the UPDATE statement, you use the WHERE CURRENT OF option to identi
fy the record to be updated.
SQL>
SQL> DECLARE
2
3
CURSOR myCursor
4
IS SELECT ID, first_name, last_name
5
FROM employee FOR UPDATE of salary NOWAIT;
6
7
mySalary employee.salary%TYPE;
8 BEGIN
9
10
FOR employee_record IN myCursor LOOP
11
SELECT salary INTO mySalary FROM employee where id = employee_rec
ord.ID;
12
13
IF mySalary < 3000 THEN
14
UPDATE employee SET salary = salary * 1.2 WHERE CURRENT OF
myCursor;
15
DBMS_OUTPUT.PUT_LINE('Updated');
16
END IF;
17
END LOOP;
18 END;
19 /
Updated
Updated
Updated
Updated
PL/SQL procedure successfully completed.
SQL>
SQL>
SQL>
SQL>
SQL> -- clean the table
SQL> drop table Employee
2 /
Table dropped.
SQL>
SQL>
SQL>
SQL> CREATE TABLE lecturer (
2
id
NUMBER(5) PRIMARY KEY,
3
first_name
VARCHAR2(20),
4
last_name
VARCHAR2(20),
5
6
7
major
current_credits
);
VARCHAR2(30),
NUMBER(3)
Table created.
SQL>
SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2
VALUES (10001, 'Scott', 'Lawson','Computer Science', 11);
1 row created.
SQL>
SQL> INSERT INTO lecturer (id, first_name, last_name, major, current_credits)
2
VALUES (10002, 'Mar', 'Wells','History', 4);
1 row created.
SQL>
SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2
VALUES (10003, 'Jone', 'Bliss','Computer Science', 8);
1 row created.
SQL>
SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2
VALUES (10004, 'Man', 'Kyte','Economics', 8);
1 row created.
SQL>
SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2
VALUES (10005, 'Pat', 'Poll','History', 4);
1 row created.
SQL>
SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2
VALUES (10006, 'Tim', 'Viper','History', 4);
1 row created.
SQL>
SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2
VALUES (10007, 'Barbara', 'Blues','Economics', 7);
1 row created.
SQL>
SQL>
SQL> INSERT INTO session(department, course, description, max_lecturer, curren
t_lecturer, num_credits, room_id)
2
VALUES ('HIS', 301, 'History 301', 30, 0, 4, 20004);
1 row created.
SQL>
SQL> INSERT INTO session(department, course, description, max_lecturer, curren
t_lecturer, num_credits, room_id)
2
VALUES ('CS', 101, 'Computer Science 101', 50, 0, 4, 20001);
1 row created.
SQL>
SQL> INSERT INTO session(department, course, description, max_lecturer, curren
t_lecturer, num_credits, room_id)
2
VALUES ('ECN', 203, 'Economics 203', 15, 0, 3, 20002);
1 row created.
SQL>
SQL> INSERT INTO session(department, course, description, max_lecturer, curren
t_lecturer, num_credits, room_id)
2
VALUES ('CS', 102, 'Computer Science 102', 35, 3, 4, 20003);
1 row created.
SQL>
SQL> INSERT INTO session(department, course, description, max_lecturer, curren
t_lecturer, num_credits, room_id)
2
VALUES ('MUS', 410, 'Music 410', 5, 4, 3, 20005);
1 row created.
SQL>
SQL> INSERT INTO session(department, course, description, max_lecturer, curren
t_lecturer, num_credits, room_id)
2
VALUES ('ECN', 101, 'Economics 101', 50, 0, 4, 20007);
1 row created.
SQL>
SQL> INSERT INTO session(department, course, description, max_lecturer, curren
t_lecturer, num_credits, room_id)
2
VALUES ('NUT', 307, 'Nutrition 307', 20, 2, 4, 20008);
1 row created.
SQL>
SQL> INSERT INTO session(department, course, description, max_lecturer, curren
t_lecturer, num_credits, room_id)
2
VALUES ('MUS', 100, 'Music 100', 100, 0, 3, NULL);
1 row created.
SQL>
SQL> CREATE TABLE
2
student_id
3
department
4
course
5
grade
6
);
myStudent
NUMBER(5)
CHAR(3)
NUMBER(3)
CHAR(1)
(
NOT NULL,
NOT NULL,
NOT NULL,
Table created.
SQL>
SQL>
SQL>
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10000, 'CS', 102, 'A');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10002, 'CS', 102, 'B');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10003, 'CS', 102, 'C');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10000, 'HIS', 101, 'A');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10001, 'HIS', 101, 'B');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10002, 'HIS', 101, 'B');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10003, 'HIS', 101, 'A');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10004, 'HIS', 101, 'C');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10005, 'HIS', 101, 'C');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10006, 'HIS', 101, 'E');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10007, 'HIS', 101, 'B');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10008, 'HIS', 101, 'A');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10009, 'HIS', 101, 'D');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10010, 'HIS', 101, 'A');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10008, 'NUT', 307, 'A');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10010, 'NUT', 307, 'A');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10009, 'MUS', 410, 'B');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10006, 'MUS', 410, 'E');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10011, 'MUS', 410, 'B');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10000, 'MUS', 410, 'B');
1 row created.
SQL>
SQL> DECLARE
2
v_NumCredits session.num_credits%TYPE;
3
4
CURSOR cursorValue IS
5
SELECT *
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
FROM lecturer
WHERE id IN (SELECT student_id
FROM myStudent
WHERE department= 'HIS'
AND course = 101)
FOR UPDATE OF current_credits;
BEGIN
FOR v_StudentInfo IN cursorValue LOOP
SELECT num_credits
INTO v_NumCredits
FROM session
WHERE department = 'HIS'
AND course = 101;
UPDATE lecturer
SET current_credits = current_credits + v_NumCredits
WHERE CURRENT OF cursorValue;
END LOOP;
COMMIT;
END;
/
1 row created.
SQL>
SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2
VALUES (10007, 'Barbara', 'Blues','Economics', 7);
1 row created.
SQL>
SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2
VALUES (10008, 'David', 'Large','Music', 4);
1 row created.
SQL>
SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2
VALUES (10009, 'Chris', 'Elegant','Nutrition', 8);
1 row created.
SQL>
SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2
VALUES (10010, 'Rose', 'Bond','Music', 7);
1 row created.
SQL>
SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2
VALUES (10011, 'Rita', 'Johnson','Nutrition', 8);
1 row created.
SQL>
SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2
VALUES (10012, 'Sharon', 'Clear','Computer Science', 3);
1 row created.
SQL> CREATE TABLE session (
2
department
CHAR(3),
3
course
NUMBER(3),
4
description
VARCHAR2(2000),
5
max_lecturer
NUMBER(3),
6
current_lecturer NUMBER(3),
7
num_credits
NUMBER(1),
8
room_id
NUMBER(5)
9
);
Table created.
SQL>
SQL> INSERT INTO session(department, course, description, max_lecturer, curren
t_lecturer, num_credits, room_id)
2
VALUES ('HIS', 101, 'History 101', 30, 11, 4, 20000);
1 row created.
SQL>
SQL> INSERT INTO session(department, course, description, max_lecturer, curren
t_lecturer, num_credits, room_id)
2
VALUES ('HIS', 301, 'History 301', 30, 0, 4, 20004);
1 row created.
SQL>
SQL> INSERT INTO session(department, course, description, max_lecturer, curren
t_lecturer, num_credits, room_id)
2
VALUES ('CS', 101, 'Computer Science 101', 50, 0, 4, 20001);
1 row created.
SQL>
SQL> INSERT INTO session(department, course, description, max_lecturer, curren
t_lecturer, num_credits, room_id)
2
VALUES ('ECN', 203, 'Economics 203', 15, 0, 3, 20002);
1 row created.
SQL>
SQL> INSERT INTO session(department, course, description, max_lecturer, curren
t_lecturer, num_credits, room_id)
2
VALUES ('CS', 102, 'Computer Science 102', 35, 3, 4, 20003);
1 row created.
SQL>
SQL> INSERT INTO session(department, course, description, max_lecturer, curren
t_lecturer, num_credits, room_id)
2
VALUES ('MUS', 410, 'Music 410', 5, 4, 3, 20005);
1 row created.
SQL>
SQL> INSERT INTO session(department, course, description, max_lecturer, curren
t_lecturer, num_credits, room_id)
2
VALUES ('ECN', 101, 'Economics 101', 50, 0, 4, 20007);
1 row created.
SQL>
SQL> INSERT INTO session(department, course, description, max_lecturer, curren
t_lecturer, num_credits, room_id)
2
VALUES ('NUT', 307, 'Nutrition 307', 20, 2, 4, 20008);
1 row created.
SQL>
SQL> INSERT INTO session(department, course, description, max_lecturer, curren
t_lecturer, num_credits, room_id)
2
VALUES ('MUS', 100, 'Music 100', 100, 0, 3, NULL);
1 row created.
SQL>
SQL> CREATE TABLE
2
student_id
3
department
4
course
5
grade
6
);
myStudent
NUMBER(5)
CHAR(3)
NUMBER(3)
CHAR(1)
(
NOT NULL,
NOT NULL,
NOT NULL,
Table created.
SQL>
SQL>
SQL>
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10000, 'CS', 102, 'A');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10002, 'CS', 102, 'B');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10003, 'CS', 102, 'C');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10001, 'HIS', 101, 'B');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10002, 'HIS', 101, 'B');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10003, 'HIS', 101, 'A');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10004, 'HIS', 101, 'C');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10005, 'HIS', 101, 'C');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10006, 'HIS', 101, 'E');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10007, 'HIS', 101, 'B');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10008, 'HIS', 101, 'A');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10009, 'HIS', 101, 'D');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10010, 'HIS', 101, 'A');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10008, 'NUT', 307, 'A');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10010, 'NUT', 307, 'A');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10009, 'MUS', 410, 'B');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10006, 'MUS', 410, 'E');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10011, 'MUS', 410, 'B');
1 row created.
SQL>
SQL> INSERT INTO myStudent (student_id, department, course, grade)
2
VALUES (10000, 'MUS', 410, 'B');
1 row created.
SQL>
SQL>
SQL>
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
DECLARE
v_NumCredits
session.num_credits%TYPE;
CURSOR cursorValue IS
SELECT *
FROM lecturer
WHERE id IN (SELECT student_id
FROM myStudent
WHERE department= 'HIS'
AND course = 101)
FOR UPDATE OF current_credits;
BEGIN
FOR v_StudentInfo IN cursorValue LOOP
SELECT num_credits
INTO v_NumCredits
FROM session
WHERE department = 'HIS'
AND course = 101;
UPDATE lecturer
SET current_credits = current_credits + v_NumCredits
WHERE CURRENT OF cursorValue;
END LOOP;
COMMIT;
END;
/