Oracle 11G- PLSQL

73
ORACLLE PLSQL PROGRAMMING By Sunny Okoro

description

 

Transcript of Oracle 11G- PLSQL

Page 1: Oracle 11G- PLSQL

ORACLLE PLSQL PROGRAMMING

By Sunny Okoro

Page 2: Oracle 11G- PLSQL

1

ContentsIntroduction.................................................................................................................................................2

School Database Diagram............................................................................................................................4

Triggers........................................................................................................................................................6

Stored Procedures.....................................................................................................................................15

Packages....................................................................................................................................................31

Functions...................................................................................................................................................33

Cursors......................................................................................................................................................37

Records......................................................................................................................................................50

Oracle Label Security.................................................................................................................................53

Page 3: Oracle 11G- PLSQL

2

Introduction

Database Platform

ORACLE 11G

Applications

Oracle JDeveloper 11g

Oracle SQL Plus

Page 4: Oracle 11G- PLSQL

3

Microsoft Power Pivot

Oracle SQL Developer Data Modeler

Page 5: Oracle 11G- PLSQL

4

Page 6: Oracle 11G- PLSQL

5

School Database Diagram

Page 7: Oracle 11G- PLSQL

6

Page 8: Oracle 11G- PLSQL

7

Triggers

Connected to:

Personal Oracle Database 11g Release 11.1.0.6.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create table student_aduit 2 (student_id Number(8,0), 3 salutation varchar2(5), 4 first_name varchar2(25), 5 last_name varchar2(25), 6 street_address varchar2(50), 7 zip varchar2(5), 8 phone varchar2(15), 9 record_id number, 10 modified_by varchar2(30) 11 );

Table created.

SQL> create sequence studentrecord_aduit_seq 2 start with 09081 3 increment by 45 4 nocycle 5 nocache;

Sequence created.

Page 9: Oracle 11G- PLSQL

8

SQL> create or replace trigger student_aduit_RD 2 before insert on student_aduit 3 for each row 4 begin 5 /* fill in the record_id with the primary key values created by sequence*/ 6 select studentrecord_aduit_seq.nextval 7 into :NEW.record_id 8 from dual; 9 end student_aduit_RD; 10 /Trigger created.

SQL> Alter table student_aduit 2 add modified_date date;Table altered.

SQL> Alter table student_aduit 2 add EMPLOYER varchar2(50);Table altered.

SQL> Alter table student_aduit 2 add REGISTRATION_DATE date;Table altered.

SQL> Alter table student_aduit 2 add created_by varchar2(50);Table altered.

SQL> SQL> Alter table student_aduit 2 add CREATED_DATE date;Table altered.

Page 10: Oracle 11G- PLSQL

9

SQL> desc student_aduit; Name Null? Type ----------------------------------------- -------- ---------------------------- STUDENT_ID NUMBER(8) SALUTATION VARCHAR2(5) FIRST_NAME VARCHAR2(25) LAST_NAME VARCHAR2(25) STREET_ADDRESS VARCHAR2(50) ZIP VARCHAR2(5) PHONE VARCHAR2(15) RECORD_ID NUMBER MODIFIED_BY VARCHAR2(30) MODIFIED_DATE DATE EMPLOYER VARCHAR2(50) REGISTRATION_DATE DATE CREATED_BY VARCHAR2(50) CREATED_DATE DATE

SQL> Alter table student_aduit 2 add action_type char(12);

Table altered.SQL> Create or replace trigger studentrecd_inst_trgg 2 after insert on student 3 for each row 4 begin 5 insert into student_aduit(student_id,salutation,first_name, last_name, 6 street_address, zip, phone, employer, registration_date, created_by, created_date) 7 select :New.student_id,:New.salutation, :New.first_name. :New.last_name, 8 :NEW.street_address, :New.zip, :New.phone, :New.employer, :New.registration_date, 9 :NEW.created_by, :NEW.created_date FROM DUAL;

Page 11: Oracle 11G- PLSQL

10

10 END studentrecd_inst_trgg; 11 /

Warning: Trigger created with compilation errors.

SQL> SHOW ERRORS;Errors for TRIGGER STUDENTRECD_INST_TRGG:

LINE/COL ERROR -------- ----------------------------------------------------------------- 2/4 PL/SQL: SQL Statement ignored 4/60 PL/SQL: ORA-00919: invalid function

SQL> Create or replace trigger studentrecd_4 2 after insert on STUDENT 3 for each row 4 begin 5 insert into student_aduit(student_id,salutation,first_name, last_name, street_address, zip, phone, employer, registration_date, created_by, created_date) 6 select :New.student_id,:New.salutation, :New.first_name, :New.last_name, 7 :NEW.street_address, :New.zip, :New.phone, :New.employer, :New.registration_date, 8 :NEW.created_by, :NEW.created_date FROM DUAL; 9 END studentrecd_4; 10 /

Trigger created.

SQL> Create or replace trigger studentrecd_updt_trg

Page 12: Oracle 11G- PLSQL

11

2 after update on student 3 for each row 4 begin 5 insert into student_aduit(student_id,salutation,first_name, last_name, street_address, zip, phone, employer, registration_date, modified_by, modified_date) 6 select :New.student_id,:New.salutation, :New.first_name, :New.last_name, 7 :NEW.street_address, :New.zip, :New.phone, :New.employer, :New.registration_date, 8 :NEW.modified_by, :NEW.modified_date FROM DUAL; 9 END studentrecd_updt_trg; 10 /

Trigger created.

Create or replace trigger studentrecd_delt_trgafter delete on studentfor each row begin insert into student_aduit(student_id,salutation,first_name, last_name, street_address, zip, phone, employer, registration_date, modified_by, modified_date)

select :old.student_id,:old.salutation, :old.first_name, :old.last_name, :old.street_address, :old.zip, :old.phone, :old.employer, :old.registration_date, :old.modified_by, :old.modified_date FROM DUAL;

END studentrecd_delt_trg;/Trigger created.

insert into student(salutation, first_name, last_name, street_address, zip,phone,employer,registration_date, created_by, created_date, student_id, modified_by ,MODIFIED_DATE) values('Mr', 'Jackson','Philp','1900 E Bellview Apt 341D','07055', '7089809812','County Foods',(select sysdate from dual),'Jackson',(select sysdate from dual), 805678, 'NA', (select sysdate from dual));1 row created.

Page 13: Oracle 11G- PLSQL

12

select * from student where student_id = 805678

STUDENT_ID SALUTATION FIRST_NAME LAST_NAME STREET_ADDRESS ZIP PHONE EMPLOYER REGISTRATION_DATE CREATED_BY CREATED_DATE MODIFIED_BY MODIFIED_DATE ---------------------- ---------- ------------------------- ------------------------- -------------------------------------------------- ----- --------------- -------------------------------------------------- ------------------------- ------------------------------ ------------------------- ------------------------------ ------------------------- 805678 Mr Jackson Philp 1900 E Bellview Apt 341D 07055 7089809812 County Foods 15-MAR-13 Jackson 15-MAR-13 NA 15-MAR-13

update student set last_name ='Mark', modified_by='Jackson', Modified_date = (select sysdate from dual) where student_id = 805678;

select * from student_aduit;

STUDENT_ID

SALUTATION

FIRST_NAME

LAST_NAME

STREET_ADDRESS

ZIP PHONE

RECORD_ID

MODIFIED_BY

MODIFIED_DATE

EMPLOYER

REGISTRATION_DATE

CREATED_BY

CREATED_DATE

ACTION_TYPE

805678

Mr Jackson

Philp 1900 E Bellview Apt 341D

7055

7089809812

9171 County Foods

3/15/2013 Jackson

3/15/2013

805678

Mr Jackson

Philp 1900 E Bellview Apt 341D

7055

7089809812

9216 County Foods

3/15/2013 Jackson

3/15/2013

805678

Mr Jackson

Mark 1900 E Bellview Apt 341D

7055

7089809812

9261 Jackson

3/15/2013

County Foods

3/15/2013

Page 14: Oracle 11G- PLSQL

13

STUDENT_ID

SALUTATION

FIRST_NAME

LAST_NAME

STREET_ADDRESS

ZIP

PHONE

RECORD_ID

MODIFIED_BY

MODIFIED_DATE

EMPLOYER

REGISTRATION_DATE

CREATED_BY

CREATED_DATE

ACTION_TYPE

805678 Mr Jackson Philp 1900 E Bellview Apt 341D

7055

7089809812

9171 County Foods

3/15/2013 Jackson 3/15/2013

805678 Mr Jackson Philp 1900 E Bellview Apt 341D

7055

7089809812

9216 County Foods

3/15/2013 Jackson 3/15/2013

805678 Mr Jackson Mark 1900 E Bellview Apt 341D

7055

7089809812

9261 Jackson 3/15/2013

County Foods

3/15/2013

805678 Mr Jackson Mark 1900 E Bellview Apt 341D

7055

7089809812

9306 Jackson 3/15/2013

County Foods

3/15/2013

SQL> delete student where student_id = 805678;

1 row deleted.SQL> commit;

select * from student_aduit;

select trigger_name, trigger_type, triggering_event, table_name,

Page 15: Oracle 11G- PLSQL

14

column_name, action_type, trigger_body,REFERENCING_NAMES ,CROSSEDITION

from user_triggers

TRIGGER_NAME

TRIGGER_TYPE

TRIGGERING_EVENT

TABLE_NAME

COLUMN_NAME

ACTION_TYPE

TRIGGER_BODY REFERENCING_NAMES

CROSSEDITION

STUDENTRECD_INST_TRGG

AFTER EACH ROW

INSERT STUDENT PL/SQL begin  insert into student_aduit(student_id,salutation,first_name, last_name,    street_address,

REFERENCING NEW AS NEW OLD AS OLD

NO

STUDENTRECD_UPDT_TRG

AFTER EACH ROW

UPDATE STUDENT PL/SQL begin  insert into student_aduit(student_id,salutation,first_name, last_name, street_address, zip,

REFERENCING NEW AS NEW OLD AS OLD

NO

STUDENT_ADUIT_RD

BEFORE EACH ROW

INSERT STUDENT_ADUIT

PL/SQL begin/* fill in the record_id with the primary key values created by sequence*/select studentrec

REFERENCING NEW AS NEW OLD AS OLD

NO

STUDENTRECD_4

AFTER EACH ROW

INSERT STUDENT PL/SQL begin  insert into student_aduit(student_id,salutation,first_name, last_name, street_address, zip,

REFERENCING NEW AS NEW OLD AS OLD

NO

STUDENTRECD_DELT_TRG

AFTER EACH ROW

DELETE STUDENT PL/SQL begin  insert into student_aduit(student_id,salutation,first_name, last_name, street_address, zip,

REFERENCING NEW AS NEW OLD AS OLD

NO

Page 16: Oracle 11G- PLSQL

15Stored Procedures

SQL> Create table cities

Page 17: Oracle 11G- PLSQL

16

2 (city_name char(45), 3 Location_State char(45), 4 country char(45) 5 );

Table created.

SQL>SQL> create or replace procedure city 2 (city_name city.city_name%TYPE, 3 Location_state city.Location_State%TYPE, 4 country city.country%TYPE 5 ) 6 AS BEGIN 7 INSERT INTO city(city_name, location_state, country) 8 values(city_name, location_state, country); 9 End city; 10 /

Warning: Procedure created with compilation errors.

SQL> show errors;Errors for PROCEDURE CITY:

LINE/COL ERROR-------- -----------------------------------------------------------------0/0 PL/SQL: Compilation unit analysis terminated2/13 PLS-00225: subprogram or cursor 'CITY' reference is out of scopeSQL> create or replace procedure city 2 (city_name cities.city_name%TYPE, 3 Location_state cities.Location_State%TYPE, 4 country cities.country%TYPE 5 ) 6 AS BEGIN

Page 18: Oracle 11G- PLSQL

17

7 INSERT INTO city(city_name, location_state, country) 8 values(city_name, location_state, country); 9 End city; 10 /

Warning: Procedure created with compilation errors.

SQL> show errors;Errors for PROCEDURE CITY:

LINE/COL ERROR-------- -----------------------------------------------------------------7/7 PL/SQL: SQL Statement ignored7/19 PL/SQL: ORA-04044: procedure, function, package, or type is not allowed here

create or replace procedure city_insert (city_name cities.city_name%TYPE, Location_state cities.Location_State%TYPE, country cities.country%TYPE ) AS BEGIN INSERT INTO cities(city_name, location_state, country)

values(city_name, location_state, country);End city_insert;/Procedure created.

SQL> Begin 2 city_insert ('Washington','DC','USA'); 3 city_insert ('Chicago','IL','USA'); 4 End; 5 /

Page 19: Oracle 11G- PLSQL

18

PL/SQL procedure successfully completed.

Select * from cities;

CITY_NAME LOCATION_STATE COUNTRYWashington DC USAChicago IL USA

/

Begin

city_insert('Portland','Or','USA');

city_insert('Portland','ME','USA');

city_insert('New York','NY', 'USA');

End;

/

Select * from cities;

CITY_NAME LOCATION_STATE

COUNTRY

Washington DC USAChicago IL USAPortland Or USAPortland ME USANew York NY USA

Page 20: Oracle 11G- PLSQL

19

create or replace procedure city_update (L_state cities.location_state%TYPE, c_id cities.city_id%TYPE )AS Begin update cities

set location_state = L_state where city_id = c_id;

end city_update;/Procedure created.

SQL> begin 2 city_update('New York','PA'); 3 end; 4 /PL/SQL procedure successfully completed.

SQL> ALTER TABLE CITIES ADD CITY_ID NUMBER;Table altered.

SQL> DELETE CITIES;5 rows deleted.

create or replace procedure city_insert (city_name cities.city_name%TYPE, city_id cities.city_id%TYPE, Location_state cities.Location_State%TYPE, country cities.country%TYPE ) AS BEGIN INSERT INTO cities(city_name,city_id, location_state, country)

Page 21: Oracle 11G- PLSQL

20

values(city_name, city_id, location_state, country);End city_insert;/

SQL> Begin 2 city_insert('Portland',909,'Or','USA'); 3 city_insert('Portland',890,'ME','USA'); 4 city_insert('New York',788,'NY', 'USA'); 5 city_insert('chicago',789,'IL', 'USA'); 6 city_insert('Washington',787,'DC', 'USA'); 7 End; 8 /

PL/SQL procedure successfully completed.

Select * from cities

CITY_NAME LOCATION_STATE COUNTRY CITY_IDPortland Or USA 909Portland ME USA 890New York NY USA 788chicago IL USA 789Washington DC USA 787

Page 22: Oracle 11G- PLSQL

21

SQL> begin

2 city_update('IL','787');

3 end;

4 /

Select * from cities

CITY_NAME LOCATION_STATE COUNTRY CITY_ID

Portland Or USA 909Portland ME USA 890New York NY USA 788chicago IL USA 789Washington IL USA 787

SQL> create or replace procedure city_delete 2 ( 3 c_id cities.city_id%TYPE 4 )AS Begin 5 delete cities 6 where city_id = c_id; 7 end city_delete; 8 /

Procedure created.

Select * from cities

Page 23: Oracle 11G- PLSQL

22

CITY_NAME LOCATION_STATE COUNTRY CITY_IDPortland Or USA 909Portland ME USA 890New York NY USA 788chicago IL USA 789

SQL>SQL> create or replace procedure studentselect 2 (stud_id in student.student_id%TYPE, 3 salut OUT student.salutation%TYPE, 4 F_name OUT student.first_name%TYPE, 5 L_Name OUT student.Last_name%TYPE, 6 S_Add OUT student.Street_Address%TYPE, 7 ZIP OUT student.ZIP%TYPE, 8 Phone OUT student.phone%TYPE, 9 EMP OUT student.Employer%Type, 10 Regdate OUT student.Registration_Date%TYPE, 11 Crdate OUT student.Created_date%TYPE, 12 CBY OUT student.created_by%TYPE, 13 MBY OUT student.Modified_by%TYPE, 14 Mdate OUT student.Modified_date%Type) 15 IS 16 BEGIN 17 SELECT 18 initcap( SALUTATION)as SALUTATION, initcap (FIRST_NAME)as First_Namenitcap (LAST_NAME)as Last_Name, 19 initcap(STREET_ADDRESS)as Street_Address, 20 ZIP, PHONE, initcap (EMPLOYER)as Employer, REGISTRATION_DATE, 21 CREATED_BY, CREATED_DATE,

Page 24: Oracle 11G- PLSQL

23

22 MODIFIED_BY, MODIFIED_DATE 23 INTO 24 salut,F_name,L_Name,S_Add,ZIP,Phone,EMP,Regdate,CBY,Crdate,MBY,Mdate 25 FROM STUDENT 26 WHERE STUDENT_ID = stud_id; 27 END studentselect; 28 /

Procedure created.

SQL>SQL> DECLARE 2 salut student.salutation%TYPE; 3 F_name student.first_name%TYPE; 4 L_Name student.Last_name%TYPE; 5 S_Add student.Street_Address%TYPE; 6 ZIP student.ZIP%TYPE; 7 Phone student.phone%TYPE; 8 EMP student.Employer%Type; 9 Regdate student.Registration_Date%TYPE; 10 Crdate student.Created_date%TYPE; 11 CBY student.created_by%TYPE; 12 MBY student.Modified_by%TYPE; 13 Mdate student.Modified_date%Type; 14 BEGIN 15 studentselect(384,salut,F_name,L_Name,S_Add,ZIP, 16 Phone,EMP,Regdate,Crdate,CBY,MBY,Mdate); 17 18 19 DBMS_OUTPUT.PUT('SALUTATION : ' || salut); 20 DBMS_OUTPUT.PUT('FIRST_NAME: ' || F_name); 21 DBMS_OUTPUT.PUT('LAST_NAME : ' || L_Name); 22 DBMS_OUTPUT.PUT('STUDENT_ADDRESS : ' || S_Add); 23 DBMS_OUTPUT.PUT('ZIP: ' || ZIP);

Page 25: Oracle 11G- PLSQL

24

24 DBMS_OUTPUT.PUT('PHONE: ' || Phone); 25 DBMS_OUTPUT.PUT('EMPLOYER : ' || EMP); 26 DBMS_OUTPUT.PUT('REGISTRATION_DATE : ' || Regdate); 27 DBMS_OUTPUT.PUT('CREATED_DATE: ' || Crdate); 28 DBMS_OUTPUT.PUT('CREATED_BY: ' || CBY); 29 DBMS_OUTPUT.PUT('MODIFIED_BY: ' || MBY); 30 DBMS_OUTPUT.PUT('MODIFIED_DATE: ' || Mdate); 31 32 end; 33 /

PL/SQL procedure successfully completed.

SQL>SQL> DECLARE 2 salut student.salutation%TYPE; 3 F_name student.first_name%TYPE; 4 L_Name student.Last_name%TYPE; 5 S_Add student.Street_Address%TYPE; 6 ZIP student.ZIP%TYPE; 7 Phone student.phone%TYPE; 8 EMP student.Employer%Type; 9 Regdate student.Registration_Date%TYPE; 10 Crdate student.Created_date%TYPE; 11 CBY student.created_by%TYPE; 12 MBY student.Modified_by%TYPE; 13 Mdate student.Modified_date%Type; 14 BEGIN 15 studentselect(384,salut,F_name,L_Name,S_Add,ZIP, 16 Phone,EMP,Regdate,Crdate,CBY,MBY,Mdate); 17 18 19 DBMS_OUTPUT.PUT_LINE('SALUTATION : ' || salut); 20 DBMS_OUTPUT.PUT_LINE('FIRST_NAME: ' || F_name);

Page 26: Oracle 11G- PLSQL

25

21 DBMS_OUTPUT.PUT_LINE('LAST_NAME : ' || L_Name); 22 DBMS_OUTPUT.PUT_LINE('STUDENT_ADDRESS : ' || S_Add); 23 DBMS_OUTPUT.PUT_LINE('ZIP: ' || ZIP); 24 DBMS_OUTPUT.PUT_LINE('PHONE: ' || Phone); 25 DBMS_OUTPUT.PUT_LINE('EMPLOYER : ' || EMP); 26 DBMS_OUTPUT.PUT_LINE('REGISTRATION_DATE : ' || Regdate); 27 DBMS_OUTPUT.PUT_LINE('CREATED_DATE: ' || Crdate); 28 DBMS_OUTPUT.PUT_LINE('CREATED_BY: ' || CBY); 29 DBMS_OUTPUT.PUT_LINE('MODIFIED_BY: ' || MBY); 30 DBMS_OUTPUT.PUT_lINE('MODIFIED_DATE: ' || Mdate); 31 32 end; 33 /SALUTATION : Mr.FIRST_NAME: AsianLAST_NAME : ChirichellaSTUDENT_ADDRESS : 134-25 Franklin Ave. #512ZIP: 11355PHONE: 718-555-5555EMPLOYER : Peo Capital Corp.REGISTRATION_DATE : 23-FEB-07CREATED_DATE: 23-FEB-07CREATED_BY: BROSENZWEIGMODIFIED_BY: BROSENZWMODIFIED_DATE: 26-FEB-07

PL/SQL procedure successfully completed.

Page 27: Oracle 11G- PLSQL

26

SQL> DECLARE 2 salut student.salutation%TYPE; 3 F_name student.first_name%TYPE; 4 L_Name student.Last_name%TYPE; 5 S_Add student.Street_Address%TYPE; 6 ZIP student.ZIP%TYPE; 7 Phone student.phone%TYPE; 8 EMP student.Employer%Type; 9 Regdate student.Registration_Date%TYPE; 10 Crdate student.Created_date%TYPE; 11 CBY student.created_by%TYPE; 12 MBY student.Modified_by%TYPE; 13 Mdate student.Modified_date%Type; 14 BEGIN 15 studentselect(384,salut,F_name,L_Name,S_Add,ZIP, 16 Phone,EMP,Regdate,Crdate,CBY,MBY,Mdate); 17 18 19 DBMS_OUTPUT.PUT_LINE('Name : ' || salut ||F_name||','||L_Name); 20 DBMS_OUTPUT.PUT_LINE('STUDENT_ADDRESS : ' || S_Add); 21 DBMS_OUTPUT.PUT_LINE('ZIP: ' || ZIP); 22 DBMS_OUTPUT.PUT_LINE('PHONE: ' || Phone); 23 DBMS_OUTPUT.PUT_LINE('EMPLOYER : ' || EMP); 24 DBMS_OUTPUT.PUT_LINE('REGISTRATION_DATE : ' || TO_CHAR(Regdate,'Month-dd-YYYY')); 25 DBMS_OUTPUT.PUT_LINE('CREATED_DATE: ' || TO_CHAR( Crdate,'Month-dd-YYYY')); 26 DBMS_OUTPUT.PUT_LINE('CREATED_BY: ' || CBY); 27 DBMS_OUTPUT.PUT_LINE('MODIFIED_BY: ' || MBY); 28 DBMS_OUTPUT.PUT_lINE('MODIFIED_DATE: ' || TO_CHAR(Mdate, 'Month-dd-YYYY')); 29 30 end; 31 /

Page 28: Oracle 11G- PLSQL

27

Name : Mr.Asian,ChirichellaSTUDENT_ADDRESS : 134-25 Franklin Ave. #512ZIP: 11355PHONE: 718-555-5555EMPLOYER : Peo Capital Corp.REGISTRATION_DATE : February -23-2007CREATED_DATE: February -23-2007CREATED_BY: BROSENZWEIGMODIFIED_BY: BROSENZWMODIFIED_DATE: February -26-2007

PL/SQL procedure successfully completed.

SQL>

SQL> create or replace procedure studentselect3 2 (stud_id in student.student_id%TYPE, 3 salut OUT student.salutation%TYPE, 4 F_name OUT student.first_name%TYPE, 5 L_Name OUT student.Last_name%TYPE, 6 S_Add OUT student.Street_Address%TYPE, 7 Phone OUT student.phone%TYPE, 8 EMP OUT student.Employer%Type, 9 Regdate OUT student.Registration_Date%TYPE, 10 Crdate OUT student.Created_date%TYPE, 11 CBY OUT student.created_by%TYPE, 12 MBY OUT student.Modified_by%TYPE, 13 Mdate OUT student.Modified_date%Type, 14 CTY OUT ZIPCODE.CITY%TYPE, 15 STA OUT ZIPCODE.STATE%TYPE, 16 ZIP OUT student.ZIP%TYPE 17 )

Page 29: Oracle 11G- PLSQL

28

18 IS 19 BEGIN 20 21 SELECT 22 initcap(S.SALUTATION)as SALUTATION, initcap (S.FIRST_NAME)as First_Name, Initcap (S.LAST_NAME)as Last_Name, 23 initcap(S.STREET_ADDRESS)as Street_Address, 24 PHONE, initcap (S.EMPLOYER)as Employer, S.REGISTRATION_DATE, 25 S.CREATED_BY,S.CREATED_DATE, 26 S.MODIFIED_BY, S.MODIFIED_DATE, Z.CITY, Z.STATE, Z.ZIP 27 INTO 28 salut,F_name,L_Name,S_Add,Phone,EMP,Regdate,CBY,Crdate,MBY,Mdate, CTY,STA,ZIP 29 FROM STUDENT S 30 INNER JOIN 31 ZIPCODE Z 32 ON 33 S.ZIP = Z.ZIP 34 WHERE STUDENT_ID = stud_id; 35 END studentselect3; 36 /

Procedure created.

SQL>SQL> DECLARE 2 salut student.salutation%TYPE; 3 F_name student.first_name%TYPE; 4 L_Name student.Last_name%TYPE; 5 S_Add student.Street_Address%TYPE;

Page 30: Oracle 11G- PLSQL

29

6 Phone student.phone%TYPE; 7 EMP student.Employer%Type; 8 Regdate student.Registration_Date%TYPE; 9 Crdate student.Created_date%TYPE; 10 CBY student.created_by%TYPE; 11 MBY student.Modified_by%TYPE; 12 Mdate student.Modified_date%Type; 13 CTY ZIPCODE.CITY%TYPE; 14 STA ZIPCODE.STATE%TYPE; 15 ZIP student.ZIP%TYPE; 16 BEGIN 17 studentselect3(384,salut,F_name,L_Name,S_Add, 18 Phone,EMP,Regdate,Crdate,CBY,MBY,Mdate, CTY,STA,ZIP); 19 20 21 DBMS_OUTPUT.PUT_LINE('Name : ' || salut ||F_name||','||L_Name); 22 DBMS_OUTPUT.PUT_LINE('STUDENT_ADDRESS : ' || S_Add); 23 DBMS_OUTPUT.PUT_LINE('CITY : ' || CTY); 24 DBMS_OUTPUT.PUT_LINE('R_STATE : ' || STA); 25 DBMS_OUTPUT.PUT_LINE('ZIP: ' || ZIP); 26 DBMS_OUTPUT.PUT_LINE('PHONE: ' || Phone); 27 DBMS_OUTPUT.PUT_LINE('EMPLOYER : ' || EMP); 28 DBMS_OUTPUT.PUT_LINE('REGISTRATION_DATE : ' || TO_CHAR(Regdate,'Month-dd-YYYY')); 29 DBMS_OUTPUT.PUT_LINE('CREATED_DATE: ' || TO_CHAR( Crdate,'Month-dd-YYYY')); 30 DBMS_OUTPUT.PUT_LINE('CREATED_BY: ' || CBY); 31 DBMS_OUTPUT.PUT_LINE('MODIFIED_BY: ' || MBY); 32 DBMS_OUTPUT.PUT_lINE('MODIFIED_DATE: ' || TO_CHAR(Mdate, 'Month-dd-YYYY')); 33 34 end; 35 /Name : Mr.Asian,Chirichella

Page 31: Oracle 11G- PLSQL

30

STUDENT_ADDRESS : 134-25 Franklin Ave. #512CITY : FlushingR_STATE : NYZIP: 11355PHONE: 718-555-5555EMPLOYER : Peo Capital Corp.REGISTRATION_DATE : February -23-2007CREATED_DATE: February -23-2007CREATED_BY: BROSENZWEIGMODIFIED_BY: BROSENZWMODIFIED_DATE: February -26-2007

PL/SQL procedure successfully completed.

SQL>

SELECT * FROM USER_PROCEDURES WHERE OBJECT_TYPE = 'PROCEDURE' ;

Page 32: Oracle 11G- PLSQL

31

OBJECT_NAME PROCEDURE_NAME OBJECT_ID SUBPROGRAM_ID OBJECT_TYPE AGGREGATE PIPELINED PARALLEL INTERFACE DETERMINISTIC AUTHIDSTUDENTSELECT 72969 1 PROCEDURE NO NO NO NO NO DEFINERCITY_DELETE 72966 1 PROCEDURE NO NO NO NO NO DEFINERCITY_INSERT 72964 1 PROCEDURE NO NO NO NO NO DEFINERCITY_UPDATE 72965 1 PROCEDURE NO NO NO NO NO DEFINERCITY 72963 1 PROCEDURE NO NO NO NO NO DEFINERSTUDENT_SELECT 72968 1 PROCEDURE NO NO NO NO NO DEFINER

SELECT * FROM USER_PROCEDURES WHERE OBJECT_TYPE ='PACKAGE';

OBJECT_NAME

PROCEDURE_NAME OBJECT_ID SUBPROGRAM_ID OBJECT_TYPE AGGREGATE PIPELINED PARALLEL INTERFACE DETERMINISTIC AUTHID

CITIESDB UPDATECITY 73066 1 PACKAGE NO NO NO NO NO DEFINERCITIESDB DELETECITY 73066 2 PACKAGE NO NO NO NO NO DEFINERCITIESDB 73066 0 PACKAGE NO NO NO NO NO DEFINER

Page 33: Oracle 11G- PLSQL

32

Packages

SQL> CREATE OR REPLACE PACKAGE CitiesDB as 2 PROCEDURE updatecity(CID IN CITIES.CITY_ID%TYPE, 3 CSTATE IN CITIES.LOCATION_STATE%TYPE, 4 CCITY IN CITIES.CITY_NAME%TYPE ); 5 PROCEDURE DELETECITY(CID IN CITIES.CITY_ID%TYPE); 6 7 END CitiesDB; 8 /

Package created.

SQL> CREATE OR REPLACE PACKAGE BODY CitiesDB as 2 PROCEDURE updatecity(CID IN CITIES.CITY_ID%TYPE, 3 CSTATE IN CITIES.LOCATION_STATE%TYPE, 4 CCITY IN CITIES.CITY_NAME%TYPE ) IS 5 BEGIN 6 UPDATE CITIES 7 SET CITY_NAME = CCITY, LOCATION_STATE = CSTATE 8 WHERE CITY_ID = CID; 9 END updatecity; 10 11 PROCEDURE DELETECITY(CID IN CITIES.CITY_ID%TYPE) IS 12 BEGIN 13 DELETE FROM CITIES 14 WHERE CITY_ID = CID; 15 END DELETECITY; 16 17 END CitiesDB; 18 /

Page 34: Oracle 11G- PLSQL

33

Package body created.

SQL> BEGIN 2 CitiesDB.updatecity(789, 'PA', 'CHICAGO'); 3 END; 4 /

PL/SQL procedure successfully completed.

SELECT * FROM CITIES;

CITY_NAME LOCATION_STATE COUNTRY CITY_ID

Portland Or USA 909Portland ME USA 890New York NY USA 788CHICAGO PA USA 789

SQL>SQL> BEGIN 2 CitiesDB.updatecity(909, 'WA','PORTLAND' ); 3 CitiesDB.DELETECITY(890); 4 END; 5 /

PL/SQL procedure successfully completed.

CITY_NAME LOCATION_STATE COUNTRY CITY_ID

PORTLAND WA USA 909New York NY USA 788CHICAGO PA USA 789

Page 35: Oracle 11G- PLSQL

34

Functions

SQL> CREATE OR REPLACE FUNCTION STUDENTNAME 2 (studid in student.student_id%TYPE 3 ) 4 RETURN 5 VARCHAR2 IS 6 7 STUDENT_NAME VARCHAR2(50); 8 BEGIN 9 10 SELECT INITCAP (S.FIRST_NAME||','||S.LAST_NAME)AS NAME 11 INTO 12 STUDENT_NAME 13 FROM STUDENT S 14 WHERE S.STUDENT_ID = studid; 15 16 RETURN STUDENT_NAME; 17 18 END STUDENTNAME; 19 /

Function created.

SQL> COMMIT;

Commit complete.

Page 36: Oracle 11G- PLSQL

35

SQL>SQL> SELECT STUDENTNAME(STUDENT_ID)STUDENT_NAME 2 FROM STUDENT 3 WHERE STUDENT_ID =120;

STUDENT_NAME---------------------------------------------------

Ralph,Alexander

SQL>SQL> SELECT STUDENTNAME(S.STUDENT_ID)STUDENT_NAME 2 ,S.STUDENT_ID, SUM(G.NUMERIC_GRADE)AS GRADE, 3 G.SECTION_ID 4 FROM STUDENT S 5 INNER JOIN GRADE G 6 ON 7 S.STUDENT_ID = G.STUDENT_ID 8 WHERE S.STUDENT_ID = 120 9 AND 10 G.SECTION_ID = 103 11 GROUP BY STUDENTNAME(S.STUDENT_ID), S.STUDENT_ID, G.SECTION_ID;

STUDENT_NAME--------------------------------------------------------------------------

STUDENT_ID GRADE SECTION_ID---------- ---------- ----------Ralph,Alexander 120 751 103

Page 37: Oracle 11G- PLSQL

36

SQL> GROUP BY STUDENTNAME(S.STUDENT_ID), S.STUDENT_ID, G.SECTION_ID;SP2-0734: unknown command beginning "GROUP BY S..." - rest of line ignored.SQL> SELECT STUDENTNAME(S.STUDENT_ID)STUDENT_NAME 2 ,S.STUDENT_ID, SUM(G.NUMERIC_GRADE)AS GRADE, 3 G.SECTION_ID 4 FROM STUDENT S 5 INNER JOIN GRADE G 6 ON 7 S.STUDENT_ID = G.STUDENT_ID 8 WHERE S.STUDENT_ID IN( 120,211) 9 GROUP BY STUDENTNAME(S.STUDENT_ID), S.STUDENT_ID, G.SECTION_ID;

STUDENT_NAME--------------------------------------------------------------------------------

STUDENT_ID GRADE SECTION_ID---------- ---------- ----------Jenny,Goldsmith 211 798 141

Jenny,Goldsmith 211 943 86

Ralph,Alexander 120 751 103

create OR REPLACE view S_GRADES (STUDENT_NAME, STUDENT_ID, GRADE, INSTRUCTOR_NAME, SECTION_ID, DESCRIPTION)as SELECT S.salutation||''||S.first_name ||','||S.last_name as Student_Name

,S.STUDENT_ID, SUM(G.NUMERIC_GRADE)AS GRADE, I.salutation||''||I.first_name ||','||I.last_name as Instructor_Name, G.SECTION_ID, C.DESCRIPTION as DESCRIPTION

Page 38: Oracle 11G- PLSQL

37

FROM STUDENT S INNER JOIN GRADE G ON S.STUDENT_ID = G.STUDENT_ID INNER JOIN SECTION T ON G.SECTION_ID = T.SECTION_ID INNER JOIN COURSE C ON C.COURSE_NO = T.COURSE_NO INNER JOIN INSTRUCTOR I ON T.INSTRUCTOR_ID = I.INSTRUCTOR_IDgroup by S.salutation||''||S.first_name ||','||S.last_name, S.STUDENT_ID, I.salutation||''||I.first_name ||','||I.last_name,

G.SECTION_ID, C.DESCRIPTION;

Page 39: Oracle 11G- PLSQL

38

CursorsExplicit Cursors

SQL> show user;USER is "SUNNY"SQL> SQL> set serveroutput onSQL> declare 2 salu student.salutation%type; 3 fname student.first_name%type; 4 lname student.last_name%type; 5 saddress student.street_address%TyPE; 6 scity zipcode.city%Type; 7 sstate zipcode.state%Type; 8 szip zipcode.zip%type; 9 sphone student.phone%type; 10 sregdate varchar2(80) :=0; 11 rowcount PLS_INTEGER :=0; 12 13 cursor studrec 14 is 15 SELECT S.SALUTATION ,S.FIRST_NAME, S.LAST_NAME, 16 S.STREET_ADDRESS,Z.CITY,Z.STATE,Z.ZIP,S.PHONE, TO_CHAR(S.REGISTRATION_DATE,'MON-DD-RRRR') AS REGISTRATION_DATE 17 FROM STUDENT S INNER JOIN ZIPCODE Z 18 ON 19 S.ZIP = Z.ZIP; 20 21 begin 22 23 open studrec; 24 loop 25 fetch studrec into salu,fname, lname, saddress,scity,sstate,szip, sphone,sregdate; 26 EXIT when studrec%NOTFOUND; 27 rowcount :=studrec%ROWCOUNT; 28 29 DBMS_OUTPUT.PUT_LINE(rowcount ||' ' ||'is the number of rows processed '); 30 DBMS_OUTPUT.PUT_LINE('Student Name:'||' '||salu||' '||fname||' '||lname); 31 DBMS_OUTPUT.PUT_LINE('Address:'||saddress); 32 DBMS_OUTPUT.PUT_LINE('City:'||scity);

Page 40: Oracle 11G- PLSQL

39

33 DBMS_OUTPUT.PUT_LINE('State:'||sstate); 34 DBMS_OUTPUT.PUT_LINE('Phone:'||sphone); 35 DBMS_OUTPUT.PUT_LINE('REGISTRATION DATE:'||sregdate); 36 END LOOP; 37 CLOSE studrec; 38 39 IF studrec%ISOPEN = FALSE 40 THEN 41 DBMS_OUTPUT.PUT_LINE('Cursor is closed'); 42 ELSE 43 DBMS_OUTPUT.PUT_LINE('Cursor is open'); 44 END IF; 45 EXCEPTION 46 WHEN OTHERS 47 THEN 48 DBMS_OUTPUT.PUT_LINE(SQLERRM); 49 END; 50 /1 is the number of rows processed Student Name: Mr. Jim Joas Address:53-33 192nd St. City:Fresh Meadows State:NY Phone:718-555-5555 REGISTRATION DATE:FEB-02-2007 2 is the number of rows processed Student Name: Ms. Sally Naso Address:812 79th St. City:North Bergen State:NJ Phone:201-555-5555 REGISTRATION DATE:FEB-02-2007 3 is the number of rows processed Student Name: Mr. Frantz McLean Address:23-08 Newtown Ave. City:Astoria State:NY Phone:718-555-5555 REGISTRATION DATE:FEB-02-2007

Page 41: Oracle 11G- PLSQL

40

4 is the number of rows processed Student Name: Ms. P. Balterzar Address:30 Carriage Rd. City:Roslyn State:NY Phone:718-555-5555 REGISTRATION DATE:FEB-02-2007

Results Abridged

SQL> set serveroutput onSQL> declare 2 studid student.student_id%type; 3 salu student.salutation%type; 4 fname student.first_name%type; 5 lname student.last_name%type; 6 saddress student.street_address%TyPE; 7 scity zipcode.city%Type; 8 sstate zipcode.state%Type; 9 szip zipcode.zip%type; 10 sphone student.phone%type; 11 sregdate varchar2(80) :=0; 12 rowcount PLS_INTEGER :=0; 13 14 cursor studrec(studid int) 15 is 16 SELECT S.SALUTATION ,S.FIRST_NAME, S.LAST_NAME, 17 S.STREET_ADDRESS,Z.CITY,Z.STATE,Z.ZIP,S.PHONE, TO_CHAR(S.REGISTRATION_DATE,'MON-DD-RRRR') AS REGISTRATION_DATE, 18 S.STUDENT_ID 19 FROM STUDENT S INNER JOIN ZIPCODE Z 20 ON 21 S.ZIP = Z.ZIP 22 where student_id < studid ; 23 24 begin 25 26 open studrec(375); 27 loop 28 fetch studrec into salu,fname, lname, saddress,scity,sstate,szip, sphone,sregdate,studid ; 29 EXIT when studrec%NOTFOUND;

Page 42: Oracle 11G- PLSQL

41

30 rowcount :=studrec%ROWCOUNT; 31 32 DBMS_OUTPUT.PUT_LINE(rowcount ||' ' ||'is the number of rows processed '); 33 DBMS_OUTPUT.PUT_LINE('Student ID:'||' '||studid); 34 DBMS_OUTPUT.PUT_LINE('Student Name:'||' '||salu||' '||fname||' '||lname); 35 DBMS_OUTPUT.PUT_LINE('Address:'||saddress); 36 DBMS_OUTPUT.PUT_LINE('City:'||scity); 37 DBMS_OUTPUT.PUT_LINE('State:'||sstate); 38 DBMS_OUTPUT.PUT_LINE('Phone:'||sphone); 39 DBMS_OUTPUT.PUT_LINE('REGISTRATION DATE:'||sregdate); 40 END LOOP; 41 CLOSE studrec; 42 43 IF studrec%ISOPEN = FALSE 44 THEN 45 DBMS_OUTPUT.PUT_LINE('Cursor is closed'); 46 ELSE 47 DBMS_OUTPUT.PUT_LINE('Cursor is open'); 48 END IF; 49 EXCEPTION 50 WHEN OTHERS 51 THEN 52 DBMS_OUTPUT.PUT_LINE(SQLERRM); 53 END; 54 /1 is the number of rows processed Student ID: 167 Student Name: Mr. Jim Joas Address:53-33 192nd St. City:Fresh Meadows State:NY Phone:718-555-5555 REGISTRATION DATE:FEB-02-2007 2 is the number of rows processed Student ID: 168 Student Name: Ms. Sally Naso Address:812 79th St. City:North Bergen State:NJ

Page 43: Oracle 11G- PLSQL

42

Phone:201-555-5555 REGISTRATION DATE:FEB-02-2007 3 is the number of rows processed Student ID: 169 Student Name: Mr. Frantz McLean Address:23-08 Newtown Ave. City:Astoria State:NY Phone:718-555-5555 REGISTRATION DATE:FEB-02-2007 4 is the number of rows processed Student ID: 170 Student Name: Ms. P. Balterzar Address:30 Carriage Rd. City:Roslyn State:NY Phone:718-555-5555 REGISTRATION DATE:FEB-02-2007

Results AbridgedSQL> set serveroutput onSQL> declare 2 studid student.student_id%type; 3 salu student.salutation%type; 4 fname student.first_name%type; 5 lname student.last_name%type; 6 saddress student.street_address%TyPE; 7 scity zipcode.city%Type; 8 sstate zipcode.state%Type; 9 szip zipcode.zip%type; 10 sphone student.phone%type; 11 sregdate varchar2(80) :=0; 12 rowcount PLS_INTEGER :=0; 13 14 cursor studrec(studid int) 15 is 16 SELECT S.SALUTATION ,S.FIRST_NAME, S.LAST_NAME, 17 S.STREET_ADDRESS,Z.CITY,Z.STATE,Z.ZIP,S.PHONE, TO_CHAR(S.REGISTRATION_DATE,'MON-DD-RRRR') AS REGISTRATION_DATE, 18 S.STUDENT_ID

Page 44: Oracle 11G- PLSQL

43

19 FROM STUDENT S INNER JOIN ZIPCODE Z 20 ON 21 S.ZIP = Z.ZIP 22 where student_id != studid; 23 24 begin 25 26 open studrec(375); 27 loop 28 fetch studrec into salu,fname, lname, saddress,scity,sstate,szip, sphone,sregdate,studid ; 29 EXIT when studrec%NOTFOUND; 30 rowcount :=studrec%ROWCOUNT; 31 32 DBMS_OUTPUT.PUT_LINE(rowcount ||' ' ||'is the number of rows processed '); 33 DBMS_OUTPUT.PUT_LINE('Student ID:'||' '||studid); 34 DBMS_OUTPUT.PUT_LINE('Student Name:'||' '||salu||' '||fname||' '||lname); 35 DBMS_OUTPUT.PUT_LINE('Address:'||saddress); 36 DBMS_OUTPUT.PUT_LINE('City:'||scity); 37 DBMS_OUTPUT.PUT_LINE('State:'||sstate); 38 DBMS_OUTPUT.PUT_LINE('Phone:'||sphone); 39 DBMS_OUTPUT.PUT_LINE('REGISTRATION DATE:'||sregdate); 40 END LOOP; 41 CLOSE studrec; 42 43 IF studrec%ISOPEN = FALSE 44 THEN 45 DBMS_OUTPUT.PUT_LINE('Cursor is closed'); 46 ELSE 47 DBMS_OUTPUT.PUT_LINE('Cursor is open'); 48 END IF; 49 EXCEPTION 50 WHEN OTHERS 51 THEN 52 DBMS_OUTPUT.PUT_LINE(SQLERRM); 53 END; 54 /1 is the number of rows processed Student ID: 167 Student Name: Mr. Jim Joas

Page 45: Oracle 11G- PLSQL

44

Address:53-33 192nd St. City:Fresh Meadows State:NY Phone:718-555-5555 REGISTRATION DATE:FEB-02-2007 2 is the number of rows processed Student ID: 168 Student Name: Ms. Sally Naso Address:812 79th St. City:North Bergen State:NJ Phone:201-555-5555 REGISTRATION DATE:FEB-02-2007 3 is the number of rows processed Student ID: 169 Student Name: Mr. Frantz McLean Address:23-08 Newtown Ave. City:Astoria State:NY Phone:718-555-5555 REGISTRATION DATE:FEB-02-2007 4 is the number of rows processed Student ID: 170 Student Name: Ms. P. Balterzar Address:30 Carriage Rd. City:Roslyn State:NY Phone:718-555-5555 REGISTRATION DATE:FEB-02-2007 5 is the number of rows processed Student ID: 171 Student Name: Ms. Denise Brownstein Address:104-36 196th St. City:Hollis State:NY Phone:718-555-5555 REGISTRATION DATE:FEB-02-2007 6 is the number of rows processed Student ID: 172

Page 46: Oracle 11G- PLSQL

45

Student Name: Ms. Maria Arias Address:Box 216 City:Bellrose State:NY Phone:718-555-5555 REGISTRATION DATE:FEB-02-2007 7 is the number of rows processed Student ID: 173 Student Name: Mr. Oscar McGill Address:578 E 40th ST. City:Brooklyn State:NY Phone:718-555-5555 REGISTRATION DATE:FEB-02-2007 8 is the number of rows processed Student ID: 174 Student Name: Mr. Michael Brown Address:265 Hawthorne St #2D City:Brooklyn State:NY Phone:718-555-5555 REGISTRATION DATE:FEB-02-2007 9 is the number of rows processed Student ID: 175 Student Name: Ms. Debra Boyce Address:294 East 98 St. City:Brooklyn State:NY Phone:718-555-5555 REGISTRATION DATE:FEB-02-2007 10 is the number of rows processed Student ID: 176 Student Name: Ms. Beth Satterfield Address:140 Amity St City:Brooklyn State:NY Phone:718-555-5555 REGISTRATION DATE:FEB-02-2007

Results Abridged

Page 47: Oracle 11G- PLSQL

46

SQL> SQL> set serveroutput onSQL> declare 2 studid student.student_id%type; 3 salu student.salutation%type; 4 fname student.first_name%type; 5 lname student.last_name%type; 6 saddress student.street_address%TyPE; 7 scity zipcode.city%Type; 8 sstate zipcode.state%Type; 9 szip zipcode.zip%type; 10 sphone student.phone%type; 11 sregdate varchar2(80) :=0; 12 rowcount PLS_INTEGER :=0; 13 14 cursor studrec(studid int) 15 is 16 SELECT S.SALUTATION ,S.FIRST_NAME, S.LAST_NAME, 17 S.STREET_ADDRESS,Z.CITY,Z.STATE,Z.ZIP,S.PHONE, TO_CHAR(S.REGISTRATION_DATE,'MON-DD-RRRR') AS REGISTRATION_DATE, 18 S.STUDENT_ID 19 FROM STUDENT S INNER JOIN ZIPCODE Z 20 ON 21 S.ZIP = Z.ZIP 22 where student_id = studid; 23 24 begin 25 26 open studrec(375); 27 loop 28 fetch studrec into salu,fname, lname, saddress,scity,sstate,szip, sphone,sregdate,studid ; 29 EXIT when studrec%NOTFOUND; 30 rowcount :=studrec%ROWCOUNT; 31 32 DBMS_OUTPUT.PUT_LINE(rowcount ||' ' ||'is the number of rows processed '); 33 DBMS_OUTPUT.PUT_LINE('Student ID:'||' '||studid); 34 DBMS_OUTPUT.PUT_LINE('Student Name:'||' '||salu||' '||fname||' '||lname); 35 DBMS_OUTPUT.PUT_LINE('Address:'||saddress);

Page 48: Oracle 11G- PLSQL

47

36 DBMS_OUTPUT.PUT_LINE('City:'||scity); 37 DBMS_OUTPUT.PUT_LINE('State:'||sstate); 38 DBMS_OUTPUT.PUT_LINE('Phone:'||sphone); 39 DBMS_OUTPUT.PUT_LINE('REGISTRATION DATE:'||sregdate); 40 END LOOP; 41 42 43 IF studrec%ISOPEN = FALSE 44 THEN 45 DBMS_OUTPUT.PUT_LINE('Cursor is closed'); 46 ELSE 47 DBMS_OUTPUT.PUT_LINE('Cursor is open'); 48 END IF; 49 EXCEPTION 50 WHEN OTHERS 51 THEN 52 DBMS_OUTPUT.PUT_LINE(SQLERRM); 53 END; 54 /1 is the number of rows processed Student ID: 375 Student Name: Mr. Jack Kasperovich Address:98-17 162nd Ave. City:Howard Bank State:NY Phone:718-555-5555 REGISTRATION DATE:FEB-21-2007 Cursor is open

PL/SQL procedure successfully completed.

SQL> SQL> SQL> set serveroutput onSQL> declare 2 studid student.student_id%type; 3 salu student.salutation%type; 4 fname student.first_name%type; 5 lname student.last_name%type;

Page 49: Oracle 11G- PLSQL

48

6 saddress student.street_address%TyPE; 7 scity zipcode.city%Type; 8 sstate zipcode.state%Type; 9 szip zipcode.zip%type; 10 sphone student.phone%type; 11 sregdate varchar2(80) :=0; 12 rowcount PLS_INTEGER :=0; 13 14 cursor studrec(studid int) 15 is 16 SELECT S.SALUTATION ,S.FIRST_NAME, S.LAST_NAME, 17 S.STREET_ADDRESS,Z.CITY,Z.STATE,Z.ZIP,S.PHONE, TO_CHAR(S.REGISTRATION_DATE,'MON-DD-RRRR') AS REGISTRATION_DATE, 18 S.STUDENT_ID 19 FROM STUDENT S INNER JOIN ZIPCODE Z 20 ON 21 S.ZIP = Z.ZIP 22 where student_id = studid; 23 24 begin 25 26 open studrec(375); 27 loop 28 fetch studrec into salu,fname, lname, saddress,scity,sstate,szip, sphone,sregdate,studid ; 29 EXIT when studrec%NOTFOUND; 30 rowcount :=studrec%ROWCOUNT; 31 32 DBMS_OUTPUT.PUT_LINE(rowcount ||' ' ||'is the number of rows processed '); 33 DBMS_OUTPUT.PUT_LINE('Student ID:'||' '||studid); 34 DBMS_OUTPUT.PUT_LINE('Student Name:'||' '||salu||' '||fname||' '||lname); 35 DBMS_OUTPUT.PUT_LINE('Address:'||saddress); 36 DBMS_OUTPUT.PUT_LINE('City:'||scity); 37 DBMS_OUTPUT.PUT_LINE('State:'||sstate); 38 DBMS_OUTPUT.PUT_LINE('Phone:'||sphone); 39 DBMS_OUTPUT.PUT_LINE('REGISTRATION DATE:'||sregdate); 40 END LOOP; 41 CLOSE studrec; 42 43 IF studrec%ISOPEN = FALSE 44 THEN

Page 50: Oracle 11G- PLSQL

49

45 DBMS_OUTPUT.PUT_LINE('Cursor is closed'); 46 ELSE 47 DBMS_OUTPUT.PUT_LINE('Cursor is open'); 48 END IF; 49 EXCEPTION 50 WHEN OTHERS 51 THEN 52 DBMS_OUTPUT.PUT_LINE(SQLERRM); 53 END; 54 /1 is the number of rows processed Student ID: 375 Student Name: Mr. Jack Kasperovich Address:98-17 162nd Ave. City:Howard Bank State:NY Phone:718-555-5555 REGISTRATION DATE:FEB-21-2007 Cursor is closed

PL/SQL procedure successfully completed.

SQL> SQL> SET ECHO OFF;SQL> SPOOL OFF;

Implicit Cursors

SET SERVEROUTPUT ON BEGIN DBMS_OUTPUT.ENABLE(1000000); UPDATE STUDENT SET FIRST_NAME = 'JACKSON' WHERE STUDENT_ID = 375; DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT||'rows updated');

Page 51: Oracle 11G- PLSQL

50

IF SQL%NOTFOUND THEN DBMS_OUTPUT.PUT_LINE('CHECK THE STUDENT ID ENTERED BECAUSE IS NOT FOUND IN DATABASE'); END IF; COMMIT; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_lINE(SQLERRM); END; /anonymous block completed1rows updated select first_name ,last_name, student_id from student where student_id = 375

FIRST_NAME LAST_NAME STUDENT_ID

JACKSON Kasperovich 375

SET SERVEROUTPUT ON BEGIN DBMS_OUTPUT.ENABLE(1000000); UPDATE STUDENT SET FIRST_NAME = 'JACKSON' WHERE STUDENT_ID = 500; DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT||'rows updated'); IF SQL%NOTFOUND THEN DBMS_OUTPUT.PUT_LINE('CHECK THE STUDENT ID ENTERED BECAUSE IS NOT FOUND IN DATABASE'); END IF; COMMIT;

Page 52: Oracle 11G- PLSQL

51

EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_lINE(SQLERRM); END; anonymous block completed0rows updatedCHECK THE STUDENT ID ENTERED BECAUSE IS NOT FOUND IN DATABASE

Records

SQL> DECLARE 2 3 Students student%rowtype; 4 5 begin 6 7 Students.student_id :=400; 8 Students.first_name :='joe'; 9 Students.last_name :='Joe'; 10 Students.street_address := '5909 Wood Lane Drv'; 11 Students.zip := '48104'; 12 Students.phone := '709-908-9876'; 13 Students.Employer :='ABC NEWS'; 14 Students.Registration_date := '30-jan-09';

Page 53: Oracle 11G- PLSQL

52

15 Students.Created_date := '30-jan-09'; 16 Students.modified_date := '30-jan-09'; 17 Students.created_by := 'sunny'; 18 Students.modified_by :='sunny'; 19 20 21 insert into student(student_id, first_name, last_name,street_address,zip,phone, 22 employer, registration_date, created_date, modified_date, created_by,modified_by) 23 values(Students.student_id,Students.first_name ,Students.last_name , Students.street_address, 24 Students.zip,Students.phone,Students.Employer, Students.Registration_date , 25 Students.Created_date ,Students.modified_date, Students.created_by, 26 Students.modified_by 27 ); 28 29 end; 30 /

PL/SQL procedure successfully completed.

SQL> commit;

Commit complete. select first_name,last_name,student_id from student where student_id =400;

DECLARE

TYPE studentsR is record ( student_id student.student_id%TYPE, first_name student.first_name%TYPE, last_name student.last_name%TYPE, street_address student.street_address%TYPE, phone student.phone%TYPE, zip student.zip%TYPE,

FIRST_NAME

LAST_NAME STUDENT_ID

joe Joe 400

Page 54: Oracle 11G- PLSQL

53

employer student.employer%type, registration_date student.registration_date%type, created_date student.created_date%type, modified_date student.modified_date%type, created_by student.created_by%type, modified_by student.modified_by%type);

Students studentsR;

begin

Students.student_id :=600;Students.first_name :='Michael';Students.last_name :='Joesph';Students.street_address := '5909 Wood Lane Drv';Students.zip := '48104';Students.phone := '709-908-9876';Students.Employer :='ABC NEWS';Students.Registration_date := '30-jan-09';Students.Created_date := '30-jan-09';Students.modified_date := '30-jan-09';Students.created_by := 'sunny';Students.modified_by :='sunny';

insert into student(student_id, first_name, last_name,street_address,zip,phone,employer, registration_date, created_date, modified_date, created_by,modified_by)values(Students.student_id,Students.first_name ,Students.last_name , Students.street_address,Students.zip,Students.phone,Students.Employer, Students.Registration_date ,Students.Created_date ,Students.modified_date, Students.created_by,Students.modified_by);

commit;

end;/

Page 55: Oracle 11G- PLSQL

54

select first_name,last_name,student_id from student where student_id =600;

FIRST_NAME LAST_NAME STUDENT_IDMichael Joesph 600

Oracle Label Security

DBA

SQL> create user secman identified by s;

User created.

SQL> create user bank identified by b;

User created.

SQL> grant dba to secman;

Grant succeeded.

SQL> grant create session , resources to bank;grant create session , resources to bank *ERROR at line 1:ORA-01919: role 'RESOURCES' does not exist

SQL> grant create session , resource to bank;

Page 56: Oracle 11G- PLSQL

55

Grant succeeded.

SQL> spool off

grant execute on dbms_rls to secman;grant execute succeeded.grant execute on dbms_rls to system;grant execute succeeded.

SQL> create user lara identified by l;

User created.

SQL> create user scott identified by s;

User created.

SQL> grant create session to scott, lara;

Grant succeeded.

SQL> set echo offSQL> spool off;

USER Secman

SQL> create table access_policy 2 (AM_NAME VARCHAR2(20) NOT NULL, 3 CUST_ID NUMBER NOT NULL, 4 ACCESS_TYPE CHAR(1) NOT NULL);

Table created.

SQL> SQL> INSERT INTO ACCESS_POLICY(AM_NAME, CUST_ID, ACCESS_TYPE) 2 VALUES('SCOTT', 123, 'S');

Page 57: Oracle 11G- PLSQL

56

1 row created.

SQL> SQL> INSERT INTO ACCESS_POLICY(AM_NAME, CUST_ID, ACCESS_TYPE) 2 VALUES('SCOTT', 123, 'I');

1 row created.

SQL> SQL> INSERT INTO ACCESS_POLICY(AM_NAME, CUST_ID, ACCESS_TYPE) 2 VALUES('SCOTT', 123, 'D');

1 row created.

SQL> SQL> INSERT INTO ACCESS_POLICY(AM_NAME, CUST_ID, ACCESS_TYPE) 2 VALUES ('SCOTT', 123, 'U');

1 row created.

SQL> SQL> INSERT INTO ACCESS_POLICY(AM_NAME, CUST_ID, ACCESS_TYPE) 2 VALUES ('SCOTT', 456, 'S');

1 row created.

SQL> SQL> INSERT INTO ACCESS_POLICY(AM_NAME, CUST_ID, ACCESS_TYPE) 2 VALUES('SCOTT', 789, 'S');

1 row created.

SQL> SQL> INSERT INTO ACCESS_POLICY(AM_NAME, CUST_ID, ACCESS_TYPE) 2 VALUES('LARA', 456, 'S');

1 row created.

SQL>

Page 58: Oracle 11G- PLSQL

57

SQL> INSERT INTO ACCESS_POLICY(AM_NAME, CUST_ID, ACCESS_TYPE) 2 VALUES ('LARA', 456, 'I');

1 row created.

SQL> SQL> INSERT INTO ACCESS_POLICY(AM_NAME, CUST_ID, ACCESS_TYPE) 2 VALUES ('LARA', 456, 'D');

1 row created.

SQL> SQL> INSERT INTO ACCESS_POLICY(AM_NAME, CUST_ID, ACCESS_TYPE) 2 VALUES ('LARA', 456, 'U');

1 row created.

SQL> SQL> create or replace function get_sel_cust_id 2 (p_schema in varchar2, 3 p_table in varchar2 4 ) 5 return varchar2 6 as 7 l_retstr varchar2(2000); 8 begin 9 if (p_schema = user) then 10 l_retstr :=null; 11 else 12 for cust_rec in 13 (select cust_id from access_policy where am_name = USER 14 and access_type = 'S' 15 )loop 16 l_retstr :=l_retstr||','||cust_rec.cust_id; 17 end loop; 18 l_retstr :=ltrim(l_retstr, ','); 19 l_retstr :='CUST_ID IN ('||l_retstr||')'; 20 end if; 21 return l_retstr;

Page 59: Oracle 11G- PLSQL

58

22 end; 23 /

Function created.

SQL> INSERT INTO ACCESS_POLICY(AM_NAME, CUST_ID, ACCESS_TYPE) 2 VALUES ('SECMAN', 123, 'S');

1 row created.

SQL> SQL> INSERT INTO ACCESS_POLICY(AM_NAME, CUST_ID, ACCESS_TYPE) 2 VALUES('SECMAN',456,'S');

1 row created.

SQL> SQL> INSERT INTO ACCESS_POLICY(AM_NAME, CUST_ID, ACCESS_TYPE) 2 VALUES('SECMAN', 789,'S');

1 row created.

SQL> CREATE OR REPLACE FUNCTION get_iud_cust_id 2 (p_schema in varchar2, 3 p_table in varchar2 4 ) return varchar2 5 as 6 l_retstr varchar2(2000); 7 begin 8 if(p_schema = user) then 9 l_retstr := null; 10 else 11 for cust_rec in 12 ( 13 select cust_id from access_policy where am_name = USER 14 and access_type in ('I', 'U', 'D') 15 ) loop 16 l_retstr := l_retstr||','||cust_rec.cust_id; 17 end loop;

Page 60: Oracle 11G- PLSQL

59

18 l_retstr := ltrim(l_retstr, ','); 19 l_retstr := 'CUST_ID IN ('||l_retstr||')'; 20 end if; 21 return l_retstr; 22 end; 23 /

Function created.

SQL> SQL> INSERT INTO ACCESS_POLICY(AM_NAME, CUST_ID, ACCESS_TYPE) 2 VALUES('SECMAN',123, 'U');

1 row created.

SQL> SELECT GET_IUD_CUST_ID('BANK', 'CUSTOMERS') FROM DUAL 2 SQL> /

GET_IUD_CUST_ID('BANK','CUSTOMERS') --------------------------------------------------------------------------------CUST_ID IN (123)

SQL> SET ECHO OFFSQL> SPOOL OFF

User Scott

SQL> select * from BANK.CUSTOMERS;

CUST_ID CUST_NAME ---------- -------------------- 123 Jay Kulkarni 456 Wim Patel

SQL> select * from BANK.ACCOUNTS;

ACC_ID CUST_ID BALANCE

Page 61: Oracle 11G- PLSQL

60

---------- ---------- ---------- 101 123 10000000 102 123 15000000 201 456 10000000 202 456 20000000

SQL> SET ECHO OFF;SQL> SPOOL OFF;

USER Bank

SQL> select * from bank.accounts;

ACC_ID CUST_ID BALANCE ---------- ---------- ---------- 101 123 10000000 102 123 15000000 201 456 10000000 202 456 20000000

SQL> select * from bank.customers;

CUST_ID CUST_NAME ---------- -------------------- 456 Wim Patel

SQL> update bank.customers set cust_name = 'Smith Joe';

1 row updated.

SQL> select * from bank.customers;

CUST_ID CUST_NAME ---------- -------------------- 456 Smith Joe

SQL> commit;

Page 62: Oracle 11G- PLSQL

61

Commit complete.

SQL> insert into bank.customers (cust_id, cust_name) values(999, 'Monica joe');insert into bank.customers (cust_id, cust_name) values(999, 'Monica joe') *ERROR at line 1:ORA-28115: policy with check option violation

SQL> spool off

USER Secman2

SQL> SQL> begin 2 dbms_rls.add_policy ( 3 object_schema => 'BANK', 4 object_name => 'CUSTOMERS', 5 policy_name => 'CUST_SEL_POLICY', 6 function_schema => 'SECMAN', 7 policy_function => 'GET_SEL_CUST_ID', 8 statement_types => 'SELECT', 9 update_check => TRUE 10 ); 11 end; 12 /

PL/SQL procedure successfully completed.

SQL> SQL> begin 2 dbms_rls.add_policy ( 3 object_schema => 'BANK', 4 object_name => 'CUSTOMERS', 5 policy_name => 'CUST_IUD_POLICY', 6 function_schema => 'SECMAN', 7 policy_function => 'GET_IUD_CUST_ID',

Page 63: Oracle 11G- PLSQL

62

8 statement_types => 'INSERT, UPDATE, DELETE', 9 update_check => TRUE 10 ); 11 end; 12 /

PL/SQL procedure successfully completed.

SQL> spool off

Page 64: Oracle 11G- PLSQL

63