INTRODUCTION

SQL is divided into the following 1. Data Definition Language (DDL). 2. Data Manipulation Language (DML) 3. Data Retrieval Language (DRL) 4. Transaction Control Language (TCL) 5. Data Control Language (DCL) DDL: DML: DRL: TCL: DCL: create, alter, drop, truncate, rename insert, update, delete select commit, rollback, savepoint. grant, revoke.

Data Definition Language
1. CREATE:
Create table <table_name> (col1 datatype1, col2 datatype2 «coln datatypen);

Ex:

SQL> create table student (no number (2), name varchar (10), marks number (3));

Table created.

2. INSERT: This will be used to insert the records into table. We have two methods to insert. a) By value method
I. USING VALUE METHOD:

b) By address method

syntax: insert into <table_name) values (value1, value2, value3 «. Valuen); Ex: SQL> insert into student values (1, ¶sudha¶, 100); 1 row created. SQL> insert into student values (2, ¶saketh¶, 200); 1 row created.

1

To insert a new record again you have to type entire insert command, if there is lot of records this will be difficult. This will be avoided by using address method. II. USING ADDRESS METHOD: Syntax: insert into <table_name> values (&col1, &col2, &col3 «. &coln); This will prompt you for the values but for every insert you have to use forward slash. Ex: SQL> insert into student values (&no, '&name', &marks); Enter value for no: 1 Enter value for name: Jagan Enter value for marks: 300 old 1: insert into student values(&no, '&name', &marks) new 1: insert into student values(1, 'Jagan', 300) 1 row created. SQL> / Enter value for no: 2 Enter value for name: Naren Enter value for marks: 400 old 1: insert into student values(&no, '&name', &marks) new 1: insert into student values(2, 'Naren', 400) 1 row created.
III. INSERTING DATA INTO SPECIFIED COLUMNS USING VALUE METHOD: Syntax:

insert into <table_name)(col1, col2, col3 « Coln) values (value1, value2, value3« value-n);

Ex: SQL> insert into student (no, name) values (3, ¶Ramesh¶); 1 row created. SQL> insert into student (no, name) values (4, ¶Madhu¶); 1 row created.

2

IV. INSERTING DATA INTO SPECIFIED COLUMNS USING ADDRESS METHOD:

Syntax: insert into <table_name)(col1, col2, col3 « coln) values (&col1, &col2, &col3 «. &coln); This will prompt you for the values but for every insert you have to use forward slash. Ex: SQL> insert into student (no, name) values (&no, '&name');
Enter value for no: 5 Enter value for name: Visu old 1: insert into student (no, name) values(&no, '&name') new 1: insert into student (no, name) values(5, 'Visu') 1 row created.

SQL> /
Enter value for no: 6 Enter value for name: Rattu old 1: insert into student (no, name) values(&no, '&name') new 1: insert into student (no, name) values(6, 'Rattu') 1 row created.

3. SELECT: Syntax: Select * from <table_name>; //here * indicates all columns (or) Select col1, col2, coln from <table_name>;
Ex:

SQL> select * from student;
NO NAME --- -----1 Sudha 2 Saketh MARKS -------100 200

2 rows selected. SQL> select no, name, marks from student; NO NAME -------1 Sudha 2 Saketh 2 rows selected. MARKS -------100 200

3

NO NAME --------1 Sudha 2 Saketh 1 Jagan 3 rows selected. name from student. >=. CONDITIONAL SELECTIONS AND OPERATORS We have two clauses used in this 1. <=. <> y y y y between. -.  Arithmetic operators  Comparison operators  Logical operators a. The following are the different types of operators used in where clause. not in null.lowest precedence 4 . / b. >. *. Order by USING WHERE Syntax: select * from <table_name> where <condition>.SQL> select no. not null like c. Comparison operators:=. <. Logical operators:y y y And Or not -. Arithmetic operators:- Highest precedence +. not between in. !=. Where 2.

SQL> select * from student where no <= 2. NO --2 2 3 4 5 6 NAME MARKS --------------Saketh 200 Naren 400 Ramesh Madhu Visu Rattu 6 rows selected. SQL> select * from student where no > 2. NO --1 1 NAME MARKS ---------------Sudha 100 Jagan 300 2 rows selected. <=. NAME MARKS --------------Saketh 200 Naren 400 2 rows selected. <> Ex: NO --2 2 SQL> select * from student where no = 2. SQL> select * from student where no < 2. NO --1 2 1 2 NAME MARKS ---------------Sudha 100 Saketh 200 Jagan 300 Naren 400 4 rows selected. >.a) USING =. 5 . <. SQL> select * from student where no >= 2. >=. !=. NO --3 4 5 6 NAME MARKS ---------------Ramesh Madhu Visu Rattu 4 rows selected.

<conditionn>.. syntax: select * from <table_name> where <condition1> and <condition2> or . SQL> select * from student where no <> 2. b) USING AND This will gives the output when all the conditions become true. NAME ------Saketh Naren 2 rows selected. NO --1 1 3 4 5 6 NAME MARKS ---------------Sudha 100 Jagan 300 Ramesh Madhu Visu Rattu 6 rows selected.SQL> select * from student where no != 2. MARKS -------200 400 c) USING OR This will gives the output when either of the conditions become true. Ex: NO --2 2 SQL> select * from student where no = 2 and marks >= 200.. NO --1 1 3 4 5 6 NAME ------Sudha Jagan Ramesh Madhu Visu Rattu MARKS ---------100 300 6 rows selected. <conditionn>. syntax: select * from <table_name> where <condition1> and <condition2> and . 6 .

Ex: SQL> select * from student where no = 2 or marks >= 200; NO --2 1 2 NAME MARKS --------------Saketh 200 Jagan 300 Naren 400 3 rows selected.

d) USING BETWEEN This will gives the output based on the column and its lower bound, upperbound. Syntax : select * from <table_name> where <col> between <lower bound> and <upper bound>; Ex: NO --2 1 2 SQL> select * from student where marks between 200 and 400; NAME MARKS --------------Saketh 200 Jagan 300 Naren 400 3 rows selected.

e) USING NOT BETWEEN This will gives the output based on the column which values are not in its lower bound, upperbound. Syntax: select * from <table_name> where <col> not between <lower bound> and <upper bound>; Ex: NO --1 SQL> select * from student where marks not between 200 and 400; NAME ------Sudha 1 row selected. MARKS --------100

f) USING ³IN´: This will gives the output based on the column and its list of values specified. Syntax: select * from <table_name> where <col> in ( value1, value2, value3 « valuen);

7

Ex: SQL> select * from student where no in (1, 2, 3); NO --1 2 1 2 3 NAME ------Sudha Saketh Jagan Naren Ramesh 5 rows selected. MARKS --------100 200 300 400

g) USING ³NOT IN´:- This will gives the output based on the column which values are not in the list of values specified. Syntax: select * from <table_name> where <col> not in ( value1, value2, value3 « valuen); Ex: SQL> select * from student where no not in (1, 2, 3); NO --4 5 6 NAME ------Madhu Visu Rattu 3 rows selected. MARKS ---------

h) USING ³NULL´:This will gives the output based on the null values in the specified column. Syntax: select * from <table_name> where <col> is null;
Ex:
SQL>

select * from student where marks is null;

NO --3 4 5 6

NAME MARKS --------------Ramesh Madhu Visu Rattu 4 rows selected.

i) USING NOT NULL:This will gives the output based on the not null values in the specified column. syntax: select * from <table_name> where <col> is not null;

8

Ex: SQL> select * from student where marks is not null; NO NAME --- ------1 Sudha 2 Saketh 1 Jagan 2 Naren 4 rows selected. j) USING LIKE:This will be used to search through the rows of database column based on the pattern you specify. syntax: Ex: select * from <table_name> where <col> like <pattern>; MARKS --------100 200 300 400

i) This will give the rows whose marks are 100.

SQL> select * from student where marks like 100; NO NAME --- ------1 Sudha 1 row selected. ii) This will give the rows whose name start with µS¶. SQL> select * from student where name like 'S%'; NO NAME --- ------1 Sudha 2 Saketh 2 rows selected. iii) This will give the rows whose name ends with µh¶. SQL> select * from student where name like '%h'; NO --2 3 NAME ------Saketh Ramesh MARKS --------200 MARKS --------100 200 MARKS --------100

2 rows selected.

9

NO --2 6 NAME ------Saketh Rattu MARKS --------200 2 rows selected. 10 . SQL> select * from student where name like '%e__'. SQL> select * from student where name like '_a%'. NO --2 1 2 3 4 6 NAME ------Saketh Jagan Naren Ramesh Madhu Rattu MARKS -------200 300 400 6 rows selected. V) This will give the rows whose name¶s third letter start with µd¶. NO --1 4 NAME ------Sudha Madhu MARKS --------100 2 rows selected. Vi) This will give the rows whose name¶s second letter start with µt¶ from ending. SQL> select * from student where name like '%t_'. SQL> select * from student where name like '__d%'. Vii) This will give the rows whose name¶s third letter start with µe¶ from ending.iV) This will give the rows whose name¶s second letter start with µa¶. NO --2 3 NAME ------Saketh Ramesh MARKS --------200 2 rows selected.

Ex: SQL> select * from student order by no. SQL> select * from student where name like '%a% a %'. * You have to specify the patterns in like using underscore ( _ ).Viii) This will give the rows whose name cotains 2 a¶s. If you want output in descending order you have to use desc keyword after the column.------1 Sudha 1 Jagan 2 Saketh 2 Naren 3 Ramesh 4 Madhu 5 Visu 6 Rattu 8 rows selected. By default oracle will use ascending order. NO NAME --. USING ORDER BY This will be used to ordering the columns data (ascending or descending).------6 Rattu 5 Visu 4 Madhu 3 Ramesh MARKS --------MARKS --------100 300 200 400 11 . SQL> select * from student order by no desc. Syntax: Select * from <table_name> order by <col> desc. NO --1 NAME ------Jagan MARKS ---------300 1 row selected. NO NAME --.

Syntax: Delete <table_name> where <condition>. If you are not specifying any condition this will delete entire table. SQL> update student set marks = 500 where no = 2. SQL> update student set marks = 500. name = 'Venu' where no = 1. If you are not specifying any condition this will update entire table. Ex: SQL> update student set marks = 500. SQL> alter table student add sdob date. 12 . 200 400 100 300 USING DML USING UPDATE:This can be used to modify the table data. USING DELETE:This can be used to delete the table data temporarily. SQL> delete student where no = 2. a) ADDING COLUMN syntax: Ex: alter table <table_name> add <col datatype>. Ex: SQL> delete student. <col2> = value2 where <condition>. USING DDL USING ALTER This can be used to add or remove columns and to modify the precision of the datatype. This can be used to delete specific ³row/s ³from the table using the condition. Syntax:Update <table_name> set <col1> = value1.2 Saketh 2 Naren 1 Sudha 1 Jagan 8 rows selected.

b) REMOVING COLUMN syntax: alter table <table_name> drop column<col datatype>; Ex: SQL> alter table student drop column sdob; c) INCREASING OR DECREASING PRECISION OF A COLUMN syntax: alter table <table_name> modify <col datatype>; Ex: SQL> alter table student modify marks number (5);

* To decrease precision the column should be empty. * Or we can decrease the precision if length of the datatype is greater than the Column value. d) MAKING COLUMN UNUSED syntax: alter table <table_name> set unused column <col>; Ex: SQL> alter table student set unused column marks;

Even though the column is unused still it will occupy memory. d) DROPPING UNUSED COLUMNS syntax: alter table <table_name> drop unused columns;

Ex: SQL> alter table student drop unused columns; * You can not drop individual unused columns of a table. e) RENAMING COLUMN syntax: alter table <table_name> rename column <old_col_name> to <new_col_name>; Ex: SQL> alter table student rename column marks to smarks; USING TRUNCATE This can be used to delete the entire table data permanently.But table structure is available in the database. Here (after truncate ) we can re enter the values into table. Syntax: truncate table <table_name>; Ex: SQL> truncate table student;

13

USING DROP This will be used to drop the database object.Here entire data and structure of the table will lose from the database. Syntax:
Drop table <table_name>; Ex:
SQL>

drop table student;

USING RENAME This will be used to rename the database object; Syntax: Ex: rename <old_table_name> to <new_table_name>; SQL> rename student to stud;

USING TCL
USING COMMIT This will be used to save the work. Commit is of two types. a) Implicit b) Explicit a) IMPLICIT This will be issued by oracle internally in two situations. When any DDL operation is performed. When you are exiting from SQL * PLUS. b) EXPLICIT This will be issued by the user. Syntax: Commit or commit work; * When ever you committed then the transaction was completed. USING ROLLBACK This will undo the operation. This will be applied in two methods. Upto previous commit Upto previous rollback

14

Syntax:

Roll or roll work; (or) Rollback or rollback work;

* While process is going on, if suddenly power goes then oracle will rollback the transaction. USING SAVEPOINT You can use savepoints to rollback portions of your current set of transactions. Syntax: Savepoint <savepoint_name>;

Ex: SQL> savepoint s1; SQL> insert into student values(1, µa¶, 100); SQL> savepoint s2; SQL> insert into student values(2, µb¶, 200); SQL> savepoint s3; SQL> insert into student values(3, µc¶, 300); SQL> savepoint s4; SQL> insert into student values(4, µd¶, 400); Before rollback SQL> select * from student; NO --1 2 3 4 NAME ------a b c d 4 rows selected. SQL> rollback to savepoint s3; (or) SQL> rollback to s3; This will rollback last two records. SQL> select * from student; NO --1 2 NAME ------a b MARKS ---------100 200 MARKS ---------100 200 300 400

2 rows selected.

15

you can give all privileges The sudha user has to use dot method to access the object. insert on student to sudha. Syntax: Grant <privileges> on <object_name> to <user_name> [with grant option]. SQL> revoke select on student form sudha. -.you can revoke individual privilege SQL> revoke select. Syntax: Create table <new_table_name> [col1. Syntax: Ex: Revoke <privileges> on <object_name> from <user_name>. Creating table with your own column names.USING DCL DCL commands are used to granting and revoking the permissions. SQL> grant all on student to sudha.you can revoke all privileges USING ALIASES CREATE WITH SELECT We can create a table using existing table [along with data]. SQL> select * from saketh. Ex: SQL> grant select on student to sudha. The sudha user can not grant permission on student table to other users. USING REVOKE This is used to revoke the privileges from the users to which you granted the privileges.. Now sudha user also has the grant permissions on student table. insert on student from sudha. coln] as select * from <old_table_name>. Ex: SQL> create table student1 as select * from student.student. 16 .you can give set of privileges SQL> grant select ..-. SQL> grant all on student to sudha with grant option. -.you can revoke set of privileges SQL> revoke all on student from sudha. To get this type of option use the following. col3 . col2. -. USING GRANT This is used to grant the privileges to other users.you can give individual privilege -. -.

SQL> create table student2 (sno. Creating table with out table data.name. SQL> insert into student1 select * from student. sname.<coln> from <table_name> <alias_name>. 17 . USING MERGE MERGE You can use merge command to perform insert and update in a single command.<col1>.no.no. INSERT WITH SELECT Using this we can insert existing table data to another table in a single trip.<col2> « <alias_name>. s1.no=s2.marks when not matched then insert (s1. Ex: SQL> merge into student1 s1 using (select * from student2) s2 on (s1.name from student s.marks) values (s2. <alias_name>. Syntax: Ex: Insert into <table1> select * from <table2>. But the table structure should be same. Ex: SQL> select no sno from student. COLUMN ALIASES Syntax: Select <orginal_col> <alias_name> from <table_name>. s2. s1.no) when matched then update set marks = s2. smarks) as select * from student. smarks) as select * from student where 1 = 2.marks). In the above where clause give any condition which does not satisfy. or TABLE ALIASES If you are using table aliases you can use dot method to the columns.name. Syntax: Select <alias_name>. Creating table with specified columns.no. SQL> create table student3 as select no. Ex: SQL> select s. name) select no. sname. SQL> create table student2 (sno. s. Inserting data into specified columns SQL> insert into student1(no. SQL> select no ³sno´ from student. name from student. s2. name from student.

marks) values(s2.300) select *from dept where deptno > 10. city.name. -. b) MULTI INSERT WITH ALL FIELDS SQL> Insert all into student values(1.name) values(4. SQL> Merge into student1 s1using (select * from student2) s2 on (s1.¶a¶. Assume that student1 has columns like no.s1.s2. -.200) into student values(3.no.100) into student values(2.¶a¶.In the above the two tables are with the same structure but we can merge different structured tables also but the datatype of the columns should match.hno).400) into student values(3. hno.no=s2.marks number(3)).name varchar(2).marks) values(¶e¶. name.300) select *from dept where deptno=10.s1.¶c¶.¶b¶.300) select *from dept where deptno=10.no. name.This inserts 9 rows because in the select statement retrieves 3 records (3 inserts for each row retrieved) 18 . marks and student2 has columns like no.¶d¶) into student(name.hno when not matched then insert (s1.¶b¶.no) when matched then update set marks = s2.¶c¶.This inserts 3 rows d) MULTI INSERT WITH DUPLICATE ROWS SQL> insert all into student values(1.name.200) into student values(3. MULTIPLE INSERTS We have table called DEPT with the following columns and data DEPTNO -------10 20 30 40 DNAME -------accounting research sales operations LOC ------New York Dallas Chicago boston a) CREATE STUDENT TABLE SQL> Create table student (no number(2).s2.¶c¶. This inserts 3 rows c) MULTI INSERT WITH SPECIFIED FIELDS SQL> insert all into student (no.100) into student values(2.

e) MULTI INSERT WITH CONDITIONS BASED SQL> Insert all when deptno > 10 then into student1 values (1,¶a¶, 100) when dname= µSALES¶ then into student2 values (2,¶b¶, 200) when loc = µNEW YORK¶ then into student3 values (3,¶c¶, 300) select *from dept where deptno>10; This inserts 5 rows because the first condition satisfied 3 times, second condition satisfied once and the last condition satisfied once. f) MULTI INSERT WITH CONDITIONS BASED AND ELSE SQL> insert all when deptno > 100 then into student1 values (1,¶a¶, 100) when dname = µS¶ then into student2 values (2,¶b¶, 200) when loc = µNEW YORK¶ then into student3 values (3,¶c¶, 300) else into student values (4,¶d¶, 400) select *from dept where deptno>10; -- This inserts 3 records because the else satisfied 3 times g) MULTI INSERT WITH CONDITIONS BASED AND FIRST SQL> Insert first when deptno = 20 then into student1 values (1,¶a¶, 100) when dname = µRESEARCH¶ then into student2 values(2,¶b¶,200) when loc = µNEW YORK¶ then into student3 values(3,¶c¶,300) select *from dept where deptno=20; -- This inserts 1 record because the ³first´ clause avoids checking the remaining conditions once the condition is satisfied. h) MULTI INSERT WITH CONDITIONS BASED, FIRST AND ELSE SQL> insert first when deptno = 30 then into student1 values (1,¶a¶, 100) when dname = µR¶ then into student2 values (2,¶b¶, 200) when loc = µNEW YORK¶ then into student3 values (3,¶c¶,300) else into student values(4,¶d¶,400) select *from dept where deptno=20; -- This inserts 1 record because the else clause satisfied once i) MULTI INSERT WITH MULTIBLE TABLES SQL> Insert all into student1 values(1,¶a¶,100) into student2 values(2,¶b¶,200) into student3 values(3,¶c¶,300) select *from dept where deptno=10; -- This inserts 3 rows ** You can use multiple tables with specified fields, with duplicate rows, with conditions, with first and else clauses.

19

FUNCTIONS
Functions can be categorized as follows.  Single row functions  Group functions SINGLE ROW FUNCTIONS Single row functions can be categorized into five. These will be applied for each row and produces individual output for each row. I. II. III. IV. V. I. Numeric/Arithmetic functions String functions Date functions Miscellaneous functions Conversion functions

NUMERIC/ARITHMETIC FUNCTIONS a) Abs b) Sign c) Sqrt d) Mod e) Nvl f) Power g) Exp h) Ln i) Log j) Ceil k) Floor l) Round m) Trunk n) Bitand o) Greatest p) Least q) Coalesce

a) Abs:- Absolute value is the measure of the magnitude of value. Absolute value is always a positive number.

20

Syntax: abs (value) Ex: SQL> select abs(5), abs(-5), abs(0), abs(null) from dual;

ABS (5) ABS(-5) ABS(0) ABS(NULL) ---------- ------------------- ------------5 5 0 b) SIGN:- Sign gives the sign of a value. Syntax: sign (value) Ex: SQL> select sign(5), sign(-5), sign(0), sign(null) from dual; SIGN (5) SIGN (-5) ---------- ---------1 -1 SIGN (0) ---------0 SIGN (NULL) --------------

c) SQRT:- This will give the square root of the given value. Syntax: sqrt (value) Ex: -- here value must be positive.

SQL> select sqrt(4), sqrt(0), sqrt(null), sqrt(1) from dual; SQRT (0) ---------0 This will give the remainder. SQRT (NULL) --------------SQRT (1) ---------1

SQRT (4) ---------2 d) MOD

Syntax: mod (value, divisor) Ex: SQL> select mod(7,4), mod(1,5), mod(null,null), mod(0,0), mod(-7,4) from dual; MOD(7,4) MOD(1,5) ------------ ---------3 1 MOD(NULL,NULL) --------------------MOD(0,0) MOD(-7,4) ----------- ------------0 -3

e) NVL:- This will substitutes the specified value in the place of null values. Syntax: nvl (null_col, replacement_value) Ex: SQL> select * from student; -- here for 3rd row marks value is null NO --1 2 3 NAME ------a b c MARKS --------100 200

21

name.3).3). power(2. nvl(4.4) ---------4 Power is the ability to raise a value to a given exponent.0).0) POWER(1. nvl(5.1) NVL(null.2).5) POWER(0. power(null.693147181 Ln and Exp are reciprocal to each other.---------------------1 .null).NULL) -------------------------------------------------------------32 1 1 g) EXP:. Syntax: ln (value) -.-------------------------0 1 f) POWER NVL(4.2) NVL(2.SQL> select no. exp(2).3) NVL(5. exp(-2) from dual.3890561 EXP(0) EXP(NULL) EXP(-2) -------. exp(null).5).1). NVL(1. nvl(4.-5) --------------. POWER(2.0855369) = 3 22 . Syntax: exp (value) Ex: POWER(2. ln(2).-5) from dual. nvl(2.71828183 EXP(2) --------7.3) NVL(4. nvl(1.135335283 h) LN This is based on natural or base µe¶ logarithm. NVL(0. NO NAME NVL(MARKS.4) from dual.1).1) POWER(NULL. Syntax: power (value. Ex: SQL> select ln(1).0).here value must be greater than zero which is positive only. exp(0). ln(null) from dual.This will raise µe¶ value to the give power. power(1.4) ------------------------------------1 2 4 5 SQL> select nvl(0.4) from dual. EXP(1) -------2. power(0.300) ----------------------------1 a 100 2 b 200 3 c 300 SQL> select nvl(1. nvl(marks.0855369 LN (20.300) from student.null).null) ---------.0) NVL(1.03125 SQL> select exp(1). nvl(null. exponent) Ex: SQL> select power(2. LN(1) LN(2) LN(NULL) -----------------------0 . EXP (3) = 20.

ceil(null) from dual. log(10.1).i) LOG This is based on 10 based logarithm.1).1) -----------0 LOG(10.2354. LOG(10. ceil(0).-4) from dual.1).-3) ROUND(123. ceil( -5. round(123.-1). round(123.3) from dual.2345.1).23 123.-2) ROUND(123.2345).1).-------.24 SQL> select round(123.0) ROUND(123.3) ----------------1.-----------------------.NULL) ----------------- LN (value) = LOG (EXP(1). floor(0). round(123. Syntax: log (10. ceil(5.2345.1) CEIL(-5) CEIL(-5.---------.2345.here value must be greater than zero which is positive only.2) ----------.2345.-1) ROUND(123. ceil(-5). log(exp(1).-2).2345) ROUND(123.null) from dual. floor(-5).2345. value) SQL> select ln(3).2). log(10.1) CEIL(0) CEIL(NULL) --------.09861229 Syntax: ceil (value) Ex: SQL> select ceil(5). LOG(EXP(1).2345.----------.2) --------------------.This will produce a whole number that is greater than or equal to the specified value.-3). floor(null) from dual.This will produce a whole number that is less than or equal to the specified value. Syntax: round (value.1) FLOOR(0) FLOOR(NULL) -----------------------------------------------------------------------5 5 -5 -6 0 l) ROUND :. LN(3) ------1.2) from dual.-----------.2) ROUND(123.2345. CEIL(5) CEIL(5. Syntax: floor (value) Ex: SQL> select floor(5). ROUND(123. FLOOR(5) FLOOR(5.-------------5 6 -5 -5 0 k) FLOOR:.2345.2345. precision) Ex: SQL> select round(123. floor(5.----------------------. floor( -5. value) -.----------------------123 123 123.-4) ---------------------120 ------------------------. round(123.-----------------------100 0 0 23 .2354. log(10.2345.1) FLOOR(-5) FLOOR(-5. ROUND(123. round(123.100).This will rounds numbers to a given number of digits of precision.2345.301029996 LOG(10.100) --------------2 LOG(10. Ex: SQL> select log(10.-----------------------.09861229 j) CEIL: .2).

-4) -----------------------.-1) ROUND(123.2345. round(-123.-----------------------120 100 0 0 SQL> select trunc(123. Syntax: trunc (value. round(1.2354.----------------123 123 123 SQL> select trunc(-123. ROUND(NULL.-1).2) ----------------.-3) from dual.-----------------------. round(123.-2) ROUND(-123. trunc(123.0). round(-123. trunc(123.-1).2).2) from dual.2345.0).0) ROUND(-123.1). ROUND(123. TRUNC(123.2345) TRUNC(123. round(-1. round(-2.0) TRUNC(123. precision) Ex: SQL> select trunc(123. TRUNC(-123.-1) TRUNC(123. trunc(123. trunc(123. ROUND(123.2345. TRUNC(123.----------------.1) ROUND(123.---------------.2) from dual.-1).2345.1) ROUND(-123.-2) from dual.-2) ------------------------------------------------------------------------------0 1 0 0 m) TRUNC :.0).-2) TRUNC(123.2354.SQL> select round(123.2345.----------------------.2) ----------------------------------------------------------------123 123.-2).-4) from dual.2345.0) TRUNC(-123. trunc(-123.-1).2) TRUNC(123.1).0).1) TRUNC(-123.-2). trunc(123.-----------------123 -123 -123 24 .2) from dual.-3) ---------------------------100 0 SQL> select round(null.-3). round(123.1). round (-123.2345.2345. round(-123.23 123. trunc(123.2) ----------------------------------------------------123 -123 -123 SQL> select round(123.0).2) -----------------------------------------------123 123 123 SQL> select round(-123.-1) ROUND(-2.2345.2).2) from dual. round(123.-3) TRUNC(123.-3). ROUND(-123.1).-1) -------------------------------------------------120 100 0 -120 ROUND(-123.1) ROUND(-1.NULL) ROUND(0.1) TRUNC(123.This will truncates or chops off digits of precision from a number.2345).-2) ROUND(123. round(123.23 SQL> select trunc(123.0) ROUND(123. trunc(123. trunc(-123.2345.2) from dual. TRUNC(123.-3) ROUND(-123.2) ---------------.null).0) ROUND(1.1). round(-123. round(0.

-3) from dual. trunc(1. TRUNC(123. bitand(0.0) BITAND(1.null).-1) TRUNC(-123.3) BITAND(0.-1).-1).-2.0) TRUNC(1. bitand(1. Syntax: least (value1. trunc(123. trunc(-1. bitand(-2. 2.3) GREATEST(-1. GREATEST(1.-3) -----------------------3  If all the values are zeros then it will display zero.SQL> select trunc(123. 3). -2.2). value3 « valuen) Ex: SQL> select greatest(1.0). 2.2.-2) from dual. value3 « valuen) Ex: SQL> select least(1.3). -3) from dual.-2) ------------------------------------------------------------.-1) TRUNC(123. value2) Ex:SQL> select bitand(2.2.-3) --------------------------------------------------------------------------120 100 0 -120 -123 0 SQL> select trunc(null.-2) TRUNC(123.-3) from dual.---------------0 1 0 0 n) BITAND:.-1).-2.1) BITAND(NULL. BITAND(2.  If any of the parameters is NULL it will display nothing. Syntax: greatest (value1.-3). 3). value2.1).-3) from dual. LEAST(1.NULL) BITAND(-2. trunc(-123. 25 . trunc(-2. trunc(0.This will give the greatest number.-3) -------------------------------------------------------------------------------2 0 1 -4 o) GREATEST:. bitand(null.2) TRUNC(-123.  If all the parameters are NULL¶s then it will display nothing.-1) TRUNC(-2. least(-1.NULL) TRUNC(0.null). p) LEAST:This will give the least number. greatest(-1. Syntax: bitand (value1. -2.  If all the parameters are NULL¶s then it will display nothing.3) -------------------1 LEAST(-1. trunc(-123.1). value2.This will perform bitwise and operation.1) TRUNC(-1.-3) TRUNC(-123. trunc(-123. trunc(123.  If any of the parameters is NULL it will display nothing. TRUNC(NULL.-2).-3) -----------------------------------------3 -1  If all the values are zeros then it will display zero.0).

5) from dual.2. value2. coalesce(null.3).3) ------------------1 COALESCE(NULL.NULL.5) ------------------------------2 II. value3 « valuen) Ex: SQL> select coalesce(1.2. COALESCE(1.2. STRING FUNCTIONS a) Initcap b) Upper c) Lower d) Length e) Rpad f) Lpad g) Ltrim h) Rtrim i) Trim j) Translate k) Replace l) Soundex m) Concat ( µ || µ Concatenation operator) n) Ascii o) Chr p) Substr q) Instr r) Decode s) Greatest t) Least u) Coalesce 26 . Syntax: coalesce (value1.q) COALESCE:- This will return first non-null value.null.2.

15. padding_char]) Ex: SQL> select rpad('computer'. 27 .This will capitalize the initial letter of the string. RPAD('COMPUTER' RPAD('COMPUTER' ------------------------------------------computer******* computer*#*#*#* -. Syntax: rpad (string.This will convert the string into uppercase. Syntax: length (string) Ex: SQL> select length('computer') from dual.15. INITCAP ----------Computer b) UPPER:. Syntax: lower (string) Ex: SQL> select lower('COMPUTER') from dual.'*#') from dual. Syntax: upper (string) Ex: SQL> select upper('computer') from dual.This will allows you to pad the right side of a column with any set of characters.'*'). UPPER ----------COMPUTER c) LOWER:. LENGTH ----------8 e) RPAD:.Default padding character was blank space. rpad('computer'. Syntax: initcap (string) Ex: SQL> select initcap('computer') from dual. length [.This will give length of the string.a) INITCAP:.This will convert the string into lowercase. LOWER ----------computer d) LENGTH:.

'er').This will trim off unwanted characters from the both sides of string. RTRIM( RTRIM -------. ltrim('computer'.f) LPAD:.--------mputer puter SQL> select ltrim('computer'. rtrim('computer'.---------computer computer -.'omputer') from dual. rtrim('computer'. Syntax: ltrim (string [.15.'co'). Syntax: rtrim (string [.'comput¶).Default padding character was blank space. length [. g) LTRIM:.15.'*'). Syntax: lpad (string. i) TRIM:.This will allows you to pad the left side of a column with any set of characters. LTRIM('C LTRIM('C ---------. LTRIM( LTRIM -------.'*#') from dual.--------comput compu SQL> select rtrim('computer'.If you haven¶t specified any unwanted characters it will display entire string.'puter'). unwanted_chars]) Ex: SQL> select rtrim('computer'.'compute') from dual. RTRIM('C RTRIM('C ---------. TRIM ( ----ndian 28 .'com') from dual.If you haven¶t specify any unwanted characters it will display entire string. padding_char]) Ex: SQL> select lpad ('computer'.'ter') from dual.unwanted_chars]) Ex: SQL> select ltrim('computer'.This will trim off unwanted characters from the right end of string. Syntax: trim (unwanted_chars from string) Ex: SQL> select trim( 'i' from 'indiani') from dual. ltrim('computer'.---------computer computer -. lpad('computer'.0 LPAD('COMPUTER' --------------------*******computer LPAD('COMPUTER' --------------------*#*#*#*computer -.This will trim off unwanted characters from the left end of string. h) RTRIM:.

exclusively used in where clause. old_chars.'in'. Syntax: replace (string. EMPNO ENAME JOB MGR HIREDATE SAL DEPTNO -------. string2) Ex: SQL> select concat('computer'.' operator') from dual. replace(µindia¶.SQL> select trim( leading'i' from 'indiani') from dual. -.'xy') from dual. REPLACE REPLACE --------------------Xydia dia l) SOUNDEX:.'xy').This will replace the set of characters. CONCAT('COMPUTER' ------------------------computeroperator 29 . old_chars [. TRANS -------xydxa k) REPLACE:.this will work as LTRIM TRIM (L -----ndiani SQL> select trim( trailing'i' from 'indiani') from dual. Syntax: soundex (string) Ex: SQL> select * from emp where soundex(ename) = soundex('SMIT').-----------.---------------. Syntax: concat (string1. new_chars) Ex: SQL> select translate ('india'.---------7369 SMITH CLERK 7902 17-DEC-80 500 20 m) CONCAT:This will be used to combine two strings only.This will replace the set of characters. character by character.'in'. string by string.this will work as RTRIM TRIM(T -----indian j) TRANSLATE:.This will be used to find words that sound like other words. -.--------. Syntax: translate (string. new_chars]) Ex: SQL> select replace('india'.¶in¶) from dual.

no_of_chars]) Ex: SQL> select substr('computer'. ASCII('A') ASCII('APPLE') ASCII(µAS¶) -----------.This will return the character having the binary equivalent to the string in either the database character set or the national character set.  If both parameters except string are null or zeros then it will display nothing. SQL> select 'how' || ' are' || ' you' from dual. start_chr_count [.2). 'HOW'||'ARE --------------how are you n) ASCII:. substr('computer'.-----------------. substr('computer'.5).This will be used to extract substrings. CHR ----a p) SUBSTR:.3. 30 . Syntax: chr (number) Ex: SQL> select chr(97) from dual.7) from dual. ascii('apple').------.-----------97 97 65 o) CHR:.This will return the decimal representation in the database character set of the first character of the string.-------omputer omput mputer  If no_of_chars parameter is negative then it will display nothing.ascii(µAS¶) from dual.2.If you want to combine more than two strings you have to use concatenation operator (||). Syntax: substr (string.  If no_of_chars parameter is greater than the length of the string then it ignores and calculates based on the orginal string length. SUBSTR( SUBST SUBSTR ---------. Syntax: ASCII (string) Ex: SQL> select ascii('a').

'O'. then2.  If both parameters start_chr_count and occurrence are null.'Low'. if2. SAL ----500 2500 2000 3500 3000 5000 4000 5000 1800 1200 2000 2700 2200 3200 DECODE --------Low Medium Medium Medium Medium High Medium High Medium Medium Medium Medium Medium Medium 14 rows selected. If start_chr_count is negative then it will extract the substring from right end. 1 C -8 2 O -7 3 M -6 4 P -5 5 U -4 6 T -3 7 E -2 8 R -1 q) INSTR:. it will display nothing.1) INSTR('INFORMATION'. INSTR('INFORMATION'.'O'.4. search_str [. instr('information'. 31 . else). Syntax: instr (string.2) -----------------------------------------------------------------------4 10  If you are not specifying start_chr_count and occurrence then it will start search from the beginning and finds first occurrence only. Ex: SQL> select sal. it will checks for a match in a series of if/then tests.4. decode(sal.5000.'o'.'High'.'Medium') from emp.500.4. ««.4. start_chr_count [. occurrence] ]) Ex: SQL> select instr('information'.'o'. then1. if1.2) from dual. Syntax: decode (value. r) DECODE:. For every value of field.1).Decode will act as value by value substitution.This will allows you for searching through a string for set of characters.

string2.'saketh') from dual.'a'. 'c'). string2.  If any of the parameters is null it will display nothing. t) LEAST:This will give the least string.2. u) COALESCE:. 'b'. 'c'). string3 « stringn) Ex: SQL> select greatest('a'. Syntax: least (strng1. DECODE(1.'c').4.3.'srinu'.  If the number of parameters are even and different then decode will display last value.4. string3 « stringn) Ex: SQL> select coalesce('a'.'b') from dual.4.1.This will gives the first non-null string.-----------------------3 6  If the number of parameters are odd and different then decode will display nothing. Syntax: greatest (strng1.'b'. Syntax: coalesce (strng1. coalesce(null.3).2. string3 « stringn) Ex: SQL> select least('a'. s) GREATEST:.6) ----------------. decode(1.1.  If all the parameters are null then decode will display nothing. greatest('satish'.3. LEAST LEAST ------------a saketh  If all the parameters are nulls then it will display nothing.3) DECODE(1.6) from dual.SQL> select decode(1. 'b'. least('satish'. GREAT GREAT -------------c srinu  If all the parameters are nulls then it will display nothing.This will give the greatest string.null.'saketh') from dual.4.  If any of the parameters is null it will display nothing. string2. COALESCE ----------a COALESCE ----------a 32 .'srinu'.  If all the parameters are zeros then decode will display zero.

Least q. New_time t. To_char i.III. Extract o. Round r. Sessiontimezone h. Current_date c. To_date j. DATE FUNCTIONS :a. SQL> alter session set nls_date_format = µDD-MONTH-YYYY¶. Sysdate b. Months_between l. Systimestamp e. Ex: SQL> select sysdate from dual. Dbtimezone g. Next_day m. Add_months k. But this will expire once the session was closed. SYSDATE ----------24-DEC-06 33 . Trunc s. Localtimestamp f. Last_day n. Coalesce Oracle default date format is DD-MON-YY. We can change the default format to our desired format by using the following command. a) SYSDATE:This will give the current date and time. Current_timestamp d. Greatest p.

CURRENT_DATE -----------------24-DEC-06 c) CURRENT_TIMESTAMP:.44. LOCALTIMESTAMP -----------------------------------------------------24-DEC-06 03. Ex: SQL> select systimestamp from dual. Ex: SQL> select current_timestamp from dual.This will returns the value of the current session¶s time zone. Ex: SQL> select localtimestamp from dual.49.This will returns local timestamp in the active time zone information.b) CURRENT_DATE:Ex: This will returns the current date in the session¶s timezone.41. DBTIMEZONE ---------------07:00 g) SESSIONTIMEZONE:.502874 AM f) DBTIMEZONE:.This will returns the current database time zone in UTC format. (Coordinated Universal Time) Ex: SQL> select dbtimezone from dual. Ex: SQL> select sessiontimezone from dual.This will returns the current timestamp with the active time zone information. CURRENT_TIMESTAMP ------------------------------------------24-DEC-06 03.This will returns the system date.383369 AM +05:30 d) SYSTIMESTAMP:. SYSTIMESTAMP ----------------------------------------------------24-DEC-06 03.42. with no time zone information shown. SESSIONTIMEZONE ---------------------------+05:30 34 . SQL> select current_date from dual.31.830099 AM +05:30 e) LOCALTIMESTAMP:. including fractional seconds and time zone of the database.18.

The available date formats as follows. format) DATE FORMATS D DD DDD MM MON MONTH RM DY DAY Y YY YYY YYYY SYYYY I IY IYY IYYY Y. YYY YEAR CC Q W WW IW HH MI SS ----------------------------No of days in week No of days in month No of days in year No of month Three letter abbreviation of month Fully spelled out month Roman numeral month Three letters abbreviated day Fully spelled out day Last one digit of the year Last two digits of the year Last three digits of the year Full four digit year Signed year One digit year from ISO standard Two digit year from ISO standard Three digit year from ISO standard Four digit year from ISO standard Year with comma Fully spelled out year Century No of quarters No of weeks in month No of weeks in year No of weeks in year from ISO standard Hours Minutes Seconds 35 .This will be used to extract various date formats. Syntax: to_char (date.h) TO_CHAR:.

TO_CHAR (SYSDATE. TO_CHAR(SYSDATE.D or B. suppresses padding of month or day Suffix to a number suffix to a number to be spelled out Suffix combination of TH and SP to be both spelled out same as SPTH Ex: SQL> select to_char(sysdate.M AD or BC A.'DD MONTH YYYYHH:MI ---------------------------------------------------24 december 2006 02:03:23 pm sun SQL> select to_char(sysdate.C depending upon the date Prefix to month or day.'dd month year') from dual.M or P.'DD FMMONTH YEAR') ------------------------------------------------------24 december two thousand six SQL> select to_char(sysdate. TO_CHAR(SYSDATE.D or B.C FM TH SP SPTH THSP ----------- Fractional seconds Displays AM or PM depending upon time of day Displays A.M depending upon time of day Displays AD or BC depending upon the date Displays A.'ddspth DDSPTH') from dual.'ddth DDTH') from dual.'DDSPDDSPDDSP') -----------------------------------------------twenty-four Twenty-Four TWENTY-FOUR 36 . TO_CHAR(SYSDATE.M or P.'ddsp Ddsp DDSP ') from dual. TO_CHAR(S -----------24th 24TH SQL> select to_char(sysdate.FF AM or PM A.'dd fmmonth year') from dual. TO_CHAR(SYSDATE.'DDSPTHDDSPTH -----------------------------------------twenty-fourth TWENTY-FOURTH SQL> select to_char(sysdate.'dd month yyyy hh:mi:ss am dy') from dual.'DDMONTHYEAR') ------------------------------------------------------24 december two thousand six SQL> select to_char(sysdate.

'dd-mon-yyyy')) from dual. MONTHS_BETWEEN(TO_DATE('11-JAN-1990'.'DD-MON-YYYY')) ----------------------------------------------------------------------------------------------7 SQL> select months_between(to_date('11-jan-1990'. j) ADD_MONTHS:This will add the specified months to the given date.'DD-MON-YYYY'). Syntax: add_months (date. ADD_MONTHS ---------------11-JUN-90 SQL> select add_months(to_date('11-jan-1990'. Syntax: months_between (date1. TO_CHAR(TO_DATE('24/DEC/20 -------------------------24 * december * Sunday -.i) TO_DATE:- This will be used to convert the string into date format. k) MONTHS_BETWEEN:This will give difference of months between two dates. 'dd * month * day') from dual.  If no_of_months is null then it will display nothing.'DD-MON-YYYY'). -5) from dual.'dd-mon-yyyy'). 5) from dual. to_date('11-aug1990'.TO_DATE('11JAN-1990'.'dd-mon-yyyy').If you are not using to_char oracle will display output in default date format.'dd-mon-yyyy'). no_of_months) Ex: SQL> select add_months(to_date('11-jan-1990'.'dd/mon/yyyy').TO_DATE('11AUG-1990'.'DD-MON-YYYY')) -------------------------------------------------------------------------------------------------7 37 .'dd-mon-yyyy'). ADD_MONTH --------------11-AUG-89  If no_of_months is zero then it will display the same date. date2) Ex: SQL> select months_between(to_date('11-aug-1990'. Syntax: to_date (date) Ex: SQL> select to_char(to_date('24/dec/2006'.'dd-mon-yyyy')) from dual. MONTHS_BETWEEN(TO_DATE('11-AUG-1990'. to_date('11jan-1990'.

m) LAST_DAY:.l) NEXT_DAY:.This will give the least date.'dd-mon-yy')) from dual. Syntax: last_day (date) Ex: SQL> select last_day(to_date('24-dec-2006'.This will produce last day of the given date.'dd-mon-yy').to_date('11-apr-90'. Syntax: least (date1. Syntax: greatest (date1.This will produce next day of the given day from the specified date. Syntax: next_day (date. date3 « daten) Ex: SQL> select greatest(to_date('11-jan-90'.'dd-mon-yyyy')) from dual.'sun') from dual. NEXT_DAY( ------------31-DEC-06 -. o) GREATEST:.'dd-mon-yy'). LAST_DAY ( ------------31-DEC-06 n) EXTRACT:This is used to extract a portion of the date value.'dd-mon-yyyy').You can extract only one value at a time. date3 « daten) Ex: SQL> select least(to_date('11-jan-90'.'dd-mon-yy'). 'dd-monyy').to_date('11-mar- 90'. date) Ex: SQL> select extract(year from sysdate) from dual. date2. LEAST( ------------11-JAN-90 38 . date2.'dd-mon-yy')) from dual. GREATEST ( ------------11-APR-90 p) LEAST:. EXTRACT (YEARFROMSYSDATE) -----------------------------------2006 -. Syntax: extract ((year | month | day | hour | minute | second). day) Ex: SQL> select next_day(to_date('24-dec-2006'. to_date('11-apr-90'.If the day parameter is null then it will display nothing.to_date('11-mar-90'.This will give the greatest date.

If the you are not specifying the second parameter then round will resets the time to the begining of the current day in case of user specified date. 1 16 --15 31  If the day falls between 1 and 15 then it returns the first day of the current month.    If the second parameter was null then it returns nothing.q) ROUND:.Round will rounds the date to which it was equal to or greater than the given date.  If the second parameter was days then round will checks the week day of the given date in the following ranges. Syntax: round (date. SUN -WED SUN THU --  If the week day falls between SUN and WED then it returns the previous Sunday.  If the second parameter was month then round will checks the day of the given date in the following ranges.  If the day falls between 16 and 31 then it returns the first day of the next month.  If the month falls between JUL and DEC then it returns the first day of the next year.  If the weekday falls between THU and SUN then it returns the next Sunday. JAN JUL --JUN DEC  If the month falls between JAN and JUN then it returns the first day of the current year. (day | month | year)) If the second parameter was year then round will checks the month of the given date in the following ranges. If the you are not specifying the second parameter then round will resets the time to the begining of the next day in case of sysdate. 39 .

'dd-mon-yy'). 'dd mon yyyy hh:mi:ss am') from dual.'year'). ROUND(TO_ ROUND(TO_ ------------. round(to_date('18jan-04'.'year').'year') from dual.'dd-mon-yy'). round(to_date('11mar-06'. 'dd-mon-yy').'dd-mon-yy')). trunc(to_date('11mar-06'.  If the you are not specifying the second parameter then trunk will resets the time to the begining of the current day. (day | month | year))  If the second parameter was year then it always returns the first day of the current year.  If the second parameter was null then it returns nothing.  If the second parameter was day then it always returns the previous sunday. Syntax: trunc (date.'dd-mon-yy').'dd-mon-yy').'day'). round(to_date('29dec-06'.'month') from dual.-------------24-DEC-06 31-DEC-06 SQL> select to_char(round(to_date('24-dec-06'.'dd-mon-yy').'year') from dual. TO_CHAR(ROUND(TO_DATE(' --------------------------------24 dec 2006 12:00:00 am r) TRUNC:-Trunc will chops off the date to which it was equal to or less than the given date. ROUND (TO_ ROUND(TO_ -------------------------01-JAN-05 01-JAN-06 SQL> select round(to_date('11-jan-04'. ROUND(TO_ ROUND(TO_ -------------.  If the second parameter was month then it always returns the first day of the current month.-------------01-JAN-04 01-JAN-06 40 .'dd-mon-yy'). TRUNC(TO_ TRUNC(TO_ ------------.Ex: SQL> select round(to_date('24-dec-04'. Ex: SQL> select trunc(to_date('24-dec-04'.'day') from dual.--------------01-JAN-04 01-FEB-04 SQL> select round(to_date('26-dec-06'.'dd-mon-yy').'month').

trunc(to_date('18-jan-04'.'dd-mon-yy'). desired_timezone) Available timezones are as follows. trunc(to_date('29-dec06'. TIMEZONES AST/ADT BST/BDT CST/CDT EST/EDT GMT HST/HDT MST/MDT NST PST/PDT YST/YDT ----------Atlantic standard/day light time Bering standard/day light time Central standard/day light time Eastern standard/day light time Greenwich mean time Alaska-Hawaii standard/day light time Mountain standard/day light time Newfoundland standard time Pacific standard/day light time Yukon standard/day light time Ex: SQL> select to_char(new_time(sysdate. TO_CHAR(NEW_TIME(SYSDAT ----------------------------------24 dec 2006 02:51:20 pm 41 .'month') from dual.------------01-JAN-04 01-JAN-04 SQL> select trunc(to_date('26-dec-06'. Syntax: new_time (date.'day'). TRUNC(TO_ TRUNC(TO_ ------------.'dd-mon-yy').'dd mon yyyy hh:mi:ss am') from dual. TRUNC(TO_ TRUNC(TO_ ------------.'day') from dual. 'dd mon yyyy hh:mi:ss am') from dual.'yst').This will give the desired timezone¶s date and time.SQL> select trunc(to_date('11-jan-04'.'dd-mon-yy'). TO_CHAR(TRUNC(TO_DATE(' --------------------------------24 dec 2006 12:00:00 am s) NEW_TIME:.'month').'gmt'. 'dd-mon-yy').'dd-mon-yy')). current_timezone.-------------24-DEC-06 24-DEC-06 SQL> select to_char(trunc(to_date('24-dec-06'.

Syntax: coalesce (date1.'23-mar98'. vsize('12-jan-90') from dual.This will give the first non-null date. MISCELLANEOUS FUNCTIONS:1. TO_CHAR(NEW_TIME(SYSDAT ----------------------24 dec 2006 06:51:26 pm t) COALESCE:.'est'). COALESCE( COALESCE( ------------. Uid 2.null) from dual. coalesce(null.This will returns the login¶s user name.'12-jan-90'.'gmt'. Vsize a) UID:. Ex: SQL> select uid from dual. date3 « daten) Ex: SQL> select coalesce('12-jan-90'. User 3. USER ---------SAKETH c) VSIZE:Ex: This will return the number of bytes in the expression. vsize('computer').This will returns the integer value corresponding to the user currently logged in. VSIZE('12-JAN-90') ---------------------9 SQL> select vsize(123). UID ---------319 b) USER:. -----------------------------8 VSIZE(123) VSIZE('COMPUTER') ------------3 42 . date2.-----------12-jan-90 12-jan-90 IV.'dd mon yyyy hh:mi:ss am') from dual.'13-jan-99').SQL> select to_char(new_time(sysdate. Ex: SQL> select user from dual.

0) from dual. 4) TO_NUMBER:5) TO_CHAR:6) TO_DATE:This will convert a char or varchar to number. To_number 5. To_char 6.This will convert a character string to act like an internal oracle row identifier or rowid. Max 4. Count Group functions will be applied on all the rows but produces single output. Chartorowid 3.This will convert an internal oracle row identifier or rowid to character string. Min 5. This will convert a number or date to character string. CONVERSION FUNCTIONS:1. This will convert a number.1.V. To_date 1) BIN_TO_NUM:.   2) CHARTOROWID:. 3) ROWIDTOCHAR:. a) SUM:. Syntax: bin_to_num( binary_bits) Ex: SQL> select bin_to_num(1. Sum 2.This will give the sum of the values of the specified column. VI. Syntax: sum (column) Ex: SQL> select sum(sal) from emp. Rowidtochar 4. Bin_to_num 2. If all the bits are null then it produces an error. BIN_TO_NUM(1.This will convert the binary value to its numerical equivalent.1.0) -----------------------6 If all the bits are zero then it produces zero. 43 . char or varchar to a date. GROUP FUNCTIONS:1. Avg 3.

Check 44 .This will give the minimum of the values of the specified column.This will give the maximum of the values of the specified column. 1. Syntax: min (column) Ex: SQL> select min(sal) from emp. MIN(SAL) ---------500 e) COUNT:. Syntax: avg (column) Ex: SQL> select avg(sal) from emp. Domain integrity constraints a.14286 c) MAX:. Syntax: count (column) Ex: SQL> select count(sal). Syntax: max (column) Ex: SQL> select max(sal) from emp.count(*) from emp.This will give the count of the values of the specified column. COUNT(SAL) COUNT(*) -------------14 -----------14 CONSTRAINTS Constraints are categorized as follows. MAX(SAL) ---------5000 d) MIN:. Not null b. AVG(SAL) --------------2757.SUM(SAL) ---------38600 b) AVG:This will give the average of the values of the specified column.

This is used to insert the values based on specified condition. name varchar(10).after the table definition -. Entity integrity constraints I.2. marks number(3)).along with the column definition -. 45 . Ex: SQL> create table student(no number(2) not null. Referential integrity constraints Foreign key Constraints are always attached to a column not a table. We can add this constraint in all three levels. Unique II. name varchar(10). oracle will internally name the constraint. Column level Table level Alter level -. marks number(3)).  If you want to give a name to the constraint. marks number(3) constraint ch check(marks > 300)). name varchar(10). We can add this constraint in column level only. SQL> create table student(no number(2) . a) NOT NULL:. We can add constraints in three ways.This is used to avoid null values. SQL> create table student(no number(2) constraint nn not null. Primary key 3. you have to use the constraint clause. marks number(3) check (marks > 300)).using alter command  While adding constraints you need not specify the name but the type only. Ex: COLUMN LEVEL SQL> create table student(no number(2) . name varchar(10). b) CHECK:.

SQL> create table student(no number(2) . marks number(3). name varchar(10). marks number(3). SQL> alter table student add constraint un unique(no).TABLE LEVEL SQL> create table student(no number(2) . name varchar(10). check (marks > 300)). SQL> create table student(no number(2) constraint un unique. marks number(3).Primary key always attached to the parent table. marks number(3)). Ex: COLUMN LEVEL SQL> create table student(no number(2) unique. TABLE LEVEL SQL> create table student(no number(2) . unique(no)). name varchar(10). name varchar(10). name varchar(10). constraint ch check(marks > 300)). marks number(3)). 46 . II) PRIMARY KEY:-This is used to avoid duplicates and nulls. ALTER LEVEL SQL> alter table student add check(marks>300). This will work as combination of unique and not null. We can add this constraint in all three levels. name varchar(10). I) UNIQUE:.This is used to avoid duplicates but it allows nulls. marks number(3).We can add this constraint in all three levels. SQL> create table student(no number(2) . SQL> alter table student add constraint ch check(marks>300). constraint un unique(no)). ALTER LEVEL SQL> alter table student add unique(no).

ename varchar(10). III. foreign key(deptno) references dept(deptno)). marks number(3). 47 . deptno number(2). name varchar(10). constraint fk foreign key(deptno) references dept(deptno)). name varchar(10). constraint pk primary key(empno).Ex: COLUMN LEVEL SQL> create table student(no number(2) primary key. SQL> create table student(no number(2) . ALTER LEVEL SQL> alter table student add primary key(no). marks number(3). constraint pk primary key(no)). name varchar(10). SQL> create table emp(empno number(2). SQL> create table student(no number(2) constraint pk primary key. ALTER LEVEL SQL> alter table emp add foreign key(deptno) references dept(deptno). primary key(empno). FOREIGN KEY:. ename varchar(10).Foreign key always attached to the child table. Once the primary key and foreign key relationship has been created then you can not remove any parent record if the dependent Childs exist. TABLE LEVEL SQL> create table student(no number(2) . deptno number(2). name varchar(10). SQL> alter table student add constraint pk primary key(no). primary key(no)).We can add this constraint in table and alter levels only.This is used to reference the parent table primary key column which allows duplicates. SQL> alter table emp add constraint fk foreign key(deptno) references dept(deptno). marks number(3)). Ex: TABLE LEVEL SQL> create table emp(empno number(2). marks number(3)).

Ex: TABLE LEVEL SQL> create table emp(empno number(2). foreign key(deptno) references dept(deptno) on delete cascade). constraint fk foreign key(deptno) references dept(deptno) on delete cascade). name varchar(10). constraint un unique(no. ename varchar(10).USING ON DELETE CASCADE:. marks number(3). marks number(3).Because when ever you remove parent record oracle automatically removes all its dependent records from child table.name).name)). SQL> alter table student add constraint un unique(no. unique(no. constraint pk primary key(empno). SQL> alter table emp add constraint fk foreign key(deptno) references dept(deptno) on delete cascade. 48 .name). UNIQUE (ALTER LEVEL) SQL> alter table student add unique(no. deptno number(2). COMPOSITE KEYS:.A composite key can be defined on a combination of columns. We can define composite keys on entity integrity and referential integrity constraints. ename varchar(10). name varchar(10). if this clause is present while creating foreign key constraint.name)). Composite key can be defined in table and alter levels only. SQL> create table emp(empno number(2). primary key(empno). deptno number(2). SQL> create table student(no number(2) .By using this clause you can remove the parent record even it Childs exists. ALTER LEVEL SQL> alter table emp add foreign key(deptno) references dept(deptno) on delete cascade. Ex: UNIQUE (TABLE LEVEL) SQL> create table student(no number(2) .

primary key(empno). SQL> alter table student add constraint pk primary key(no. marks number(3). Deferred initially deferred Deferred initially immediate: .dname)).anme).dname). SQL> create table student(no number(2) . ename varchar(10). name varchar(10).dname)). constraint un unique(no) deferred initially immediate).dname) references dept(deptno. ename varchar(10).name)). Ex: SQL> create table student(no number(2). FOREIGN KEY (TABLE LEVEL) SQL> create table emp(empno number(2).Each constraint has two additional attributes to support deferred checking of constraints. FOREIGN KEY (ALTER LEVEL) SQL> alter table emp add foreign key(deptno. Deferred initially deferred: . deptno number(2). 49 . SQL> alter table emp add constraint fk foreign key(deptno. constraint fk foreign key(deptno.checks for constraint violation at the time of insert. marks number(3).dname) references dept(deptno. 1. deptno number(2). dname varchar(10). dname varchar(10). constraint pk primary key(no.dname). marks number(3). constraint pk primary key(empno). primary key(no. PRIMARY KEY (ALTER LEVEL) SQL> alter table student add primary key(no. DEFERRABLE CONSTRAINTS:.name).checks for constraint violation at the time of commit. name varchar(10). foreign key(deptno.dname) references dept(deptno. name varchar(10). Deferred initially immediate 2. SQL> create table emp(empno number(2).name)).dname) references dept(deptno.PRIMARY KEY (TABLE LEVEL) SQL> create table student(no number(2) .

This will remove the constraint.SQL> create table student(no number(2). Disable 3. This will not check for existing data while enforcing data. 50 . constraint un unique(no) deferred initially deferred). marks number(3). Enforce 4. This will enable all the constraints violations at the time of commit. Enable 2. Ex: SQL> alter table student enforce constraint un. DISABLE:. SQL> alter table student add constraint un unique(no) deferrable initially deferred. constraints automatically will drop. the constraint will check the existing data. Drop ENABLE:-This will enable the constraint. Before enable. ENFORCE:-This will enforce the constraint rather than enable for future inserts or updates. Ex: SQL> alter table student drop constraint un. Ex: SQL> alter table student enable constraint un. This will enable all the constraints violations at the time of inserting.This will disable the constraint. SQL> set constraints all immediate. Ex: SQL> alter table student disable constraint un. name varchar(10). DROP:. SQL> set constraints all deferred. Once the table is dropped.Possible operations with constraints as follows. 1. OPERATIONS WITH CONSTRAINTS:.

'a').name varchar(2)). Ex: SQL> create table student(no number(2) default 11. 51 . When you define a column with the default keyword followed by a value. on insert if a row was not assigned a value for this column. Case sal When 500 then µlow¶ When 5000 then µhigh¶ Else µmedium¶ End case From emp. DEFAULT:.Default can be considered as a substitute behavior of not null constraint when applied to new rows being entered into the table. SAL ----500 2500 2000 3500 3000 5000 4000 5000 1800 1200 2000 2700 2200 3200 CASE -------low medium medium medium medium high medium high medium medium medium medium medium medium 14 rows selected. SQL> insert into student values(1.Case is similar to decode but easier to understand while going through coding Ex: SQL> Select sal. Default is applied only during insertion of new rows. use the default value that you have specified.CASE AND DEFAULT CASE:. you are actually telling the database that.

'a'.'bang')).addr(222. CREATING ADT SQL> create type addr as object(hno number(3). chars and special characters something like this. µc¶). NO NAME -----.addr(333. You can define a custom type which holds your desired data. SQL> select * from student.SQL> insert into student(name) values('b').city varchar(10)). Ex: Suppose in a table we have address column which holds hno and city information.--------1 11 a b C -.'c'. ABSTRACT DATA TYPES Some times you may want type which holds all types of data including numbers.name varchar(2). SQL> insert into student values(3. We will define a custom type which holds both numeric as well as char data. / CREATING TABLE BASED ON ADT SQL> create table student(no number(2). NO NAME -----. INSERTING DATA INTO ADT TABLES SQL> insert into student values(1.'hyd')).address addr).'b'.addr(111. 52 . SQL> insert into student values(2.'delhi')).--------1 11 a b SQL> insert into student values(null. SQL> select * from student.Default can not override nulls. You can not achieve these using pre-defined types.

---------------1 2 3 a b c 111 222 333 hyd bang bombay DELETE WITH ADT TABLES SQL> delete student s where s.city from student s.---------------1 2 3 a b c 111 222 333 hyd bang delhi UPDATE WITH ADT TABLES SQL> update student s set s. SQL> select no.address.s.hno. NO NAME ADDRESS.----------------.----------------.HNO ADDRESS.------.s. 'delhi') SQL> select no. NO NAME ADDRESS.hno.address.name.CITY ---.address.address.CITY ---.CITY ---.------.HNO ADDRESS.s.SELECTING DATA FROM ADT TABLES SQL> select * from student.HNO ADDRESS.------. 'hyd') ADDR(222.address. NO NAME ADDRESS(HNO.address.------.address. 53 .---------------2 3 b c 222 333 bang bombay DROPPING ADT SQL> drop type addr.----------------.name.city from student s.address.hno.hno = 333. 'bang') ADDR(333.address. NO NAME ADDRESS.s. SQL> select no.city = 'bombay' where s.city from student s.hno = 111.name.s.------------------------1 2 3 a b c ADDR(111.s. CITY) --.

hno number(3).stud(name.marks number(3).wnds. 4) Now you can insert data into student table in two ways a) By regular insert SQL> Insert into student values(1.If you want to implement objects with the existing table.fnps)). Member function makrs_f(marks in number) return number.¶hyd¶).addr(111.You define the object and create a view which relates this object to the existing table nothing but object view. Ex: 1) Defining methods in types SQL> Create type stud as object(name varchar(10).wnps.¶sudha¶.¶hyd¶))). Ex: 1) Assume that the table student has already been created with the following columns SQL> create table student(no number(2).OBJECT VIEWS AND METHODS OBJECT VIEWS:. object views come into picture. 54 .city varchar(10)). b) By using object view SQL> Insert into student_ov values(1.111. 3) Relate the objects to the student table by creating the object view SQL> create view student_ov(no.address addr). Pragma restrict_references(marks_f.stud_info) as select no.name varchar(10).You can define methods which are nothing but functions in types and apply in the tables which hold the types.stud(µsudha¶.addr(hno. SQL> create type stud as object (name varchar(10).city)) from student. METHODS:. 2) Create the following types SQL> create type addr as object (hno number(2).city varchar(10)).rnds.Object views are used to relate the user defined objects to the existing table.

/ b) Varrays using user defined types SQL> Create type addr as object(hno number(3).info.info stud).address va). Ex: 1) We can create varrays using oracle types as well as user defined types. 5) Using method in select SQL> Select s. a) Varray using pre-defined types SQL> Create type va as varray(5) of varchar(10).A varying array allows you to store repeating attributes of a record in a single row but with limit.2) Defining type body SQL> Create type body stud as Member function marks_f(marks in number) return number is Begin Return (marks+100).100)). 3) Create a table using stud type SQL> Create table student(no number(2). 4) Insert some data into student table SQL> Insert into student values(1.name varchar(10). V-ARRAYS AND NESTED TABLES VARRAYS:. End.marks) from student s.city varchar(10)). 55 . Here we are using the pragma restrict_references to avoid the writes to the database.info.stud(µsudha¶./ 2) Using varray in table SQL> Create table student(no number(2).marks_f(s./ SQL> Create type va as varray(5) of addr. End marks_f.

SQL> Insert into student values(2. Nested table has the same effect of varrays but has no limit. This will display varray column data along with varray and adt.addr(222.name varchar(10).name. producing NESTED TABLES A nested table is./ SQL> Create type nt as table of addr.* you can specify the columns in varray SQL> Select no.city from student s1. s. 4) Selecting data from varray table SQL> Select * from student.* from student s1./ 2) Using nested table in table SQL> Create table student(no number(2). SQL> Select no.va(addr(111.table(s1.¶sudha¶.3) Inserting values into varray table SQL> Insert into student values(1.s.address nt) nested 56 . Update and delete not possible in varrays.¶bang¶))).city varchar(10)).hno. This will display in general format 5) Instead of s. In this case it is a table that is represented as a column within another table. a table within a table.address) s.address) s. table(s1. Ex:1) We can create nested tables using oracle types and user defined types which has no limit a) Nested tables using pre-defined types SQL> Create type nt as table of varchar(10)./ b) Nested tables using user defined types SQL> Create type addr as object(hno number(3).va(addr(111.¶jagan¶. Here we used table function which will take the varray column as input for output excluding varray and types.name.¶hyd¶). as its name implies.¶hyd¶))). s.

address) s. 8) Delete in nested table SQL> Delete table(select address from student where no=3) s where s. Flashbacks are of two types   Time base flashback SCN based flashback (SCN stands for System Change Number) Ex: 1) Using time based flashback a) SQL> Select *from student.name.s. table(s1. 3) Inserting values into table which has nested table SQL> Insert into student values (1. SQL> Insert into student values (2.¶sudha¶. s.¶hyd¶).city=¶bombay¶ where s.hno.table address store as student_temp. s.¶bang¶))). 4) Selecting data from table which has nested table SQL> Select * from student.city from student s1. -.This will display nested table column data along with nested table and adt.name.nt(addr(111. FLASHBACK QUERY Used to retrieve the data which has been already committed with out going for recovery. SQL> Select no.hno=333. -.nt(addr(111.This will display all the rows 57 .¶jagan¶. -. 6) Inserting nested table data to the existing row SQL> Insert into table(select address from student where no=1) values(addr(555.* from student s1. 7) Update in nested tables SQL> Update table(select address from student where no=2) s set s.* you can specify the columns in nested table SQL> Select no.¶chennai¶)).addr(222.address) s.This will display in general format 5) Instead of s.table(s1.hno = 222.¶hyd¶))).

enable_at_time(sysdate-2/1440) f) SQL> Select *from student. 58 .Here it will display the lost data -.enable_at_system_change_number(:s) SQL> Exec dbms_flashback. c) SQL> Commit. you define its structure and location with in oracle.disable -.b) SQL> Delete student. e) Then execute the following procedures SQL> Exec dbms_flashback. oracle reads the external table and returns the results just as if the data had been stored with in the database.When you query the table. -.disable -.The lost data will come but the current system time was used g) SQL> Exec dbms_flashback.Here we have to disable the flashback to enable it again EXTERNAL TABLES You can use external table feature to access external files as if they are tables inside the database.Here it will display nothing d) SQL> Select *from student. When you create an external table. -.this will commit the work.get_system_change_number c) To see the SCN SQL> Print s d) Then execute the following procedures SQL> Exec dbms_flashback. -.Here we have to disable the flashback to enable it again 2) Using SCN based flashback a) Declare a variable to store SCN SQL> Variable s number b) Get the SCN SQL> Exec :s := exec dbms_flashback.

To access external files from within oracle.´ ( deptno number(2). Loc varchar(13))) Location (µ/Visdb/visdb/9. SQL> Grant all on directory saketh_dir to saketh.¶ || dname || µ.lst SQL> Select deptno || µ. SQL> Conn saketh/saketh SQL> Spool dept.ACCESSING EXTERNAL TABLE DATA:.lst¶)).2.2. Dname varchar(14).0/dept. Dname varchar(14). 59 . SQL> Spool off CREATING EXTERNAL TABLE SQL> Create table dept_ext (deptno number(2). Ex: CREATING DIRECTORY AND OS LEVEL FILE SQL> Sqlplus system/manager SQL> Create directory saketh_dir as µ/Visdb/visdb/9.¶ || loc from dept. you must first use the create directory command to define a directory object pointing to the external file location Users who will access the external files must have the read and write privilege on the directory.0/external¶. Loc varchar (13)) Organization external (type oracle_loader Default directory saketh_dir Access parameters ( records delimited by newline Fields terminated by ³.

This will read from dept.The deref function performs opposite action. vendor_address varchar(10)). µb¶. and delete operations a) b) Indexing not possible Constraints not possible BENEFITS OF EXTERNAL TABLES a) Queries of external tables complete very quickly even though a full table scan id required with each access b) You can join external tables to each other or to standard tables REF DEREF VALUE REF:. still it displays the rows in general format.lst which is an operating system level file. VALUE:. µa¶. 3) insert the data into object tables SQL> insert into vendors values(1.To display the entire structure of the object. Ex:1) create vendor_adt type SQL> Create type vendor_adt as object (vendor_code number(2). µhyd¶). Each of the row objects has an object id value assigned to it. DEREF:. µbang¶). vendor_name varchar(2). this will be used. SQL> insert into vendors values(2.Even though the primary table is object table. The object id assigned can be seen by using ref function.The ref function allows referencing of existing row objects.SELECTING DATA FROM EXTERNAL TABLE SQL> select * from dept_ext. 60 . SQL> Create table vendors1 of vendor_adt. LIMITATIONS ON EXTERNAL TABLES a) You can not perform insert./ 2) create object tables vendors and vendors1 SQL> Create table vendors of vendor_adt. update. It takes a reference value of object id and returns the value of the row objects.

This will give the data without adt. SQL> insert into orders values(14. 4) create another table orders which holds the vendor_adt type also. µd¶. SQL> Create table orders (order_no number(2). This will give the columns data along wih the type. SQL>insert into orders values(11. to see the data along with the adt SQL>Select * from vendors. vendor_info ref vendor_adt). µchennai¶). 5) insert the data into orders table The vendor_info column in the following syntaxes will store object id of any table which is referenced by vendor_adt object ( both vendors and vendors1). SQL>Select value(v) from vendors v. to see the values SQL> Select deref(o.vendor_info) from orders o. vendor_info ref vendor_adt with rowid). µdelhi¶).SQL> insert into vendors1 values(3. 6) To see the object ids of vendor table SQL> Select ref(V) from vendors v.(select ref(v1) from vendors1 v1 where vendor_code =1)).(select ref(v1) from vendors1 v1 where vendor_code =1)).(select ref(v) from vendors v where vendor_code = 2)). 8) Even though the vendors table is object table it will not show the adt along with data. Or SQL> Create table orders (order_no number(2). 7) If you see the vendor_info of orders it will show only the object ids not the values. SQL>insert into orders values(12. SQL> insert into vendors1 values(4. µc¶.(select ref(v) from vendors v where vendor_code= 1)). SQL> insert into orders values(13. 61 .

SQL> insert into student2(11. what we can do? Simply drop the both tables and recreate with objects and ref constrains. c) Create the type SQL> create or replace type stud as object(no number(2).2).¶bombay¶.¶bang¶.marks number(3)).100). the orders table will store the object ids of vendors only because it is constrained to that table only.¶hyd¶. b) Insert the records into both tables SQL> insert into student1(1. SQL> insert into student2(12. The vendor_info column in the following syntaxes will store object ids of vendors only.marks number(3)).Ref can also acts as constraint.¶a¶. But you can achieve this with out dropping the tables and without losing the data by creating object views with references.name varchar(2). SQL> Create table student2(no number(2) primary key. vendor_info ref vendor_adt scope is vendors).333.id number(2).city varchar(10)./ 62 .1).222.200).111.hno number(3). Or SQL> Create table orders (order_no number(2). SQL> insert into student1(2.¶b¶. SQL> Create table orders (order_no number(2). OBJECT VIEWS WITH REFERENCES To implement the objects and the ref constraints to the existing tables. Ex: a) Create the following tables SQL> Create table student1(no number(2) primary key. SQL> insert into student2(13.REF CONSTRAINTS:. Even though vendors1 also holding vendor_adt.name varchar(2). vendor_info ref vendor_adt constraint fk references vendors).1).foreign Key(id) references student1(no)).

Partition independence allows for concurrent use of the various partitions for various purposes. failure of a particular partition will no way affect other partitions. which allows maintenance operations to be carried out on selected partitions while other partitions are available to users. Range partitions 2. Hash partitions 4. e) Generating references SQL>Create or replace view student2_ov as select no. d) Query the following SQL> select *from student1_ov.id) from student2_ov s. PARTITIONS A single logical table can be split into a number of physically separate pieces based on ranges of key values.make_ref (student1_ov.city.d) Generating OIDs SQL> Create or replace view student1_ov of stud with object identifier(or id) (no) as Select * from Student1.  Reducing downtime due to data failure. A non-partitioned table can not be partitioned later. SQ> select *from student2_ov. hno. SQL> select deref(s. List partitions 3. 63 . TYPES 1.id) id from Student2. SQL> select ref(s) from student1_ov s. SQL> select values(s) from student1_ov. Each of the parts of the table is called a partition. Sub partitions ADVANTAGES  Reducing downtime for scheduled maintenance.

this will go to p3 -. SQL> Insert into student values(31.¶c¶).name varchar(2)) partition by range(no) (partition p1 values less than(10). you can not add a partition. b) Inserting records into range partitioned table SQL> Insert into student values(1.this will go to p2 -. partition p2 values less than(20). Drop 3. -.ADVANTAGES OF PARTITIONS BY STORING THEM IN DIFFERENT TABLE SPACES  Reduces the possibility of data corruption in multiple partitions. SQL> Select *from student partition(p1).¶b¶). RANGE PARTITIONS a) Creating range partitioned table SQL> Create table student(no number(2).¶d¶).¶a¶). Rename 5. partition p3 values less than(30). SQL> Insert into student values(21. Exchange 64 . ** if you are using maxvalue for the last partition. Add 2. LOB types or object types. Split 6.partition p4 values less than(maxvalue)). Truncate 4.this will go to p4 c) Retrieving records from range partitioned table SQL> Select *from student. DISADVANTAGES Partitioned tables cannot contain any columns with long or long raw datatypes. Move 7.this will go to p1 SQL> Insert into student values(11. d) Possible operations with range partitions 1.  Back up and recovery of each partition can be done independently. -.

this will go to p4 65 .3.partition p3 values(11.12. partition p2 values(6. SQL> Insert into student values(16.5).e) Adding a partition SQL> Alter table student add partition p5 values less than(40).4.9.¶b¶).8. SQL> Insert into student values(6.15).17.2.this will go to p3 -.14.¶d¶). h) Truncate a partition SQL> Alter table student truncate partition p6.19. SQL> Select *from student partition(p1).13. -. partition p4 values(16. g) Renaming a partition SQL> Alter table student rename partition p3 to p6. f) Dropping a partition SQL> Alter table student drop partition p4. b) Inserting records into list partitioned table SQL> Insert into student values(1. k) Moving a partition SQL> Alter table student move partition p21 tablespace saketh_ts.this will go to p1 -. j) Exchanging a partition SQL> Alter table student exchange partition p1 with table student2.partition p22).18.name varchar(2)) partition by list(no) (partition p1 values(1. c) Retrieving records from list partitioned table SQL> Select *from student.10).7.¶c¶).¶a¶). i) Splitting a partition SQL> Alter table student split partition p2 at(15) into (partition p21. SQL> Insert into student values(11. LIST PARTITIONS:a) Creating list partitioned table SQL> Create table student(no number(2).20)).this will go to p2 -.

Exchange e) Adding a partition SQL> Alter table student add partition p5 values(21. f) Dropping a partition SQL> Alter table student drop partition p4. Here oracle automatically gives partition names like SYS_P1 SYS_P2 SYS_P3 SYS_P4 SYS_P5 66 .24.name varchar(2)) partition by hash(no) partitions 5. Add 2. h) Truncate a partition SQL> Alter table student truncate partition p6. HASH PARTITIONS:a) Creating hash partitioned table SQL> Create table student(no number(2). i) Exchanging a partition SQL> Alter table student exchange partition p1 with table student2.25).22. Move 6. Drop 3.d) Possible operations with list partitions 1. Truncate 4. j) Moving a partition SQL> Alter table student move partition p2 tablespace saketh_ts. Rename 5. g) Renaming a partition SQL> Alter table student rename partition p3 to p6.23.

c) Retrieving records from hash partitioned table SQL> Select *from student. Rename 4.¶d¶). SQL> Insert into student values(6. Exchange e) Adding a partition SQL> Alter table student add partition p6 .¶a¶). SUB-PARTITIONS WITH RANGE AND HASH:Subpartitions clause is used by hash only. h) Exchanging a partition SQL> Alter table student exchange partition sys_p1 with table student2. g) Truncate a partition SQL> Alter table student truncate partition p7. SQL> Select *from student partition(sys_p1).¶b¶). SQL> Insert into student values(11. SQL> Insert into student values(16. i) Moving a partition SQL> Alter table student move partition sys_p2 tablespace saketh_ts.b) Inserting records into hash partitioned table it will insert the records based on hash function calculated by taking the partition key SQL> Insert into student values(1. 67 . We can not create subpartitions with list and hash partitions. Add 2. d) Possible operations with hash partitions 1. Move 5. f) Renaming a partition SQL> Alter table student rename partition p6 to p7.¶c¶). Truncate 3.

This will create two partitions p1 and p2 with three subpartitions for each partition P1 ± SYS_SUBP1 SYS_SUBP2 SYS_SUBP3 P2 ± SYS_SUBP4 SYS_SUBP5 SYS_SUBP6 ** if you are using maxvalue for the last partition. you can not add a partition. -. b) Inserting records into subpartitioned table SQL> Insert into student values(1. c) Retrieving records from subpartitioned table SQL> Select *from student.this will go to p1 SQL> Insert into student values(11.a) Creating subpartitioned table SQL> Create table student(no number(2). SQL> Select *from student partition(p1).partition p2 values less than(20)).¶a¶).¶b¶). SQL> Select *from student subpartition(sys_subp1).name varchar(2).this will go to p2 68 . d) Possible operations with subpartitions  Add  Drop  Truncate  Rename  Split e) Adding a partition SQL> Alter table student add partition p3 values less than(30).marks number(3)) Partition by range(no) subpartition by hash(name) subpartitions 3 (Partition p1 values less than(10). -.

Columns used in select must be used with group by. we can create groups of related information.---------- 10 PRESIDENT 5000 69 .--------. g) Renaming a partition SQL> Alter table student rename partition p2 to p3. SUM(SAL) 1300 2450 6000 1900 2975 950 2850 5600 ---------.---------10 20 30 8750 10875 9400 SQL> select deptno. GROUP BY AND HAVING GROUP BY:. DEPTNO JOB 10 CLERK 10 MANAGER 20 ANALYST 20 CLERK 20 MANAGER 30 CLERK 30 MANAGER 30 SALESMAN 9 rows selected.Using group by.job. i) Splitting a partition SQL> Alter table student split partition p3 at(15) into (partition p31. h) Truncate a partition SQL> Alter table student truncate partition p1. Ex: SQL> select deptno. sum(sal) from emp group by deptno.sum(sal) from emp group by deptno. otherwise it was not a group by expression.partition p32).f) Dropping a partition SQL> Alter table student drop partition p3.job. DEPTNO SUM(SAL) ---------.

job having sum(sal) > ---------. SQL> Select deptno. Ex: SQL> select deptno. DEPTNO --------10 10 10 JOB ----CLERK MANAGER SUM(SAL) --------1300 2450 PRESIDENT 5000 70 .job.HAVING:. DEPTNO 20 10 30 JOB TSAL ---------6000 5000 5600 PRESIDENT ANALYST SALESMAN TSAL 5000 6000 5600 ---------.sum(sal) from emp group by rollup(deptno.--------- ANALYST PRESIDENT SALESMAN ORDER OF EXECUTION     Group the rows together based on group by clause. DEPTNO JOB 10 20 30 3000 order by job.sum(sal) tsal from emp group by deptno.job).This will give the salaries in each department in each job category along wih the total salary for individual departments and the total salary of all the departments.sum(sal) tsal from emp group by deptno.---------- SQL> select deptno. USING ROLLUP:.--------.job.job. Choose and eliminate the groups based on the having clause. Calculate the group functions for each group.job having sum(sal)> 3000. ROLLUP GROUPING CUBE These are the enhancements to the group by feature. Order the groups based on the specified column.This will work as where clause which can be used only with group by because of absence of where clause in group by.

10 20 20 20 20 30 30 30 30 13 rows selected.sum(sal) from emp group by rollup(deptno.job).job). CLERK MANAGER PRESIDENT All jobs ANALYST CLERK MANAGER All jobs CLERK MANAGER SALESMAN All jobs All jobs -------------1300 2450 5000 8750 6000 1900 2975 10875 950 2850 5600 9400 29025 71 .---------------------------------10 10 10 10 20 20 20 20 30 30 30 30 All Depts 13 rows selected.1.1.1.DEP DECODE(GR SUM(SAL) ----------------------------------. To replace these blanks with your desired string grouping will be used.decode(grouping(job).'All depts'.In the above query it will give the total salary of the individual departments but with a blank in the job column and gives the total salary of all the departments with blanks in deptno and job columns.'ALLDEPTS'.deptno). CLERK MANAGER SALESMAN ANALYST CLERK MANAGER 8750 6000 1900 2975 10875 950 2850 5600 9400 29025 USING GROUPING:. DECODE(GROUPING(DEPTNO). SQL> select decode(grouping(deptno). 'All jobs'.

job).sum(sal) from emp group by cube(deptno. the total salary for individual departments. the total salary of all the departments and the salaries in each job category.deptno).decode(grouping(job). DECODE(GROUPING(DEPTNO).¶All Jobs¶.¶All Depts¶. Grouping will be used in association with decode.DEP DECODE(GR SUM(SAL) ----------------------------------.job). CLERK MANAGER PRESIDENT All Jobs ANALYST CLERK MANAGER All Jobs CLERK MANAGER SALESMAN All Jobs ANALYST CLERK MANAGER PRESIDENT SALESMAN All Jobs 1300 2450 5000 8750 6000 1900 2975 10875 950 2850 5600 9400 6000 4150 8275 5000 5600 29025 SET OPERATORS TYPES Union Union all Intersect Minus 72 .1.This will give the salaries in each department in each job category. USING CUBE:.1.Grouping will return 1 if the column which is specified in the grouping function has been used in rollup.'ALLDEPTS'.-----------------------------------.-----------10 10 10 10 20 20 20 20 30 30 30 30 All Depts All Depts All Depts All Depts All Depts All Depts 18 rows selected.1. SQL> select decode(grouping(deptno).

This will give the common records of multiple tables having the same structure. Ex: SQL> select * from student1 minus select * from student2. INTERSECT:.This will combine the records of multiple tables having the same structure. TYPES  Simple view  Complex view Simple view can be created from one table where as complex view can be created from multiple tables. MINUS:. Ex: SQL> select * from student1 union all select * from student2. therefore a view can be thought of as a stored query or a virtual table. WHY VIEWS? 1. UNION ALL:. 73 . VIEWS  A view is a database object that is a logical representation of a table.  A view takes the output of the query and treats it as a table. Ex: SQL> select * from student1 union select * from student2. 2. Ex: SQL> select * from student1 intersect select * from student2. 3.This will combine the records of multiple tables having the same structure but including duplicates.UNION:.This will give the records of a table whose records are not in other tables having the same structure. Simplify commands for the user. Provides additional level of security by restricting access to a predetermined set of rows and/or columns of a table. Hide the data complexity. It is delivered from a table but has no storage of its own and often may be used in the same manner as a table.

delete possible (not always) 74 . Partition view f. delete possible   View with expression -. name. View with distinct Ex: SQL> Create view dept_v as select *from dept with read only.insert not possible -.name from student.  View was created but the base table has been altered but still the view was with the initial definition. we have to replace the view to affect the changes.delete possible  View with out not null column which was in base table -. sum(sal) t_sal from emp group by deptno. View with aggregate functions e. update not possible -. update not possible -. SQL> Create view dept_v as select deptno. Read only view b.insert not possible -.VIEWS WITHOUT DML:a.insert. SQL> Create view student as select *from student1 union select *from student2. SQL> Create view stud as select rownum no.insert . Complex view (view with more than one table) -.delete possible View with functions (except aggregate) -.update.insert with out not null column not possible -.update not null column to null is not possible -. VIEWS WITH DML  View with not null column -. View with rownum d. View with group by c.delete possible  View was created but the underlying table was dropped then we will get the message like ³view has errors´.update. SQL> Create view stud as select distinct no. marks from student.

Public Private synonym is available to the particular user who creates. ADVANTAGES   Hide the name and owner of the object. . view or sequence. SYNONYM AND SEQUENCE SYNONYM A synonym is a database object. SQL> drop synonym s1.Update possible excluding marks column .Delete possible DROPPING VIEWS SQL> drop view dept_v. Private b. TYPES a. 75 . Public synonym is created by DBA which is available to all the users. CREATE AND DROP SQL> create synonym s1 for emp.Insert possible with marks value as 500 . SQL> create public synonym s2 for emp. Provides location transparency for remote objects of a distributed database. -.CREATING VIEW WITHOUT HAVING THE BASE TABLE SQL> Create force view stud as select * from student. VIEW WITH CHECK OPTION CONSTRAINT SQL> Create view stud as select *from student where marks = 500 with check option constraint Ck.Once the base table was created then the view is validated. which is used as an alias for a table.

SQL> create sequence s increment by 10 start with 100 minvalue 5 maxvalue 200 cycle cache 20. sequential integer values.It can be used to automatically generate primary key or unique key values.nextval || translate (s. increments by 1 with minvalue of 1 and with nocycle.   Initially currval is not defined and nextval is starting value. Change the increment value. 76 . Change the number of cached sequence numbers. CREATING ALPHA-NUMERIC SEQUENCE SQL> create sequence s start with 111234. Syntax: Create sequence <seq_name> [increment by n] [start with n] [maxvalue n] [minvalue n] [cycle/nocycle] [cache/nocache]. nocache. SQL> insert into student values(s.nextval. which can generate unique. A sequence can be either in an ascending or descending order. Set or eliminate minvalue of maxvalue. ¶1234567890¶. ¶abcdefghij¶)). ALTERING SEQUENCE     We can alter the sequence to perform the following.name varchar(10)). Cache option pre-allocates a set of sequence numbers and retains them in memory for faster access. After that nextval and currval are always equal. µsaketh¶).SEQUENCE:-A sequence is a database object. By default the sequence starts with 1. USING SEQUENCE SQL> create table student(no number(2). Ex: SQL> create sequence s. SQL> Insert into student values (s.nextval.

Inner join 9. Equi join 3. Self join 5. A join is actually performed by the where clause which combines the specified rows of tables. Right outer c. Outer join a. Full outer 8. On clause Assume that we have the following tables. SQL> alter sequence s cache 10. DEPTNO -----10 20 30 DNAME ---------mkt fin hr LOC ---------hyd bang Bombay 77 . TYPES 2. 1. Using clause 10. JOINS The purpose of a join is to combine the data across tables.Ex: SQL> alter sequence s minvalue 5. SQL> select * from dept. Left outer b.If a join involves in more than two tables then oracle joins first two tables based on the joins condition and then compares the result with the next table and so on. Cross join 7. Non-equi join 4. SQL> alter sequence s increment by 2. DROPPING SEQUENCE: SQL> drop sequence s. Natural join 6.

Ex: SQL>select empno.SQL> select * from emp.A join which contains an µ=¶ operator in the joins condition.---------.deptno.dname.deptno from emp e.---------. EMPNO ENAME 111 222 333 444 saketh sudha jagan madhu JOB 444 333 111 222 MGR DEPTNO 10 20 10 40 ---------.---------.---------.ename.dname. EMPNO 111 333 222 ENAME saketh jagan sudha JOB analyst clerk DNAME mkt fin hyd hyd bang LOC ENAME saketh jagan sudha JOB analyst clerk DNAME mkt fin hyd hyd bang LOC ENAME saketh jagan sudha JOB analyst clerk DNAME mkt fin hyd hyd bang LOC ---------.job. EMPNO 111 333 222 USING CLAUSE SQL> select empno.job .---------.ename.---------. EMPNO 111 333 222 ON CLAUSE SQL>select empno.job. 78 .loc from emp e join dept d on(e.---------.---------.---------.---------.deptno=d.deptno=d.---------analyst clerk manager engineer 1) EQUI JOIN:.dname.ename.loc from emp e join dept d using(deptno).---------.loc.---------manager mkt 2)NON-EQUI JOIN A join which contains an operator other than µ=¶ in the joins condition.---------manager mkt ---------.dept d where e.---------.deptno).---------manager mkt ---------.

---------.deptno from emp e1. Ex: SQL> select empno.e2. EMPNO 111 222 333 444 ENAME jagan madhu sudha saketh JOB DEPTNO 10 40 20 10 ---------.e2. loc from emp cross join dept.---------.ename.deptno > d.---------analyst clerk manager engineer 4) NATURAL JOIN: .---------.ename. EMPNO ENAME 111 222 333 JOB mkt mkt DNAME hyd hyd hyd LOC ---------. ename.---------. Ex: SQL> select empno.mgr. job.Ex: SQL> select empno.---------.Joining the table itself is called self join.job.---------. EMPNO 222 444 444 444 ENAME clerk JOB mkt DNAME hyd hyd bang bombay LOC ---------.empno.Natural join compares all the common columns.---------.---------.deptno.emp e2 where e1.loc from emp natural join dept.ename.empno=e2. dname.---------hyd hyd bang manager mkt 5) CROSS JOIN: - This will gives the cross product.job.---------sudha madhu madhu madhu engineer mkt engineer fin engineer hr 3) SELF JOIN:.---------.job.---------. EMPNO ENAME 111 333 222 saketh jagan sudha JOB analyst clerk DNAME mkt fin LOC ---------.loc from emp e.---------.---------saketh analyst sudha clerk jagan manager mkt 79 .e1.dname.dept d where e. Ex: display the employ details who are the managers SQL> select e1.dname.

Ex: SQL> select empno. 80 .dname.loc from emp e left outer join dept d on(e.loc from emp e right outer join dept d on (e.ename.dname. Or SQL> select empno.This will display the all matching records and the records which are in right hand side table those that are not in left hand side table.deptno.deptno(+) = d.444 111 222 333 444 111 222 333 444 madhu engineer mkt saketh analyst sudha clerk jagan fin fin hyd bang bang bang bang bombay bombay bombay bombay manager fin hr hr madhu engineer fin saketh analyst sudha clerk jagan manager hr madhu engineer hr 12 rows selected.loc from emp e.job.deptno).deptno(+).ename.deptno). Or SQL> select empno.dname.job.job.dept d where e. Ex: SQL> select empno. EMPNO 111 333 222 444 ENAME JOB saketh jagan sudha madhu analyst manager clerk engineer DNAME mkt mkt fin LOC hyd hyd bang ---------.deptno=d.dept d where e.---------- b) RIGHT OUTER JOIN:.deptno=d.deptno=d.ename.dname.---------.job.ename.---------. a) LEFT OUTER JOIN :-This will display the all matching records and the records which are in left hand side table those that are not in right hand side table. 6) OUTER JOIN Outer join gives the non-matching records along with matching records.---------.loc from emp e.

Nesting of queries.---------.deptno=d.job.---------manager mkt c) FULL OUTER JOIN:.EMPNO 111 333 222 ENAME saketh jagan sudha JOB analyst clerk DNAME mkt fin hr LOC hyd hyd bang bombay ---------. Ex: SQL> select empno.---------.job. Multi row subqueries 3.---------hyd hyd bang manager mkt SUBQUERIES AND EXISTS SUBQUERIES:.---------manager saketh analyst sudha clerk madhu engineer 7) INNER JOIN :-This will display all the records that have matched. Ex: SQL> select empno.---------. A statement containing a subquery is called a parent query.---------.dname.dname.---------. Subqueries are used to retrieve data from tables that depend on the values in the table itself.deptno). Single row subqueries 2.---------.loc from emp e full outer join dept d on(e. one within the other is termed as a subquery. EMPNO 111 333 222 ENAME JOB saketh jagan sudha analyst clerk DNAME mkt fin LOC ---------.ename.---------. Correlated subqueries 81 .ename.---------. Multiple subqueries 4.---------. EMPNO ENAME 333 111 222 444 jagan JOB DNAME mkt mkt fin hr hyd hyd bang bombay LOC ---------.This will display the all matching records and the nonmatching records from both tables.loc from emp inner join dept using(deptno). TYPES 1.

it will return more than one value. EMPNO 7839 ENAME KING JOB MGR HIREDATE 17-NOV-81 SAL COMM DEPTNO 10 ENAME JOB MGR HIREDATE SAL COMM 20 20 10 20 DEPTNO ---------.---------.---------.---------. It allows nesting of a query within a subquery.---------PRESIDENT 5000 MULTIPLE SUBQUERIES:.--------. the comparision operator and the subquery.-----.--------. SINGLE ROW SUBQUERIES :. Ex: SQL> select * from emp where sal > any (select sal from emp where sal between 2500 and 4000).In multi row subquery.---------. not in. JOB MGR HIREDATE SAL COMM DEPTNO 20 10 20 EMPNO ENAME 7788 7839 7902 ---------.There is no limit on the number of subqueries included in a where clause.---------.-----------. in.---------.---------3000 3000 20 20 DEPTNO ---------- SCOTT ANALYST 7566 ANALYST 7566 82 .--------FORD MGR ---------HIREDATE SAL COMM -----------19-APR-87 03-DEC-81 ------. it will return one value.----------. EMPNO ---------7788 7902 ENAME JOB ---------.---------.1.In single row subquery. all.------. Ex: SQL> select * from emp where sal > (select sal from emp where empno = 7566).-------. EMPNO 7566 7788 7839 7902 and 4000).---------SCOTT ANALYST KING FORD PRESIDENT ANALYST 7566 19-APR-87 3000 17-NOV-81 5000 7566 03-DEC-81 3000 2. Ex: SQL> select * from emp where sal = (select max(sal) from emp where sal < (select max(sal) from emp)). between. MULTI ROW SUBQUERIES:.------------.---------JONES MANAGER 7839 02-APR-81 2975 SCOTT ANALYST KING FORD PRESIDENT ANALYST 7566 19-APR-87 7566 03-DEC-81 3000 3000 17-NOV-81 5000 SQL> select * from emp where sal > all (select sal from emp where sal between 2500 ---------. In such cases we should include operators like any.---------.--------.---------.

ename from emp e1 where exists (select * from emp e2 where e1. SQL> select deptno. DEPTNO COUNT(*) --------20 30 ---------5 6 From the above query can you want to display the names of employees? SQL> select deptno.deptno having count(e2. This is a logical test for the return of rows from a query. no rows selected The above query returns nothing because combination of deptno and ename never return more than one count.ename.Exists function is a test for existence.deptno=e2.---------20 20 20 ADAMS FORD JONES 83 .ename having count(*) > 4.A subquery is evaluated once for the entire parent statement where as a correlated subquery is evaluated once for every row processed by the parent statement.CORRELATED SUBQUERIES:. The solution is to use exists which follows. DEPTNO ---------20 30 EXISTS:.deptno = deptno). Ex: SQL> select distinct deptno from emp e where 5 <= (select count(ename) from emp where e.deptno group by e2. count(*) from emp group by deptno.ename) > 4) order by deptno.ename. DEPTNO ENAME ---------. Ex: Suppose we want to display the department numbers which has more than 4 employees.count(*) from emp group by deptno having count(*) > 4. SQL> select deptno.

level from emp start with ename = 'KING' connect by prior empno=mgr. DEPTNO ENAME --------.ename) > 4) order by deptno.ename from emp e1 where not exists (select * from emp e2 where e1.---------10 10 10 CLARK KING MILLER WALKUP TREES AND INLINE VIEW WALKUP TREES:-Using hierarchical queries.20 20 30 30 30 30 30 30 NOT EXISTS SCOTT SMITH ALLEN BLAKE JAMES MARTIN TURNER WARD 11 rows selected. However. you can retrieve data based on a natural hierarchical relationship between rows in a table. SQL> select deptno. Ex: SQL> select ename || '==>' || prior ename. a process called tree walking enables the hierarchy to be constructed.deptno group by e2. where a hierarchical relationship exists between the rows of a table. ENAME||'==>'||PRIORENAM KING==> JONES==>KING SCOTT==>JONES ADAMS==>SCOTT FORD==>JONES SMITH==>FORD 1 2 3 4 3 4 LEVEL -----------------------------------.-------- 84 .deptno having count(e2.ename.deptno=e2.

In the select statement instead of table name. rownum rank from (select *from emp order by sal).---------- 14 rows selected.---------. INLINE VIEW OR TOP-N ANALYSIS:. sal. Level pseudo column gives the 1 for root . 2 3 3 3 3 3 2 3 In the above Start with clause specifies the root row of the table. 2 for child and so on. Ex: SQL> Select ename. 85 . Connect by prior clause specifies the columns which has parent-child relationship. SAL 800 950 1100 1250 1250 1300 1500 1600 2450 2850 2975 3000 3000 5000 RANK 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ENAME SMITH JAMES ADAMS WARD MARTIN MILLER TURNER ALLEN CLARK BLAKE JONES SCOTT FORD KING ---------.BLAKE==>KING ALLEN==>BLAKE WARD==>BLAKE MARTIN==>BLAKE TURNER==>BLAKE JAMES==>BLAKE CLARK==>KING MILLER==>CLARK 14 rows selected. replacing the select statement is known as inline view.

LOCKS Locks are the mechanisms used to prevent destructive interaction between users accessing same resource simultaneously. b) SHARE UPDATE LOCK:. Row level locks 2. update or even lock other rows in the same table. 86 . This can be done by using select for update clause. Ex:SQL> lock table emp in share mode. insert. TABLE LEVEL LOCKS:-A table level lock will protect table data thereby guaranteeing data integrity when data is being accessed concurrently by multiple users. It is similar to share lock but only one user can place exclusive lock on a table at a time. Table level locks 1. Multiple users can place share locks on the same resource at the same time. update or delete rows in a table. When issued by any user. Ex: SQL> lock table emp in share exclusive mode.In the row level lock a row is locked exclusively so that other cannot modify the row until the transaction holding the lock is committed or rolled back. a) Share lock b) Share update lock c) Exclusive lock a) SHARE LOCK:. It permits other users to concurrently query. it allows the other user to only query. It prevents the other users from updating the row that has been locked. ROW LEVEL LOCKS:. A table lock can be held in several modes. 2. Locks provide high degree of data concurrency.It locks rows that are to be updated in a table. Ex: SQL> select * from emp where sal > 3000 for update of comm. TYPES 1.A share lock locks the table allowing other users to only query but not insert. c) EXCLUSIVE LOCK:-Exclusive lock is the most restrictive of tables lock. Ex: SQL> lock table emp in share update mode.

the first user has to wait for the second user to release the lock. Object index 10. Index organized table 87 . on columns that are likely to appear in where clauses as simple equality. Bitmap index 5. Non-unique index 3. INDEXES Index is typically a listing of keywords accompanied by the location of information on a subject. Reverse key index 7. Function-based index 8. DEADLOCK:-A deadlock occurs when two users have a lock each on separate object. The index points directly to the location of the rows containing the value. Unique index 2. but the second user will not release it until the lock on the first user¶s object is freed. TYPES 1. Domain index 9.NOWAIT If one user locked the table without nowait then another user trying to lock the same table then he has to wait until the user who has initially locked the table issues a commit or rollback statement. In such a case. Btree index 4. When this happens. Text index 12. WHY INDEXES? Indexes are most useful on larger tables. Composite index 6. This delay could be avoided by appending a nowait clause in the lock table command. oracle detects the deadlock automatically and solves the problem by aborting one of the two transactions. and they want to acquire a lock on the each other¶s object. Ex: SQL> lock table emp in exclusive mode nowait. We can create indexes explicitly to speed up SQL statement execution on a table. Cluster index 11.

88 . BTREE INDEX:-The default type of index used in an oracle database is the btree index. REVERSE KEY INDEX:. A btree index is designed to provide both rapid access to individual rows and quick access to groups of rows within a range. UNIQUE INDEX:-Unique indexes guarantee that no two rows of a table have duplicate values in the columns that define the index. sname). Global prefixed Global non-prefixed 1. Ex: SQL> create index stud_ind on student(sno). 3. 2. Ex: SQL> create unique index stud_ind on student(sno). Local prefixed ii. Local index i. The btree index does this by performing a succession of value comparisons. Such an arrangement can help avoid performance degradations in indexes. ii. NON-UNIQUE INDEX:-Non-Unique indexes do not impose the above restriction on the column values. 5. Local non-prefixed b.13. 4. Partition index a. Unique index is automatically created when primary key or unique constraint is created. Ex: SQL> create bitmap index stud_ind on student(sex). 6. BITMAP INDEX:-This can be used for low cardinality columns: that is columns in which the number of distinct values is small when compared to the number of the rows in the table. Ex: SQL> create index stud_ind on student(sno).A reverse key index when compared to standard index reverses each byte of the column being indexed while keeping the column order. COMPOSITE INDEX:-A composite index also called a concatenated index is an index created on multiple columns of a table. Columns in a composite index can appear in any order and need not be adjacent columns of the table. Global index i. Each comparison eliminates many of the rows. Ex: SQL> create bitmap index stud_ind on student(sno.

We can rebuild a reverse key index into normal index using the noreverse keyword. reverse). Ex: SQL> create table student (sno number(2).job. Or SQL> Select empno.comm. SQL> Select *from emp where rowid = (select max(rowid) from emp where rownum <= 4).job.deptno). mgr.sal. Ex: SQL> create index stud_ind on student(upper(sname)).sal. IMP QUERIES 1) To find the nth row of a table Or SQL> Select *from emp where rownum <= 4 minus select *from emp where rownum <= 3. Or SQL>select * from(select rownum r. comm. INDEX-ORGANIZED TABLE:.sal.This will use result of the function as key instead of using column as the value for the key.comm . 89 .sname varchar(10).Ex: SQL> create index stud_ind on student(sno.job. count(*) from emp group by empno.r=&n. job. SQL> Select *from emp where rowid in (select max(rowid) from emp group by empno.hiredate.An index-organized table keeps its data sorted according to the primary key column values for the table. hiredate. deptno. Index-organized tables store their data as if the entire table was stored in an index.ename.ename.hiredate. FUNCTION BASED INDEX:. 2) To find duplicate rows ename.smarks number(3) constraint pk primary key(sno) organization index.ename. 7. 3) To delete duplicate rows SQL> Delete emp where rowid in (select max(rowid) from emp group by empno. sal). Ex: SQL> alter index stud_ind rebuild noreverse.* from emp e) a where a.e. An index-organized table allows you to store the entire table¶s data in an index.comm having count(*) >=1.mgr. 8.hiredate.

sal). 8) To reset the time to the beginning of the day SQL> Select to_char(trunc(sysdate).count(*) from emp group by deptno having count(*) >2500. 9) To find nth maximum sal SQL> Select *from emp where sal in (select max(sal) from (select *from emp order by sal) where rowum <= 5). 7) How to get number of employees in each department .4) To find the count of duplicate rows SQL> Select ename. 5) How to display alternative rows in a table? SQL> select *from emp where (rowid. count(*) from emp group by ename having count(*) >= 1. Or SQL>select * from emp where &n=(select count(disitent sal) from emp e where sal>=e. 6) Getting employee details of each department who is drawing maximum sal? SQL> select *from emp where (deptno.max(sal) from emp group by deptno).sal) in ( select deptno.¶dd-mon-yyyy hh:mi:ss am¶) from dual.2) from emp).mod(rownum.0) in (select rowid. in which department is having more than 2500 employees? SQL> Select deptno. 90 .

In the above declarative and exception sections are optional. Ex: <<my_block>> BEGIN Dbms_output. 91 .exception section End.PL/SQL INTRODUCTION The basic unit in any PL/SQL program is block. END. Ex: BEGIN Dbms_output. 2) NAMED BLOCKS:a) LABELED BLOCKS:. BLOCK TYPES 1) Anonymous blocks 2) Named blocks a) Labeled blocks b) Subprograms c) Triggers 1) ANONYMOUS BLOCKS:. All PL/SQL programs are composed of blocks which can occur sequentially or nested.Labeled blocks are anonymous blocks with a label which gives a name to the block. END.An anonymous block implies basic block structure.put_line(µMy first program¶).executable section Exception -.put_line(µMy first program¶).declarative section Begin -. BLOCK STRUCTURE Declare -.

BEGIN dbms_output. including letters. They are ignored by the PL/SQL compiler. underscores. as part of package or as methods of an object type. cursors. dollar signs.put_line('a = ' || a). IDENTIFIERS:-Identifiers are used to name PL/SQL objects. NESTED BLOCKS:-A block can be nested within the executable or exception section of an outer block. They can be stored in the database as stand-alone objects. numbers. END. include characters such as spaces or use a reserved word. Identifiers consists of a letter.If you want to make an identifier case sensitive.put_line('A = ' || A). and pound signs only. "A" number := 6. optionally followed by any sequence of characters. c) TRIGGERS:-A trigger consists of a PL/SQL block that is associated with an event that occurs in the database. Single line comments 2.b) SUBPROGRAMS:-Subprograms are procedures and functions. such as variables. Multiline comments 92 . types and subprograms. dbms_output. The maximum length for an identifier is 30 characters. Ex: DECLARE "a" number := 5. 1. you can enclose the identifier in double quotation marks. Output: a=6 A=6 COMMENTS:-Comments improve readability and make your program more understandable. QUOTED IDENTIFIERS:. There are two types of comments available.

Ex: BEGIN Dbms_output.put_line(µhello¶). Subtype t_number is number. END. VARIABLE DECLERATIONS Variables can be declared in declarative section of the block. c number default 6. 2) MULTILINE COMMENTS:Multiline comments start with the /* delimiter and ends with */ delimiter. Ex: BEGIN Dbms_output.1) SINGLE LINE COMMENTS:-A single-line comment can start any point on a line with two dashes and continues until the end of the line. V_sno t_sno. Ex: DECLARE dno dept.deptno%type. d number constant := 7.put_line(µhello¶).sample program 93 . a t_number. Ex:DECLARE a number. ANCHORED DECLERATIONS PL/SQL offers two kinds of achoring. END. Subtype t_sno is student. b number := 5. /* sample program */ -. 1) Scalar anchoring 2) Record anchoring 1) SCALAR ANCHORING:-Use the %TYPE attribute to define your variable based on table¶s column of some other PL/SQL scalar variable.sno%type.

Characters and dates VARIABLE SCOPE AND VISIBILITY :-The scope of a variable is the portion of the program in which the variable can be accessed. Characters and numbers 2.Use the %ROWTYPE attribute to define your record structure based on a table. 1. Ex: DECLARE V_dept dept%rowtype. this is from the variable declaration until the end of the block. PL/SQL can automatically convert between 1. END. IMPLICIT CONVERSION PL/SQL will automatically convert between datatype families when possible.2) SCALAR ANCHORING:. 94 . oracle will automatically converts the numeric data into char type assigns to the variable. the PL/SQL engine will free the memory used to store the variable. BEGIN select deptno into a from dept where dname='ACCOUNTING'. Implicit conversion EXPLICIT CONVERSION This can be done using the built-in functions available. For PL/SQL variables. When a variable goes out of scope. Conversion can be done in two ways. In the above variable ³a´ is char type and deptno is number type even though. Explicit conversion 2. Ex: DECLARE a varchar(10). DATATYPE CONVERSIONS PL/SQL can handle conversions between different families among the datatypes.

a . If it is out of scope. Ex3: <<my_block>> DECLARE a number. Ex1: DECLARE a number. ----END.scope of a 95 . BEGIN -.a and char type b is available here END. b number.a . The visibility is always within the scope.The visibility of a variable is the portion of the program where the variable can be accessed without having to qualify the reference. BEGIN -------DECLARE b number. b available here -. it is not visible. b available here DECLARE b char(10). -----END. BEGIN -. BEGIN -. Ex2: DECLARE a number. -.scope of b BEGIN ----END. b number.

b END.number type b is available using <<my_block>>. 96 . «« Else Sequence of statements. 1) If-then-else 2) Case a) Case with no else b) Labeled case c) Searched case 3) Simple loop 4) While loop 5) For loop 6) Goto and Labels 1) IF-THEN-ELSE Syntax: If <condition1> then Sequence of statements. BEGIN -.a and char type b is available here -. End if. -----END. PL/SQL CONTROL STRUCTURES PL/SQL has a variety of control structures that allow you to control the behaviour of the block as it runs.DECLARE b char(10). Elsif <condition1> then Sequence of statements. These structures include conditional statements and loops.

end if. if dno = 10 then dbms_output. elsif dno = 30 then dbms_output.Ex: DECLARE dno number(2). case dno when 10 then dbms_output. When value2 then sequence of statements. «« When valuen then sequence of statements. elsif dno = 20 then dbms_output. when 20 then dbms_output.put_line('Location is DALLAS').put_line('Location is CHICAGO'). BEGIN select deptno into dno from dept where dname = 'ACCOUNTING'. Output: 2) CASE Syntax: Case test-variable When value1 then sequence of statements. END.put_line('Location is DALLAS'). BEGIN select deptno into dno from dept where dname = 'ACCOUNTING'.put_line('Location is NEW YORK'). Else sequence of statements. Location is NEW YORK 97 . End case. else dbms_output. Ex: DECLARE dno number(2).put_line('Location is NEW YORK').put_line('Location is BOSTON').

end case. Ex: DECLARE dno number(2).put_line('Location is NEW YORK'). Output: Location is NEW YORK a) CASE WITHOUT ELSE Syntax: Case test-variable When value1 then sequence of statements. Output: Location is NEW YORK b) LABELED CASE Syntax: <<label>> Case test-variable 98 . «« When valuen then sequence of statements. End case. else dbms_output. case dno when 10 then dbms_output. when 20 then dbms_output.put_line('Location is DALLAS'). END. when 30 then dbms_output.put_line('Location is BOSTON'). BEGIN select deptno into dno from dept where dname = 'ACCOUNTING'. when 40 then dbms_output.put_line('Location is CHICAGO').put_line('Location is BOSTON'). When value2 then sequence of statements. end case.when 30 then dbms_output. END.put_line('Location is CHICAGO').

when 20 then dbms_output. When <condition2> then sequence of statements. Ex: DECLARE dno number(2). END.put_line('Location is NEW YORK'). Ex: DECLARE dno number(2). end case my_case. End case. case dno 99 . When value2 then sequence of statements. BEGIN select deptno into dno from dept where dname = 'ACCOUNTING'. «« When valuen then sequence of statements. BEGIN select deptno into dno from dept where dname = 'ACCOUNTING'.When value1 then sequence of statements. <<my_case>> case dno when 10 then dbms_output. when 30 then dbms_output. «« When <conditionn> then sequence of statements.put_line('Location is BOSTON').put_line('Location is CHICAGO').put_line('Location is DALLAS'). End case. when 40 then dbms_output. Output: Location is NEW YORK c) SEARCHED CASE Syntax: Case When <condition1> then sequence of statements.

end case.when dno = 10 then dbms_output. END.put_line('Location is CHICAGO'). END. when dno = 30 then dbms_output. when dno = 40 then dbms_output. Output: Location is NEW YORK 3) SIMPLE LOOP Syntax: Loop Sequence of statements.put_line('i = ' || i). End if.put_line('Location is BOSTON').put_line('Location is NEW YORK'). Output: i=1 i=2 i=3 i=4 i=5 100 . Exit when <condition>. i := i + 1. Ex: DECLARE i number := 1.put_line('Location is DALLAS'). when dno = 20 then dbms_output. End loop. BEGIN loop dbms_output. end loop. exit when i > 5. In the syntax exit when <condition> is equivalent to If <condition> then Exit.

END.put_line('i = ' || i).put_line('i = ' || i).high_bound loop Sequence of statements. END. 101 . Output: i = 1 i=2 i=3 i=4 i=5 5) FOR LOOP Syntax: For <loop_counter_variable> in low_bound.4) WHILE LOOP Syntax: While <condition> loop Sequence of statements.put_line('i = ' || i).5 loop end loop. i := i + 1. BEGIN While i <= 5 loop dbms_output... Ex: DECLARE i number := 1. End loop. Output: i=1 i=2 i=3 i=4 i=5 Ex2: BEGIN dbms_output. End loop. end loop. END. For i in reverse 1. end loop.. Ex1: BEGIN For i in 1.5 loop dbms_output.

102 . It is illegal to branch from one if statement to another if statement. It is illegal to branch from exception block to the current block. loop. end loop. Output: i=1 i=2 i=3 i=4 RESTRICTIONS ON GOTO     It is illegal to branch into an inner block. control immediately passes to the statement identified by the label. When a goto statement is evaluated. Ex: BEGIN For i in 1. It is illegal to branch into an if statement. <<exit_loop>> Null. end if. if i = 4 then goto exit_loop.. END.put_line('i = ' || i). Where label is a label defined in the PL/SQL block.Output: i=5 i=4 i=3 i=2 i=1 GOTO AND LABELS Syntax: Goto label. Labels are enclosed in double angle brackets.5 loop dbms_output.

table then use the dot method to differentiate (p. b in number default 6. b in number default 6. They serve as instructions to the PL/SQL compiler. c in number default 7) ± valild Procedure p (a in number. The compiler will act on the pragma during the compilation of the block.sal). c in number default 7) ± valild Procedure p (a in number.      Ex: Procedure p (a in number default 5. 103 . SUBPROGRAMS      ³In´ parameter will act as pl/sql constant. once the call was completed then the values of formal parameters are copied to the actual parameters. c in number) ± invalild  If the subprogram contains a variable with the same name as the column name of the We can not use µcall¶ without parameters. ³In out´ parameter will act as initialized variable.PRAGMAS Pragmas are compiler directives. b in number default 6. c in number default 7) ± valild Procedure p(a in number. Default Parameters will not allow in the beginning and middle. b in number default 6.  The copying from formal to actual can be restricted by issuing nocopy qualifier. b in number. b in number. Out and In Out parameters can not have default values. c in number) ± invalild Procedure p (a in number default 5. c in number) ± invalild Procedure p (a in number default 5. ³Out´ parameter will act as unintialized variable. We can not use µexec¶ with out or in out parameters. In parameters by default call by reference where as out and in out call by value.  If any subprogram was called. We can combine positional and name notation but positional notation can not be followed by the name notation. We can not use call with out and in out parameters.

Stored subprograms can have local subprograms.   Subprograms can be local.  Once it reads from the disk. dbms_output. and executed. dbms_output.    Subprograms can not have the declarative section separately. Any local subprogram must be declared at the end of the declarative section. When a stored subprogram is created.put_line('After assignment').b out number. v2 number := 5. END SAMPLE. v3 number := 6. dbms_output. The subprogram is stored in compile form which is known as p-code in addition to the source text. and the source code is translated into a form that is easily readable by pl/sql engine. Ex: CREATE OR REPLACE PROCEDURE SAMPLE (a in number. DECLARE v1 number := 4.put_line('a = ' || a ||' b = ' || b || ' c = ' || c). it is stored in the data dictionary.  The p-code has all of the references in the subprogram evaluated. if necessary.put_line('After call'). the p-code is read from the disk.  When the subprogram is called.c in out number) is BEGIN dbms_output.  Local subprograms must be declared in the declarative section of pl/sql block and called from the executable section. b := 10.put_line('a = ' || a ||' b = ' || b || ' c = ' || c). the p-code is stored in the shared pool portion of the system global area (SGA). 104 . p-code is aged out of the shared pool according to a least recently used (LRU) algorithm.  Like all of the contents of the shared pool. c := 20. where it can be accessed by multiple users as needed.

By declaring formal parameters with %type specifier. c.  Call by reference is faster than the call by value because it avoids the copying. Possible with same type with objects. 105 .v3). Output: Before call v1 = 4 v2 = 5 v3 = 6 After call a=4b=c=6 After assignment a = 4 b = 10 c = 20 After completion of call v1 = 4 v2 = 10 v3 = 20 CALL BY REFERENCE AND CALL BY VALUE  When parameter passed by reference. Possible with different number of parameters. a pointer to the actual parameter is passed to the corresponding formal parameter. sample(v1.put_line('v1 = ' || v1 || ' v2 = ' || v2 || ' v3 = ' || v3). dbms_output. We can overload local subprograms also. dbms_output.put_line('Before call').BEGIN dbms_output. Ex: SQL> create or replace type t1 as object(a number). e. SUBPROGRAMS OVERLOADING a.put_line('v1 = ' || v1 || ' v2 = ' || v2 || ' v3 = ' || v3). b. dbms_output. SQL> create or replace type t1 as object(a number). RESTRICTIONS ON FORMAL PARAMETERS   By declaring with specified size in actual parameters. Can not be possible with different types of modes. END.put_line('After completion of call').  When parameter passed by value it copies the value of the actual parameter to the formal parameter.v2. d. Possible with different types of data.

BEGIN p(i). END. PROCEDURE PRODUCT(a number. product (4. END PRODUCT.b).b number) IS BEGIN dbms_output. END PRODUCT.6). PROCEDURE PRODUCT(a number. PROCEDURE P(n t2) IS BEGIN dbms_output.put_line('Product of a.b = ' || a * b * c).b = 20 Product of a. y Procedures can not have return clause where as functions must. END P. product (4.put_line('a = ' || m. PROCEDURE P(m t1) IS BEGIN dbms_output.b = ' || a * b).c number) IS BEGIN dbms_output. 106 .b = 120 PROCEDURES VERSES FUNCTIONS y Procedures may return through out and in out parameters where as function must return.DECLARE i t1 := t1(5).put_line('Product of a.a). Output: a=5 b=5 Product of a.b number.5). END P. p(j).5. j t2 := t2(5).put_line('b = ' || n.

when the procedure is called it does not have to be compiled. y y y y Functions can use in select statements where as procedures can not. 107 .  The local subprogram is compiled as part of its containing block.  By keeping the stored subprogram code separate from the calling block. We can use exec for executing procedures where as functions can not. but packaged subprograms can be overloaded within the same package.y We can use call statement directly for executing procedure where as we need to declare a variable in case of functions.  Stand alone stored subprograms can not be overloaded. This can improve performance.  Local subprograms can be called only from the block containing the subprogram. If the containing block is anonymous and is run multiple times.  Local subprograms can be overloaded within the same block. Functions can call from reports environment where as procedures can not. Function can be used in dbms_output where as procedure can not.  The local subprogram and the calling block are one and the same. the subprogram will be recompiled as of the recompilation of the containing block. the calling block is shorter and easier to understand. the subprogram has to be compiled each time.  Local subprograms cannot be pinned in the shared pool by themselves. which can lead to part confusion. STORE VERSES LOCAL SUBPROGRAMS  The stored subprogram is stored in compiled p-code in the database. o Stored subprograms can be called from any block submitted by a user who has execute privileges on the subprogram.  The compiled p-code can be pinned in the shared pool using the DBMS_SHARED_POOL Package. If a change to the calling block is made.

SQL> Alter function F1 compile. END. END.put_line('Stored subprogram'). BEGIN p. If we compile P2 then P1 is invalidated. END. y If a subprogram is invalidated. SUBPROGRAMS DEPENDECIES y A stored subprogram is marked as invalid in the data dictionary if it has compile errors.put_line('Stored subprogram'). y A stored subprogram can also become invalid if a DDL operation is performed on one of its dependent objects. y If we have two procedures like P1 and P2 in which P1 depends on P2. Output: Stored subprogram COMPILING SUBPROGRAMS SQL> Alter procedure P1 compile. 108 . the PL/SQL engine will automatically attempt to recompile in the next time it is called. Output: SQL> exec p Stored subprogram Ex2: DECLARE PROCEDURE P IS BEGIN dbms_output.Ex1: CREATE OR REPLACE PROCEDURE P IS BEGIN dbms_output.

  The last_ddl_time field of user_objects contains the timestamp. there are two different methods of comparision  Timestamp Model  Signature Model TIMESTAMP MODEL   This is the default model used by oracle.  The signature encodes the types and order of the parametes.  Instead the validity of remote objects is checked at runtime. the dependent object will be recompiled. in this case it may not possible to recompile P1. because the source for it may not be included with the forms. SIGNATURE MODEL  When a procedure is created.  P1 and P2 are compared to see it P1 needs to be recompiled. the remote data dictionary is queried to determine the status of P2. 109 .SUBPROGRAMS DEPENDENCIES IN REMOTE DATABASES  We will call remote subprogram using connect string like P1@VIS. ISSUES WITH THIS MODEL  If the objects are in different time zones.  When P1 is in a client side PL/SQL engine such as oracle forms.  If we have two procedures like P1 and P2 in which P1 depends on P2 but P2 was in remote database. the timestamps of the last modifications of the two objects are compared. If we compile P2 it will not invalidate P1 immediately because the data dictionary does not track remote dependencies. With this model. When P1 is called. the comparison is invalid. a signature is stored in the data dictionary in addition to the p-code. If the base object has a newer timestamp than the dependent object.

 You must have the ALTER SYSTEM privilege to issue this command.  This will affect the entire database (all sessions) from the time the statement is issued. The next time the database is started.  If P1 is calling a packaged procedure P2. P1 will still use the old version (not the new overloaded one) until P1 is recompiled manually. and P1 is using this default value. When P1 is compiled the first time. FORWARD DECLERATION Before going to use the procedure in any other subprogram or other block .  Suppose P2 has a default value for one of its parameters. the mode will be set to SIGNATURE for all sessions.  Alter system set remote_dependencies_mode = signature. 110 .  This will only affect your session ISSUES WITH THIS MODEL  Signatures don¶t get modified if the default values of formal parameters are changed. and a new overloaded version of P2 is added to the remote package.  In order to use the signature model. The old value for the default parameter will still be used until P1 is manually recompiled. This is a parameter in the database initialization file. THREE WAYS OF SETTING THIS MODE  Add the line REMOTE_DEPENDENCIES_MODE=SIGNATURE to the database initialization file.  Alter session set remote_dependencies_mode = signature. If the default in the specification for P2 is changed. P1 only needs to recompiled when the signature of P2 changes. the parameter REMOTE_DEPENDENCIES_MODE must be set to SIGNATURE. Thus. the signature is not changed. the signature of P2 is included. P1 will not be recompiled  by default. you must declare the prototype of the procedure in declarative section.

END P3. column 1: PL/SQL: Statement ignored ORA-06550: line 10. END P2.put_line('From procedure p3'). PROCEDURE P1 IS BEGIN 111 . * ERROR at line 5: ORA-06550: line 5. PROCEDURE P2 IS BEGIN dbms_output. END P1. -. p3.put_line('From procedure p2').Ex1: DECLARE PROCEDURE P1 IS BEGIN dbms_output.put_line('From procedure p1'). column 1: PLS-00313: 'P3' not declared in this scope ORA-06550: line 10. Output: p2. column 1: PLS-00313: 'P2' not declared in this scope ORA-06550: line 5.forward declaration PROCEDURE P3. PROCEDURE P3 IS BEGIN dbms_output. END. p2. BEGIN p1. column 1: PL/SQL: Statement ignored Ex2: DECLARE PROCEDURE P2.

dbms_output.put_line('From procedure p1'); p2; END P1; PROCEDURE P2 IS BEGIN dbms_output.put_line('From procedure p2'); p3; END P2; PROCEDURE P3 IS BEGIN dbms_output.put_line('From procedure p3'); END P3; BEGIN p1; END; Output: From procedure p1 From procedure p2 From procedure p3 PRIVILEGES AND STORED SUBPROGRAMS EXECUTE PREVILEGE  For stored subprograms and packages the relevant privilege is EXECUTE.  If user A had the procedure called emp_proc then user A grants execute privilege on procedure to user B with the following command.  Grant execute on emp_proc to user B.  Then user B can run the procedure by issuing  Exec user A.emp_proc

userA created the following procedure
CREATE OR REPLACE PROCEDURE P IS cursor is select *from student1; BEGIN for v in c loop

112

insert into student2 values(v.no,v.name,v.marks); end loop; END P;

userA granted execute privilege to userB using
SQL> grant execute on p to userB Then userB executed the procedure SQL> Exec userA.p If suppose userB also having student2 table then which table will populate whether userA¶s or userB¶s. The answer is userA¶s student2 table only because by default the procedure will execute under the privlige set of its owner. The above procedure is known as definer¶s procedure. HOW TO POPULATE USER B¶s TABLE  Oracle introduces Invoker¶s and Definer¶s rights.  By default it will use the definer¶s rights.  An invoker¶s rights routine can be created by using AUTHID clause to populate the userB¶s table.  It is valid for stand-alone subprograms, package specifications, and object type specifications only.

userA created the following procedure
CREATE OR REPLACE PROCEDURE P AUTHID CURRENT_USER IS cursor is select *from student1; BEGIN for v in c loop insert into student2 values(v.no,v.name,v.marks); end loop; END P; Then grant execute privilege on p to userB. Executing the procedure by userB, which populates userB¶s table.

113

The above procedure is called invoker¶s procedure. Instead of current_user of authid clause, if you use definer then it will be called definer¶ procedure. STORED SUBPROGRAMS AND ROLES we have two users saketh and sudha in which saketh has student table and sudha does not. Sudha is going to create a procedure based on student table owned by saketh. Before doing this saketh must grant the permissions on this table to sudha. SQL> conn saketh/saketh SQL> grant all on student to sudha; then sudha can create procedure SQL> conn sudha/sudha CREATE OR REPLACE PROCEDURE P IS cursor c is select *from saketh.student; BEGIN for v in c loop dbms_output.put_line(µNo = µ || v.no); end loop; END P; here procedure will be created. If the same privilege was granted through a role it wont create the procedure. Examine the following code SQL> conn saketh/saketh SQL> create role saketh_role; SQL> grant all on student to saketh_role; SQL> grant saketh_role to sudha; then conn sudha/sudha CREATE OR REPLACE PROCEDURE P IS cursor c is select *from saketh.student; BEGIN for v in c loop dbms_output.put_line(µNo = µ || v.no);

114

the package is instantiated.  In many cases initialization needs to be run the first time the package is instantiated within a session. The above code will raise error instead of creating procedure . TRIGGERS.  Each session will have its own copy of packaged variables. 115 . the whole package p-code was stored in shared pool of SGA.  This is also true for PL/SQL function that is called from a view. the function will execute under the privilege set of the view¶s owner. VIEWS AND INVOKER¶S RIGHTS  A database trigger will always be executed with definer¶s rights and will execute under the privilege set of the schema that owns the triggering table.  Packaged subprograms has an advantage over stand alone subprogram. ISSUES WITH INVOKER¶S RIGHTS  In an invoker¶s rights routine.  When ever any reference to package. END P. external references in SQL statements will be resolved using the caller¶s privilege set.  Package may have local subprograms. This can be done by adding initialization section to the package body after all the objects.  But references in PL/SQL statements are still resolved under the owner¶s privilege set. PACKAGES  The first time a packaged subprogram is called or any reference to a packaged variable or type is made. In this case. ensuring that two sessions executing subprograms in the same package use different memory locations. This is because of early binding which PL/SQL uses by default in which references are evaluated in compile time but when you are using a role this will affect immediately.end loop.  Packages are stored in the data dictionary and can not be local.

cursor c is select ename from emp. Alter package PKG compile body. Non serially reusable packages SERIALLY REUSABLE PACKAGES To force the oracle to use serially reusable version then includes PRAGMA SERIALLY_REUSABLE in both package spec and body.COMPILING PACKAGES 1. PACKAGE RUNTIME STATE Package runtime state is differing for the following packages.  The package header does not depend on the package body.  We can change the package body with out changing the header. PACKAGE DEPENDENCIES  The package body depends on the some objects and the package header. 2. Alter package PKG compile. procedure emp_proc. 1. Alter package PKG compile specification. which is an advantage of packages. Examine the following package create or replace package pkg is pragma serially_reusable. 3. Serially reusable packages 2. create or replace package body pkg is pragma serially_reusable. end pkg. begin if not c%isopen then 116 .ename%type. v_numrows number := 0. procedure emp_proc is v_ename emp. v_flag boolean := true.

 Because the serially reusable version resets the state of the cursor each time it was called. while v_flag loop fetch c into v_ename. SQL> exec pkg.open c. Examine the following package 117 . end pkg. end if. v_numrows := v_numrows + 1.emp_proc Ename = SMITH Ename = ALLEN Ename = WARD Ename = JONES Ename = MARTIN SQL> exec pkg. end if. NON SERIALL Y REUSABLE PACKAGES This is the default version used by the oracle.put_line('Ename = ' || v_ename). if v_numrows = 5 then v_flag := false. end emp_proc.emp_proc Ename = SMITH Ename = ALLEN Ename = WARD Ename = JONES Ename = MARTIN  The above package displays the same output for each execution even though the cursor is not closed. dbms_output. end loop.

SQL> exec pkg.put_line('Ename = ' || v_ename). if v_numrows = 5 then v_flag := false.emp_proc Ename = BLAKE Ename = CLARK Ename = SCOTT Ename = KING Ename = TURNER 118 . end pkg. dbms_output.emp_proc Ename = SMITH Ename = ALLEN Ename = WARD Ename = JONES Ename = MARTIN SQL> exec pkg. end pkg. create or replace package body pkg is cursor c is select ename from emp. v_numrows number := 0.create or replace package pkg is procedure emp_proc. while v_flag loop fetch c into v_ename. end if. end emp_proc. begin if not c%isopen then open c. end loop. v_flag boolean := true. procedure emp_proc is v_ename emp. v_numrows := v_numrows + 1. end if.ename%type.

end pkg. v := 10. Connect to second session Run the following code begin pkg.put_line('v = ' || v). begin pkg. The above package displays the different output for each execution even though the cursor is not closed. DEPENDENCIES OF PACKAGE RUNTIME STATE Dependencies can exists between package state and anonymous blocks.p. The above code wil work. Examine the following program Create this package in first session create or replace package pkg is v number := 5. dbms_output. end pkg.put_line('v = ' || v). Go back to first session and recreate the package using create. 119 . end p.  Because the non-serially reusable version remains the state of the cursor over database calls. procedure p. end. create or replace package body pkg is procedure p is begin dbms_output. Then connect to second session and run the following code again. end.p.

and the active set which is the set of rows returned by the query. which invalidates the block and raises the oracle error.  If the package had no global variables.This above code will not work because of the following. Header 2. since each session has its own copy of packaged variables. User_erros CURSORS Cursor is a pointer to memory location which is called as context area which contains the information necessary for processing. Ex: Cursor c(dno in number) return dept%rowtype is select *from dept. This includes variables and cursors declared in a package. User_objects 2. Body Header includes cursor name.   The anonymous block depends on pkg. In the above Header ± cursor c(dno in number) return dept%rowtype Body ± select *from dept 120 .  Thus when pkg is recompiled the runtime dependency is followed. This is compile time dependency. the second execution of the anonymous block would have succeeded. DATA MODEL FOR SUBPROGRAMS AND PACKAGES 1. including the number of rows processed by the statement. Cursor contains two parts 1.  Runtime dependencies exist only on package state. User_source 3. Body includes the select statement. any parameters and the type of data being loaded. a pointer to the parsed representation of the statement. There is also a runtime dependency on the packaged variables.

For loop 1. CURSOR LOOPS 1. 121 . %isopen e. Open 2. End loop. While loop 3. %found b. Exit when <cursor_name> % notfound. Fetch 3. Simple loop 2. %bulk_rowcount f. %rowcount d. Close CURSOR ATTRIBUTES a.CURSOR TYPES 1) Implicit (SQL) 2) Explicit a) Parameterized cursors b) REF cursors CURSOR STAGES 1. Cursor c is select *from dept. <statements>. SIMPLE LOOP:Syntax: Loop Fetch <cursor_name> into <record_variable>. %bulk_exceptions CURSOR DECLERATION Syntax: Ex: Cursor <cursor_name> is select statement. %notfound c.

WHILE LOOP Syntax: While <cursor_name> % found loop Fetch <cursor_name> into <record_variable>. BEGIN open c. Ex: DECLARE cursor c is select * from student. end loop. BEGIN open c. <statements>. END. v_stud student%rowtype. while c%found loop fetch c into v_stud. exit when c%notfound. Output: Name = saketh Name = srinu Name = satish Name = sudha 2. loop fetch c into v_stud. End loop. dbms_output. dbms_output. 122 .Ex: DECLARE cursor c is select * from student.put_line('Name = ' || v_stud. fetch c into v_stud. END. v_stud student%rowtype. end loop. close c.name).put_line('Name = ' || v_stud. close c.name).

v_dept dept%rowtype. BEGIN open c(20).  Cursor parameters may have default values. End loop.  Cursor parameters must be in mode. Ex: DECLARE cursor c(dno in number) is select * from dept where deptno = dno.  The scope of cursor parameter is within the select statement. Ex: DECLARE cursor c is select * from student. Output: Name = saketh Name = srinu Name = satish Name = sudha PARAMETARIZED CURSORS  This was used when you are going to use the cursor in more than one place with different values for the same where clause.Output: Name = saketh Name = srinu Name = satish Name = sudha 3) FOR LOOP Syntax: for <record_variable> in <cursor_name> loop <statements>. END. 123 .put_line('Name = ' || v_stud. BEGIN for v_stud in c loop dbms_output.name). end loop.

Ref cursor with out return type is called weak cursor.  In packaged cursors you can modify the select statement without making any changes to the cursor header in the package specification. exit when c%notfound. REF CURSORS AND CURSOR VARIABLES y This is unconstrained cursor which will return different types depends upon the user input. You can declare a cursor variable in one scope and assign another cursor variable with different scope. then you can use the cursor variable even though the assigned cursor variable goes out of scope. Output: Dname = RESEARCH Loc = DALLAS PACKAGED CURSORS WITH HEADER IN SPEC AND BODY IN PACKAGE BODY  Cursors declared in packages will not close automatically.loc). 124 .loop fetch c into v_dept.dname || ' Loc = ' || v_dept.  Cursor declaration in package with out body needs the return clause.put_line('Dname = ' || v_dept. Cursor variables can be assigned from one to another.  You can not define the packaged cursor in any subprograms. Ref cursor with return type is called strong cursor. y y y y y Ref cursors can not be closed implicitly.c  Packaged cursors with must be defined in the package body itself. close c. end loop. END.  You can use dot method for packaged cursors like pkg. dbms_output. and then use it as global for the package.

v_emp r. Ex:. You can not compare cursor variables for equality. c t.sal from emp. y y y Cursor variables can not use for update clause.name%type.job%type. BEGIN if table_name = 'DEPT' then open c for select * from dept.CREATE OR REPLACE PROCEDURE REF_CURSOR(TABLE_NAME IN VARCHAR) IS type t is ref cursor.job.sal emp. type r is record(ename emp. exit when c%notfound.sal%type). v_stud student. elsif table_name = 'STUDENT' then open c for select name from student. y y y You can declare ref cursor type in package spec as well as body. loop if table_name = 'DEPT' then fetch c into v_dept. You can not user remote procedure calls to pass cursor variables from one server to another. elsif table_name = 'EMP' then open c for select ename. inequality and nullity. end if. 125 . You can declare ref cursor types in local subprograms or anonymous blocks.y y y Cursor variables can be passed as a parameters to the subprograms. You can not assign nulls to cursor variables.ename%type.job emp. v_dept dept%rowtype. Cursor variables can not be declared in package spec and package body (excluding subprograms). Cursor variables modes are in or out or in out.

Output: SQL> exec ref_cursor('DEPT') Deptno = 10 Dname = ACCOUNTING Loc = NEW YORK Deptno = 20 Dname = RESEARCH Loc = DALLAS Deptno = 30 Dname = SALES Loc = CHICAGO Deptno = 40 Dname = OPERATIONS Loc = BOSTON SQL> exec ref_cursor('EMP') Ename = SMITH Job = CLERK Sal = 800 Ename = ALLEN Job = SALESMAN Sal = 1600 Ename = WARD Job = SALESMAN Sal = 1250 Ename = JONES Job = MANAGER Sal = 2975 Ename = MARTIN Job = SALESMAN Sal = 1250 Ename = BLAKE Job = MANAGER Sal = 2850 Ename = CLARK Job = MANAGER Sal = 2450 Ename = SCOTT Job = ANALYST Sal = 3000 Ename = KING Job = PRESIDENT Sal = 5000 Ename = TURNER Job = SALESMAN Sal = 1500 Ename = ADAMS Job = CLERK Sal = 1100 126 .dbms_output.put_line('Deptno = ' || v_dept.put_line('Name = ' || v_stud).loc).ename || ' Job = ' || v_emp. close c. end loop. dbms_output. dbms_output. END.sal). end if. elsif table_name = 'STUDENT' then fetch c into v_stud.job || ' Sal = ' || v_emp.dname || ' Loc = ' || v_dept. exit when c%notfound. exit when c%notfound.deptno || ' Dname = ' || v_dept. elsif table_name = 'EMP' then fetch c into v_emp.put_line('Ename = ' || v_emp.

 Oracle opens the nested cursor defined by a cursor expression implicitly as soon as it fetches the data containing the cursor expression from the parent or outer cursor.  You can use cursor expressions in dynamic SQL. 127 .  You can not perform bind and execute operations on cursor expressions when using the cursor expressions in dynamic SQL.  Cursor expressions can not be used when declaring a view.  Nested cursor closes whenever the outer or parent cursor is executed again or closed or canceled.deptno) from emp e.empno = d.Ename = JAMES Job = CLERK Sal = 950 Ename = FORD Job = ANALYST Sal = 3000 Ename = MILLER Job = CLERK Sal = 1300 SQL> exec ref_cursor('STUDENT') Name = saketh Name = srinu Name = satish Name = sudha CURSOR EXPRESSIONS  You can use cursor expressions in explicit cursors.cursor(select dname from dept d where e.  Nested cursor closes whenever an exception is raised while fetching data from a parent cursor.  Cursor expressions can be used as an argument to table function.  You can use cursor expressions in REF cursor declarations and variables.  Nested cursor closes if you close explicitly. USING NESTED CURSORS OR CURSOR EXPRESSIONS Ex: DECLARE cursor c is select ename.  You can not use cursor expressions in implicit cursors.

deptno%type. END. Or Cursor c1 is select *from dept.dname%type). fetch c2 into v2. For update 3. dname dept.type t is ref cursor. Bulk collect 1) RETURN Cursor c return dept%rowtype is select *from dept. Cursor c return c1%rowtype is select *from dept. c1 t. c2 t. loop fetch c1 into v1. end loop. exit when c2%notfound. v1 emp. close c. v2 dept. Where current of 4.ename%type. end loop. Return 2. CURSOR CLAUSES 1.put_line('Ename = ' || v1 || ' Dname = ' || v2). Cursor c return t is select deptno. dname from dept. exit when c1%notfound. 128 . dbms_output. Or Type t is record(deptno dept. BEGIN open c.dname%type.

Or Cursor c is select *from dept for update of dname. 129 . End. Fetch c bulk collect into nt. Update dept set dname = µfin¶ where deptno = 20 where current of c. You can use bulk collect in select. You can fetch into multible collections with one column each. BULK COLLECT y y y y y y y This is used for array fetches With this you can retrieve multiple rows of data with a single roundtrip. begin Open c.FOR UPDATE AND WHERE CURRENT OF Cursor c is select *from dept for update. This reduces the number of context switches between the pl/sql and sql engines. BULK COLLECT IN FETCH declare Type t is table of dept%rowtype. fetch into and returning into clauses. Commit. You can use bulk collect in both dynamic and static sql. y y y You can use the limit clause of bulk collect to restrict the no of rows retrieved. Close c. Cursor c is select *from dept. SQL engine automatically initializes and extends the collections you reference in the bulk collect clause. nt t. Using the returning clause we can return data to the another collection. y Bulk collect operation empties the collection referenced in the into clause before executing the query. Reduces the overhead of retrieving data.

nt t := t(1. close c.nt1. fetch c bulk collect into nt. Cursor c is select *from emp. LIMIT IN BULK COLLECT declare Type t is table of emp%rowtype.4).deptno%type. Fetch c bulk collect into nt limit 5. type t1 is table of dept. begin Open c. MULTIPLE FETCHES IN INTO CLAUSE declare type t is table of dept. nt t. cursor c is select deptno. Close c.dname from dept.2. begin open c. end. Nt t. nt t. nt1 t1. 130 . End. End.3.dname%type. begin Select * into nt from dept.BULK COLLECT IN SELECT declare Type t is table of dept%rowtype. RETURNING CLAUSE IN BULK COLLECT declare type t is table of number(2).

last loop dbms_output.first. Types of binding 1. nt2 t2.put_line('Marks = ' || nt2(v)).  %bulk_rowcount and %bulk_exceptions can be used only with forall construct. Late binding  Binding during the compiled phase is early binding.last update student set no = nt(v) where name = nt1(v) returning no.Binding a variable is the process of identifying the storage location associated with an identifier in the program. BINDING:.. end loop..  Cursors declared in anonymous blocks or subprograms closes automatically when that block terminates execution.nt1. begin select name bulk collect into nt1 from student.name. POINTS TO REMEMBER  Cursor name can be up to 30 characters in length. for v in nt2. 131 .type t1 is table of varchar(2). forall v in nt1.  These expressions are called virtual columns or calculated columns.first. nt1 t1.  Cursor declarations may have expressions with column aliases. type t2 is table of student%rowtype. end.marks bulk collect into nt2.  Binding during the runtime phase is late binding. SQL IN PL/SQL The only statements allowed directly in pl/sql are DML and TCL. Early binding 2.nt2.

USING NATIVE DYNAMIC SQL Using execute immediate Begin Execute immediate µcreate table student(no number(2). execute immediate v.  Pl/sql by default uses early binding. Using execute immediate with pl/sql variables declare v varchar(100).name varchar(10))¶).  Binding also involves checking the database for permissions to access the object referenced. In early binding compile phase will take longer because of binding work but the execution is faster. 1. 132 . end.  In late binding it will shorten the compile phase but lengthens the execution time. DYNAMIC SQL If you use DDL in pl/sql it validates the permissions and existence if requires during compile time which makes invalid. End. We can avoid this by using Dynamic SQL. (or) Execute immediate (µcreate table student(no number(2). Native Dynamic SQL 2. begin v := 'create table student(no number(2). Two techniques are available for Dynamic SQL. Dynamic SQL allows you to create a SQL statement dynamically at runtime.name varchar(10))¶. DBMS_SQL package 1.name varchar(10))'.

execute immediate v into lc using d_name. v := 'select loc from dept where dname = :dn'. lc dept. 133 . begin v := 'insert into student values(:v1.dname%type.put_line('Loc = ' || lc). execute immediate v using 6. end. dbms_output. Executing queries with open for and using clause create or replace procedure p(smarks in number) is s varchar(100) := 'select *from student where marks > :m'. loop fetch c into v. execute immediate v into d_name.:v2.:v3)'.600. dbms_output. begin open c for s using smarks.marks).loc%type.put_line('Dname = '|| d_name). end loop. v varchar(100). begin v := 'select dname from dept where deptno = 10'.'f'. Queries with execute immediate declare d_name dept. dbms_output. end. c t. exit when c%notfound. close c.Using execute immediate with bind variables and using clause declare v varchar(100). type t is ref cursor.put_line('Student Marks = ' || v. v student%rowtype. end.

End. V2 varchar(2).delete rows which has a marks of 100 End. Begin Delete student where marks = marks.name into v1.marks. Begin Select no. <<my_block>> Declare Marks number(3) := 100.v2 from student where marks = 100. Begin Delete student where marks = my_block. DML and Records create or replace procedure p(srow in student%rowtype) is begin insert into student values srow. This can be avoided by using the labeled blocks. -. -. student table End.here v is bind variable 134 .Bind variables Declare V number := 500. end p. Variable Names Declare Marks number(3) := 100. End. Getting data into pl/sql variables Declare V1 number.this will delete all the rows in the -. Begin Update student set marks = v where.

end. Using records with returning clause declare srow student%rowtype. begin srow. sreturn student%rowtype.name := 'aa'. srow. 135 . begin srow.name := 'cc'. end.no := 6. Record based updates declare srow student%rowtype. begin s. s.marks := 500. s. srow. end.no := 7. update student set row=srow where no = srow.no. p(s).no := 11. srow.marks := 500.marks := 100.declare s student%rowtype. srow.name := 'cc'. begin srow. Record based inserts declare srow student%rowtype.no := 8. insert into student values srow.

marks into sreturn. srow. type t1 is table of boolean index by binary_integer. For all with non-sequential arrays declare type t is table of student. ibt1(100) := true.first. ibt1 t1. end. begin ibt(1) := 1.no%type index by binary_integer.put_line('No = ' || sreturn. end. ibt(10) := 2.srow.. insert into student values srow returning no.put_line('No = ' || sreturn.name. end.last update student set marks = 900 where no = ibt(i).name := 'dd'. ibt(10) := true.name). forall i in indices of ibt1 update student set marks = 900 where no = ibt(i).put_line('No = ' || sreturn. 136 . ibt t.marks := 500. dbms_output. dbms_output. Usage of indices of to avoid the above error declare type t is table of student.no). begin ibt(1) := 1. dbms_output. The above program will give error like µelement at index [2] does not exists. forall i in ibt. ibt t. ibt(10) := 2. ibt(100) := 3.marks).ibt. ibt1(1) := true.no%type index by binary_integer.

Elements are inserted into varray starting at index 1.'d').'c'. y With out going for another SELECT using RETURNING clause we will get the data which will avoid a call to RDBMS kernel. in that they allow you to treat several variables as a unit. If there is an error processing one of the rows in bulk DML operation. A varray has a fixed limit on its size. TYPES 1. The maximum size of the varray is 2 giga bytes. Index . This will be useful in situations like . specified as part of the declaration. only that row is rolled back. Bulk binds are done using the forall statement. Ex1: DECLARE type t is varray(10) of varchar(2). A collection combines variables of the same type. Nested tables 3. va t := t('a'. Varrays 2. 137 . flag boolean.Bulk Binds y y y Passing the entire pl/sql table to the SQL engine in one step is known as bulk bind.VARRAYS:. Syntax: Type <type_name> is varray | varying array (<limit>) of <element_type>. when performing insert or update or delete if you want to know the data of the table which has been effected by the DML.A varray is datatype very similar to an array. COLLECTIONS Collections are also composite types.by tables 1.'b'. up to maximum lenth declared in the varray type. Returning clause y y This will be used only with DML statements to return data into pl/sql variables.

put_line('Next Index = ' || va.put_line('Limit = ' || va. dbms_output.first.exists(5).put_line('Index 3 exists with an element ' || va(3)).put_line('First Index = ' || va.. else dbms_output..last). dbms_output.put_line('Index 3 does not exists').first. if flag = true then dbms_output.put_line('Index 5 does not exists'). Count = ' || va.last loop 138 .extend(2).put_line('Index 6 exists with an element ' || va(6)). dbms_output. dbms_output.extend. dbms_output.BEGIN dbms_output.count).next(2)). dbms_output.put_line('After extend of two indexes.exists(6).put_line('VARRAY ELEMENTS').first).va. if flag = true then dbms_output. flag := va.put_line('Index 6 does not exists'). else dbms_output. else dbms_output. for i in va. Count = ' || va.limit).put_line('After extend of one index. end if.put_line('va[' || i || '] = ' || va(i)). dbms_output. end if.count).exists(3).count). dbms_output. va. for i in va.put_line('VARRAY ELEMENTS'). end loop. flag := va.prior(3)). va. dbms_output.va. flag := va.put_line('Index 5 exists with an element ' || va(5)).last loop dbms_output. end if.put_line('Count = ' || va.put_line('Previous Index = ' || va.put_line('Last Index = ' || va. if flag = true then dbms_output.

. END. dbms_output.put_line('va[' || i || '] = ' || va(i)). for i in va. Count = ' || va.extend(3. dbms_output.. for i in va. va(7) := 'g'.last loop dbms_output.delete. va. va.first.count).put_line('va[' || i || '] = ' || va(i)).count).put_line('AFTER TRIM. VARRAY ELEMENTS').. Output: Limit = 10 Count = 4 First Index = 1 Last Index = 4 Next Index = 3 Previous Index = 2 VARRAY ELEMENTS VALUES TO EXTENDED 139 . dbms_output. for i in va. Count = ' || va. end loop.last loop dbms_output.put_line('VARRAY ELEMENTS').put_line('After trim of three indexs.count). end loop.put_line('After extend of three indexes.2).put_line('After trim of one index.put_line('va[' || i || '] = ' || va(i)). Count = ' || va. va. va.put_line('va[' || i || '] = ' || va(i)).va. dbms_output.first.va.put_line('After delete of entire varray. dbms_output.trim. va(5) := 'e'.first. end loop.put_line('AFTER ASSINGNING ELEMENTS.trim(3). VARRAY ELEMENTS'). dbms_output. va(6) := 'f'. dbms_output.dbms_output. end loop.va. Count = ' || va.last loop dbms_output.count).

Count = 5 Index 5 exists with an element Index 6 does not exists After extend of two indexes. Count = 7 VARRAY ELEMENTS va[1] = a va[2] = b va[3] = c va[4] = d va[5] = va[6] = va[7] = AFTER ASSINGNING VALUES TO EXTENDED ELEMENTS. VARRAY ELEMENTS va[1] = a va[2] = b va[3] = c va[4] = d va[5] = e va[6] = f va[7] = g After extend of three indexes. Count = 10 VARRAY ELEMENTS va[1] = a va[2] = b va[3] = c va[4] = d va[5] = e va[6] = f va[7] = g va[8] = b 140 .va[1] = a va[2] = b va[3] = c va[4] = d Index 3 exists with an element c After extend of one index.

null.va.null.sno || ' Sname = ' || va(i).count loop select * into va(i) from student where sno = i.null). Count = 6 AFTER TRIM.null). END.put_line('Sno = ' || va(i).. va t := t(null.va. Count = 0 Ex2: DECLARE type t is varray(4) of student%rowtype. va t := t(null. Count = 9 After trim of three indexs.sname).null. Output: Sno = 1 Sname = saketh Sno = 2 Sname = srinu Sno = 3 Sname = divya Sno = 4 Sname = manogni Ex3: DECLARE type t is varray(4) of student.count loop 141 . BEGIN for i in 1.va[9] = b va[10] = b After trim of one index.smarks%type. dbms_output. BEGIN for i in 1. VARRAY ELEMENTS va[1] = a va[2] = b va[3] = c va[4] = d va[5] = e va[6] = f After delete of entire varray. end loop..null.

BEGIN for i in 1.sname%type.c2).smarks into va(i) from student where sno = i. end loop.va. END. BEGIN 142 .put_line('Sname = ' || va(i).smarks%type). dbms_output.null. end loop. dbms_output.c1 || ' Smarks = ' || va(i).. va t := t(null). Output: Smarks = 100 Smarks = 200 Smarks = 300 Smarks = 400 Ex4: DECLARE type r is record(c1 student.put_line('Smarks = ' || va(i)).null). i number := 1.select smarks into va(i) from student where sno = i. va t := t(null.null. type t is varray(4) of r. END. cursor c is select * from employ. Output: Sname = saketh Smarks = 100 Sname = srinu Smarks = 200 Sname = divya Smarks = 300 Sname = manogni Smarks = 400 Ex5: DECLARE type t is varray(1) of addr.count loop select sname.c2 student.

ename. The maximum size of the varray is 2 giga bytes. else dbms_output. else dbms_output. END. va2 t := t(). 143 .put_line('va2 is null').A nested table is thought of a database table which has no limit on its size. end if. Output: Hno = 11 City = hyd Hno = 22 City = bang Hno = 33 City = kochi Ex6: DECLARE type t is varray(5) of varchar(2). Elements are inserted into nested table starting at index 1.hno || ' City = ' || va(i). end loop.put_line('Hno = ' || va(i).put_line('va2 is not null'). Output: va1 is null va2 is not null NESTED TABLES:.put_line('va1 is not null'). va1 t. dbms_output. BEGIN if va1 is null then dbms_output. END. if va2 is null then dbms_output.for v in c loop select address into va(i) from employ where ename = v.city). end if.put_line('va1 is null').

put_line('Index 5 does not exists').put_line('Count = ' || nt. nt.put_line('Index 3 does not exists').last). dbms_output.put_line('First Index = ' || nt. flag := nt.put_line('After extend of one index. 144 . flag := nt.put_line('nt[' || i || '] = ' || nt(i)).'c'.exists(6).put_line('NESTED TABLE ELEMENTS'). dbms_output. Ex1: DECLARE type t is table of varchar(2).count).nt.first).limit). dbms_output. flag := nt.put_line('Index 5 exists with an element ' || nt(5)). if flag = true then dbms_output. BEGIN if nt.put_line('Next Index = ' || nt.count).next(2)). end if. else dbms_output.count loop dbms_output.exists(3).exists(5).put_line('Limit = ' || nt. for i in 1.put_line('Previous Index = ' || nt.'d')..Syntax: Type <type_name> is table of <table_type>. if flag = true then dbms_output.put_line('Index 3 exists with an element ' || nt(3)). dbms_output. end if.'b'. nt t := t('a'. else dbms_output. else dbms_output. dbms_output.put_line('No limit to Nested Tables').put_line('Last Index = ' || nt.limit is null then dbms_output. end loop. end if. dbms_output. Count = ' || nt. dbms_output.prior(3)). flag boolean.extend.

count). nt(6) := 'f'.count loop dbms_output. nt(7) := 'g'. dbms_output. dbms_output..count loop dbms_output.put_line('AFTER TRIM.nt. dbms_output.trim(3).count).count). end loop. end if. dbms_output. nt.if flag = true then dbms_output.put_line('After trim of one index. for i in 1.extend(2).put_line('Index 6 does not exists').put_line('Index 6 exists with an element ' || nt(6)). end loop. else dbms_output.count). dbms_output. Count = ' || nt..put_line('nt[' || i || '] = ' || nt(i)).put_line('AFTER ASSINGNING ELEMENTS.nt.delete(1). nt.nt.count). nt(5) := 'e'.nt.trim. dbms_output.put_line('After trim of three indexs. for i in 1. Count = ' || nt. Count = ' || nt. for i in 1. end loop. end loop.. dbms_output.count loop dbms_output.put_line('After extend of five indexes. dbms_output. nt. Count = ' || nt.put_line('After extend of two indexes. nt.extend(5.count loop dbms_output.put_line('NESTED TABLE ELEMENTS'). nt.2). Count = ' || nt. dbms_output.put_line('nt[' || i || '] = ' || nt(i)).put_line('NESTED TABLE ELEMENTS').put_line('After delete of first index. for i in 1.put_line('nt[' || i || '] = ' || nt(i)). NESTED TABLE ELEMENTS'). NESTED TABLE ELEMENTS')..put_line('nt[' || i || '] = ' || nt(i)). VALUES TO EXTENDED 145 .

dbms_output. Count = 7 NESTED TABLE ELEMENTS 146 . for i in 2.. dbms_output.delete(4)..put_line('nt[' || i || '] = ' || nt(i)). END. for i in 2.put_line('After delete of fourth index. nt.count). end loop. Output: No limit to Nested Tables Count = 4 First Index = 1 Last Index = 4 Next Index = 3 Previous Index = 2 NESTED TABLE ELEMENTS nt[1] = a nt[2] = b nt[3] = c nt[4] = d Index 3 exists with an element c After extend of one index. dbms_output..count+1 loop dbms_output. for i in 5.nt.put_line('NESTED TABLE ELEMENTS'). dbms_output. Count = 5 Index 5 exists with an element Index 6 does not exists After extend of two indexes.count+2 loop dbms_output. nt.delete. Count = ' || nt.put_line('NESTED TABLE ELEMENTS').put_line('nt[' || i || '] = ' || nt(i)). end loop.nt.put_line('nt[' || i || '] = ' || nt(i)). Count = ' || nt. end loop.put_line('After delete of entire nested table.3 loop dbms_output.count).

Count = 12 NESTED TABLE ELEMENTS nt[1] = a nt[2] = b nt[3] = c nt[4] = d nt[5] = e nt[6] = f nt[7] = g nt[8] = b nt[9] = b nt[10] = b nt[11] = b nt[12] = b After trim of one index. Count = 8 AFTER TRIM. Count = 11 After trim of three indexs. NESTED TABLE ELEMENTS nt[1] = a nt[2] = b 147 .nt[1] = a nt[2] = b nt[3] = c nt[4] = d nt[5] = nt[6] = nt[7] = AFTER ASSINGNING VALUES TO EXTENDED ELEMENTS. NESTED TABLE ELEMENTS nt[1] = a nt[2] = b nt[3] = c nt[4] = d nt[5] = e nt[6] = f nt[7] = g After extend of five indexes.

null.count loop select * into nt(i) from student where sno = i.put_line('Sno = ' || nt(i). Count = 7 NESTED TABLE ELEMENTS nt[2] = b nt[3] = c nt[4] = d nt[5] = e nt[6] = f nt[7] = g nt[8] = b After delete of fourth index. 148 . BEGIN for i in 1.null).null.nt[3] = c nt[4] = d nt[5] = e nt[6] = f nt[7] = g nt[8] = b After delete of first index. Count = 0 Ex2: DECLARE type t is table of student%rowtype. Count = 6 NESTED TABLE ELEMENTS nt[2] = b nt[3] = c nt[5] = e nt[6] = f nt[7] = g nt[8] = b After delete of entire nested table.nt. END. end loop. nt t := t(null. dbms_output.sname).sno || ' Sname = ' || nt(i)..

null..c1 || ' Smarks = ' || nt(i).nt.put_line('Sname = ' || nt(i). type t is table of r. end loop. BEGIN for i in 1.smarks%type).smarks%type. END..c2 student.null.Output: Sno = 1 Sname = saketh Sno = 2 Sname = srinu Sno = 3 Sname = divya Sno = 4 Sname = manogni Ex3: DECLARE type t is table of student.count loop select smarks into nt(i) from student where sno = i.c2). dbms_output. nt t := t(null.null.smarks into nt(i) from student where sno = i. END.put_line('Smarks = ' || nt(i)).sname%type.count loop select sname.null). Output: Smarks = 100 Smarks = 200 Smarks = 300 Smarks = 400 Ex4: DECLARE type r is record(c1 student.null.nt. nt t := t(null. end loop. dbms_output.null). BEGIN for i in 1. 149 .

end loop. nt t := t(null).city). end if. BEGIN if nt1 is null then dbms_output. Output: Hno = 11 City = hyd Hno = 22 City = bang Hno = 33 City = kochi Ex6: DECLARE type t is varray(5) of varchar(2).Output: Sname = saketh Smarks = 100 Sname = srinu Smarks = 200 Sname = divya Smarks = 300 Sname = manogni Smarks = 400 Ex5: DECLARE type t is table of addr.put_line('nt1 is null').ename. BEGIN for v in c loop select address into nt(i) from employ where ename = v. dbms_output.hno || ' City = ' || nt(i).put_line('Hno = ' || nt(i). cursor c is select * from employ. END. i number := 1.put_line('nt1 is not null'). nt2 t := t(). else dbms_output. nt1 t. 150 .

dbms_output. ibt(-20) := 'b'. 151 . else dbms_output.put_line('Last Index = ' || ibt. BEGIN ibt(1) := 'a'. dbms_output.put_line('nt2 is not null').limit is null then dbms_output.put_line('Limit = ' || ibt. dbms_output.put_line('nt2 is null'). dbms_output.put_line('First Index = ' || ibt. ibt t. dbms_output. else dbms_output.put_line('No limit to Index by Tables'). Output: nt1 is null nt2 is not null INDEX-BY TABLES:.prior(3)).put_line('Previous Index = ' || ibt.if nt2 is null then dbms_output. end if. Elements are inserted into index-by table whose index may start non-sequentially including negative integers.count). if ibt.limit). END. Syntax: Type <type_name> is table of <table_type> index by binary_integer.next(2)).put_line('Count = ' || ibt.An index-by table has no limit on its size.put_line('INDEX BY TABLE ELEMENTS'). end if.first). ibt(30) := 'c'.put_line('Next Index = ' || ibt.last). flag boolean. ibt(100) := 'd'. dbms_output. Ex: DECLARE type t is table of varchar(2) index by binary_integer.

count). if flag = true then dbms_output.put_line('Index 50 does not exists').count). dbms_output. END. Output: No limit to Index by Tables Count = 4 First Index = -20 Last Index = 100 Next Index = 30 Previous Index = 1 INDEX BY TABLE ELEMENTS 152 .put_line('Index 50 exists with an element ' || ibt(30)). dbms_output. dbms_output.dbms_output.put_line('ibt[100] = ' || ibt(100)). Count = ' || ibt.exists(50). Count = ' || ibt.put_line('After delete of index thirty. dbms_output.put_line('ibt[-20] = ' || ibt(-20)). end if.put_line('Index 30 exists with an element ' || ibt(30)).delete.put_line('INDEX BY TABLE ELEMENTS'). ibt. dbms_output. dbms_output. end if.put_line('ibt[1] = ' || ibt(1)). dbms_output. dbms_output.count). ibt. else dbms_output.put_line('Index 30 does not exists').put_line('ibt[30] = ' || ibt(30)).put_line('After delete of first index. flag := ibt. Count = ' || ibt.delete(1). flag := ibt.put_line('ibt[-20] = ' || ibt(-20)).put_line('ibt[100] = ' || ibt(100)).exists(30). else dbms_output.put_line('After delete of entire index-by table. ibt.delete(30). dbms_output. if flag = true then dbms_output.

Count = 0 DIFFERENCES AMONG COLLECTIONS y y Varrays has limit. y Referencing nonexistent elements raises SUBSCRIPT_BEYOND_COUNT in both nested tables and varrays. Nested tables and index-by tables are PL/SQL tables. Keys must be positive in case of nested tables and varrays. Count = 2 INDEX BY TABLE ELEMENTS ibt[-20] = b ibt[100] = d After delete of entire index-by table. but in index-by tables can not. in case of index-by tables keys can be positive or negative. y Individual indexes can be deleted in both nested tables and index-by tables. nested tables and index-by tables has no limit. but in index-by tables can not. y Individual indexes can be extended in both nested tables and varrays.ibt[-20] = b ibt[1] = a ibt[30] = c ibt[100] = d Index 30 exists with an element c Index 50 does not exists After delete of first index. y y y Varrays and nested tables stored in database. y Keys are sequential in both nested tables and varrays. but varrays can not. y Individual indexes can be trimmed in both nested tables and varrays. non-sequential in index-by tables. but in case of index-by tables NO_DATA_FOUND raises. in indexby tables we can directly assign elements. but in varrays can not. 153 . Count = 3 After delete of index thirty. Varrays and nested tables must be initialized before assignment of elements. but index-by tables can not.

Ex1: DECLARE type t1 is table of varchar(2) index by binary_integer.count loop va(i)(j) := chr(c).. dbms_output.count loop dbms_output.put_line('Limit = ' || va. dbms_output..Collections of more than one dimension which is a collection of collections.put_line('VARRAY ELEMENTS').count loop for j in 1. for i in 1. dbms_output. c := c + 1.prior(3)). end loop. dbms_output. BEGIN va.limit). flag boolean. Syntax: Type <type_name1> is table of <table_type> index by binary_integer.put_line('Count = ' || va..va. for i in 1.put_line('First index = ' || va..next(2)). dbms_output.MULTILEVEL COLLECTION:. known as multilevel collections.put_line('va[' || i || '][' || j || '] = ' || va(i)(j)).extend(4). 154 . dbms_output. end loop. dbms_output. end loop.va.va.put_line('Previous index = ' || va. c number := 97. end loop.first).exists(2).count loop for j in 1.last).put_line('Last index = ' || va.count). Type <type_name2> is varray(<limit>) | table | of <type_name1> | index by binary_integer.put_line('Next index = ' || va. flag := va.va. va t2 := t2(). type t2 is varray(5) of t1.

count). va(5)(5) := 'y'. va(5)(2) := 'v'.delete.put_line('After extend of one index. dbms_output.trim(2).. va(5)(4) := 'x'.va.put_line('va[' || i || '][' || j || '] = ' || va(i)(j)). Count = ' || va. for i in 1.va.put_line('Index 2 exists'). va. Count = ' || va. dbms_output.count loop dbms_output. dbms_output.count). va.va. va(2)(5) := 'r'. end loop. end loop. Count = ' || va. for i in 1. else dbms_output.put_line('After trim of two indexes. va(5)(3) := 'w'.put_line('VARRAY ELEMENTS').count loop for j in 1. end if. end loop.put_line('Index 2 exists'). 155 .count). dbms_output.put_line('va[' || i || '][' || j || '] = ' || va(i)(j)). dbms_output.extend.count).if flag = true then dbms_output.va. end loop.count loop for j in 1. va(5)(1) := 'u'. va.count loop dbms_output....put_line('After delete of entire varray.trim. va(3)(5) := 's'. END.put_line('After trim of one index. va. va(4)(5) := 't'. va(1)(5) := 'q'. dbms_output. Count = ' || va.put_line('VARRAY ELEMENTS').

Count = 5 VARRAY ELEMENTS va[1][1] = a va[1][2] = b va[1][3] = c va[1][4] = d va[1][5] = q va[2][1] = e va[2][2] = f 156 .Output: Count = 4 Limit = 5 VARRAY ELEMENTS va[1][1] = a va[1][2] = b va[1][3] = c va[1][4] = d va[2][1] = e va[2][2] = f va[2][3] = g va[2][4] = h va[3][1] = i va[3][2] = j va[3][3] = k va[3][4] = l va[4][1] = m va[4][2] = n va[4][3] = o va[4][4] = p First index = 1 Last index = 4 Next index = 3 Previous index = 2 Index 2 exists After extend of one index.

c number := 65. Count = 0 Ex2: DECLARE type t1 is table of varchar(2) index by binary_integer. Count = 4 After trim of two indexes. Count = 2 VARRAY ELEMENTS va[1][1] = a va[1][2] = b va[2][1] = e va[2][2] = f After delete of entire varray. type t2 is table of t1. v number := 1.va[2][3] = g va[2][4] = h va[2][5] = r va[3][1] = i va[3][2] = j va[3][3] = k va[3][4] = l va[3][5] = s va[4][1] = m va[4][2] = n va[4][3] = o va[4][4] = p va[4][5] = t va[5][1] = u va[5][2] = v va[5][3] = w va[5][4] = x va[5][5] = y After trim of one index. nt t2 := t2(). 157 .

put_line('Index 2 exists').count loop for j in 1. else dbms_output. end loop. dbms_output.put_line('No limit to Nested Tables').next(2)).put_line('nt[' || i || '][' || j || '] = ' || nt(i)(j)).extend(2). end if.nt.put_line('First index = ' || nt. end if.count).nt.count loop dbms_output... dbms_output.put_line('Count = ' || nt.extend(4).put_line('Next index = ' || nt. if flag = true then dbms_output. flag := nt. end loop.count loop nt(i)(j) := chr(c)..prior(3)).. dbms_output. 158 .first). c := c + 1. dbms_output.put_line('Index 2 exists').nt. for i in 1.limit is null then dbms_output.put_line('Last index = ' || nt.flag boolean. else dbms_output.count loop for j in 1. end loop. for i in 1. end if.last).exists(2).nt. nt.put_line('Previous index = ' || nt. dbms_output.put_line('Limit = ' || nt.limit). if c = 91 then c := 97. BEGIN nt.put_line('NESTED TABLE ELEMENTS'). if nt. end loop. dbms_output.

nt. nt(5)(6) := 'd'. end loop. nt(2)(6) := 'T'. Count = ' || nt.put_line('nt[' || i || '][' || j || '] = ' || nt(i)(j)). nt(5)(5) := 'c'. nt(5)(2) := 'Z'.put_line('After extend of one index.count loop for j in 1.nt.count loop for j in 1. nt(6)(5) := 'i'. for i in 1.nt(1)(5) := 'Q'. nt(1)(6) := 'R'. nt(3)(6) := 'V'. nt.count).put_line('After trim of two indexes. nt(5)(1) := 'Y'.count).put_line('After trim of one indexe..put_line('NESTED TABLE ELEMENTS'). dbms_output. nt(2)(5) := 'S'. nt(6)(1) := 'e'. dbms_output. nt(6)(4) := 'h'.trim(2). end loop. Count = ' || nt. nt(6)(6) := 'j'.put_line('nt[' || i || '][' || j || '] = ' || nt(i)(j)).trim. dbms_output. 159 .nt. for i in 1..nt... nt(6)(3) := 'g'.count loop dbms_output. nt(4)(5) := 'W'. nt(3)(5) := 'U'.count).count loop dbms_output. Count = ' || nt. nt(4)(6) := 'X'. dbms_output. nt(5)(4) := 'b'. nt(5)(3) := 'a'.nt. nt(6)(2) := 'f'. dbms_output.put_line('NESTED TABLE ELEMENTS').

nt. end if. nt.. Output: Count = 4 No limit to Nested Tables NESTED TABLE ELEMENTS nt[1][1] = A nt[1][2] = B nt[1][3] = C nt[1][4] = D nt[2][1] = E nt[2][2] = F nt[2][3] = G nt[2][4] = H nt[3][1] = I nt[3][2] = J nt[3][3] = K nt[3][4] = L 160 . dbms_output.put_line('nt[' || v || '][' || j || '] = ' || nt(v)(j)). end loop.delete(2).count). dbms_output.put_line('NESTED TABLE ELEMENTS'). Count = ' || nt. end loop.put_line('After delete of second index. END. nt.put_line('After delete of entire nested table.count+1 loop dbms_output. Count = ' || nt.end loop. dbms_output. v := v + 1. loop exit when v = 4. if v= 2 then v := 3.delete. for j in 1.count). end loop.

Count = 6 NESTED TABLE ELEMENTS nt[1][1] = A nt[1][2] = B nt[1][3] = C nt[1][4] = D nt[1][5] = Q nt[1][6] = R nt[2][1] = E nt[2][2] = F nt[2][3] = G nt[2][4] = H nt[2][5] = S nt[2][6] = T nt[3][1] = I nt[3][2] = J nt[3][3] = K nt[3][4] = L nt[3][5] = U nt[3][6] = V nt[4][1] = M nt[4][2] = N nt[4][3] = O nt[4][4] = P nt[4][5] = W nt[4][6] = X 161 .nt[4][1] = M nt[4][2] = N nt[4][3] = O nt[4][4] = P First index = 1 Last index = 4 Next index = 3 Previous index = 2 Index 2 exists After extend of one index.

Count = 5 After trim of two indexes. Count = 2 NESTED TABLE ELEMENTS nt[1][1] = A nt[1][2] = B nt[1][3] = C nt[3][1] = I nt[3][2] = J nt[3][3] = K After delete of entire nested table. Count = 3 NESTED TABLE ELEMENTS nt[1][1] = A nt[1][2] = B nt[1][3] = C nt[2][1] = E nt[2][2] = F nt[2][3] = G nt[3][1] = I nt[3][2] = J nt[3][3] = K After delete of second index.nt[5][1] = Y nt[5][2] = Z nt[5][3] = a nt[5][4] = b nt[5][5] = c nt[5][6] = d nt[6][1] = e nt[6][2] = f nt[6][3] = g nt[6][4] = h nt[6][5] = i nt[6][6] = j After trim of one indexe. Count = 0 162 .

put_line('ibt([5][1] = ' || ibt(5)(1)). dbms_output. ibt(1)(4) := 'i'. dbms_output. dbms_output.put_line('ibt([1][1] = ' || ibt(1)(1)). dbms_output. 163 . type t2 is table of t1 index by binary_integer. BEGIN dbms_output.first).put_line('Next Index = ' || ibt.put_line('ibt([3][4] = ' || ibt(3)(4)).limit is null then dbms_output. ibt(8)(3) := 'e'.limit).put_line('ibt([4][5] = ' || ibt(4)(5)).put_line('Count = ' || ibt. ibt(6)(2) := 'd'. ibt(1)(2) := 'g'. dbms_output. ibt(1)(5) := 'k'.put_line('Last Index = ' || ibt.last). dbms_output. ibt(1)(6) := 'l'. ibt t2.put_line('No limit to Index-by Tables'). dbms_output. else dbms_output. ibt(3)(4) := 'f'.put_line('INDEX-BY TABLE ELEMENTS'). if ibt.put_line('Limit = ' || ibt. ibt(1)(3) := 'h'.Ex3: DECLARE type t1 is table of varchar(2) index by binary_integer.put_line('ibt([6][2] = ' || ibt(6)(2)).count).prior(8)).put_line('ibt([8][3] = ' || ibt(8)(3)).put_line('Prior Index = ' || ibt. end if. ibt(5)(1) := 'c'. ibt(4)(5) := 'b'. flag boolean. dbms_output. ibt(1)(1) := 'a'. dbms_output.next(3)).put_line('First Index = ' || ibt. dbms_output. dbms_output.

flag := ibt.count). dbms_output. dbms_output.count). Count = ' || ibt.delete(1). dbms_output. dbms_output. dbms_output.count).ibt(1)(7) := 'm'.put_line('INDEX-BY TABLE ELEMENTS').delete(4). dbms_output.put_line('After delete of fourth index. dbms_output. end if.8 loop dbms_output.put_line('ibt[1][' || i || '] = ' || ibt(1)(i)).put_line('ibt([4][5] = ' || ibt(4)(5)). ibt. if flag = true then dbms_output. END.delete. ibt(1)(8) := 'n'. ibt.exists(3). dbms_output.put_line('INDEX-BY TABLE ELEMENTS'). else dbms_output.count). end loop.put_line('Index 3 exists').put_line('ibt([6][2] = ' || ibt(6)(2)). Count = ' || ibt. dbms_output. Output: Count = 0 No limit to Index-by Tables INDEX-BY TABLE ELEMENTS 164 .put_line('ibt([5][1] = ' || ibt(5)(1)). dbms_output.put_line('Index 3 exists'). ibt.put_line('After delete of first index. dbms_output.put_line('Count = ' || ibt.put_line('ibt([8][3] = ' || ibt(8)(3)). dbms_output.put_line('ibt([5][1] = ' || ibt(5)(1)).put_line('ibt([3][4] = ' || ibt(3)(4)).. dbms_output.put_line('ibt([8][3] = ' || ibt(8)(3)). dbms_output. for i in 1.put_line('After delete of entire index-by table. Count = ' || ibt. dbms_output.put_line('ibt([3][4] = ' || ibt(3)(4)).put_line('ibt([6][2] = ' || ibt(6)(2)).

Count = 0 165 .ibt([1][1] = a ibt([4][5] = b ibt([5][1] = c ibt([6][2] = d ibt([8][3] = e ibt([3][4] = f First Index = 1 Last Index = 8 Next Index = 4 Prior Index = 6 Count = 6 INDEX-BY TABLE ELEMENTS ibt[1][1] = a ibt[1][2] = g ibt[1][3] = h ibt[1][4] = i ibt[1][5] = k ibt[1][6] = l ibt[1][7] = m ibt[1][8] = n ibt([4][5] = b ibt([5][1] = c ibt([6][2] = d ibt([8][3] = e ibt([3][4] = f Index 3 exists After delete of first index. Count = 4 INDEX-BY TABLE ELEMENTS ibt([5][1] = c ibt([6][2] = d ibt([8][3] = e ibt([3][4] = f After delete of entire index-by table. Count = 5 After delete of fourth index.

nt. end loop.count loop for k in 1. end loop. c number := 65. dbms_output.count loop for j in 1..nt.Ex3: DECLARE type t1 is table of varchar(2) index by binary_integer.count loop nt(i)(j)(k) := chr(c). c := c + 1.count loop dbms_output.nt. end loop. BEGIN nt.. for i in 1.nt. end loop.count).nt.. for i in 1. end loop.. Output: Count = 2 NESTED TABLE ELEMENTS nt[1][1][1] = A nt[1][1][2] = B nt[1][2][1] = C 166 .count loop for k in 1. END..extend(2).count loop for j in 1.put_line('Count = ' || nt. type t2 is table of t1 index by binary_integer. type t3 is table of t2.put_line('nt[' || i || '][' || j || '][' || k || '] = ' || nt(i)(j)(k)). nt t3 := t3().nt. dbms_output.. end loop.put_line('NESTED TABLE ELEMENTS').

ERROR TYPES a. 'bang') ADDR(33. Exceptions can be associated with oracle errors or with your own user-defined errors. CITY) ADDR(11.---------- SQL> create or replace type addr as object(hno number(2). By using exceptions and exception handlers.---------. 'hyd') ADDR(22. Compile-time errors b.city varchar(10)).nt[1][2][2] = D nt[2][1][1] = E nt[2][1][2] = F nt[2][2][1] = G nt[2][2][2] = H OBJECTS USED IN THE EXAMPLES SQL> select * from student.-------------. SNO SNAME 1 2 3 4 saketh srinu divya manogni SMARKS 100 200 300 400 ---------. ENAME Ranjit Satish Srinu JOB clerk manager engineer ADDRESS(HNO. Runtime errors 167 . you can make your PL/SQL programs robust and able to deal with both unexpected and expected errors during execution. 'kochi') ---------.----------------------------- ERROR HANDLING PL/SQL implements error handling with exceptions and exception handlers./ SQL> select * from employ.

v_marks number. Because of this. EXCEPTION TYPES a. The exception section consists of handlers for some or all of the exceptions. control passes to the exception section of the block. b varchar(2). HANDLING EXCEPTIONS When exception is raised. they are already available to the program. rather than compile-time error handling. cursor c is select * from student. the identifiers of these exceptions are defined in the STANDARD package. User-defined exceptions PREDEFINED EXCEPTIONS Oracle has predefined several exceptions that corresponds to the most common oracle errors. we have to correct them. Like the predefined types. When others then Sequence_of_statements. Ex1: DECLARE a number. An exception handler contains the code that is executed when the error associated with the exception occurs. END. When exception_name then Sequence_of_statements. it is not necessary to declare them in the declarative secion. y Runtime errors are detected by the PL/SQL runtime engine which can programmatically raise and caught by exception handlers. Predefined exceptions b.y Errors that occur during the compilation phase are detected by the PL/SQL engine and reported back to the user. 168 . Syntax: EXCEPTION When exception_name then Sequence_of_statements. and the exception is raised. y Exceptions are designed for run-time error handling.

CURSOR_ALREADY_OPEN BEGIN open c. close c.put_line('Cursor is already closed'). EXCEPTION when cursor_already_open then dbms_output. close c. -.put_line('Invalid student number'). EXCEPTION when invalid_cursor then dbms_output.NO_DATA_FOUND BEGIN select smarks into v_marks from student where sno = 50. EXCEPTION when no_data_found then dbms_output. -. END. va t := t('a'.'b').type t is varray(3) of varchar(2).INVALID_CURSOR BEGIN close c. END. open c. open c. va1 t. -. END.put_line('Cursor is already opened'). EXCEPTION when too_many_rows then 169 . BEGIN -.TOO_MANY_ROWS BEGIN select smarks into v_marks from student where sno > 1.

VALUE_ERROR BEGIN b := 'saketh'.SUBSCRIPT_OUTSIDE_LIMIT BEGIN va(4) := 'c'. END. -.put_line('Invalid number').put_line('Invalid string length'). EXCEPTION when zero_divide then dbms_output. EXCEPTION when invalid_number then dbms_output.put_line('Too many values are coming to marks variable').100). -. -.'srinu'. END. -. EXCEPTION when subscript_outside_limit then dbms_output.INVALID_NUMBER BEGIN insert into student values('a'.ZERO_DIVIDE BEGIN a := 5/0. END. END. EXCEPTION 170 .put_line('Index is greater than the limit'). END. EXCEPTION when value_error then dbms_output.put_line('Divided by zero . -.dbms_output.invalid operation').SUBSCRIPT_BEYOND_COUNT BEGIN va(3) := 'c'.

COLLECTION_IS_NULL BEGIN va1(1) := 'a'. EXCEPTION when collection_is_null then dbms_output.put_line('Collection is empty'). END. Output: Invalid student number Cursor is already opened Cursor is already closed Too many values are coming to marks variable Divided by zero .put_line('Index is greater than the count'). EXCEPTION when zero_divide then dbms_output. when others then dbms_output. -END.put_line('From OTHERS handler: Invalid Operation').put_line('Invalid Operation'). 171 .when subscript_beyond_count then dbms_output. END. -. BEGIN c := 5/0. END.invalid operation Invalid string length Invalid number Index is greater than the limit Index is greater than the count Collection is empty Ex2: DECLARE c number.

For user-defined exception SQLCODE returns 1 and SQLERRM returns ³user-deifned exception´. v_dname varchar(10). END. and SQLERRM returns the current error message text. User-defined exceptions are declared in the declarative secion of a PL/SQL block.Output: Invalid Operation USER-DEFINED EXCEPTIONS A user-defined exception is an error that is defined by the programmer. Ex: DECLARE e exception.put_line('e is raised'). BEGIN -. Just like variables. exeptions have a type EXCEPTION and scope. EXCEPTION when e then dbms_output. SQLERRM wiil take only negative value except 100. BEGIN raise e. Ex1: DECLARE e exception. If any positive value other than 100 returns non-oracle exception. Output: e is raised SQLCODE AND SQLERRM SQLCODE returns the current error code.USER-DEFINED EXCEPTION 172 . RAISING EXCEPTIONS User-defined exceptions are raised explicitly via the RAISE statement.

put_line(SQLCODE || ' ' || SQLERRM). dbms_output. END. -. EXCEPTION when no_data_found then dbms_output. dbms_output. END. EXCEPTION when e then dbms_output.put_line(SQLERRM(1)). product=RDBMS. dbms_output.put_line(SQLERRM(-500)).put_line(SQLERRM(-100)). dbms_output. END. successful completion User-Defined Exception ORA-00100: no data found ORA-00500: Message 500 not found.put_line(SQLCODE || ' ' || SQLERRM). dbms_output.put_line(SQLERRM(200)). Output: 1 User-Defined Exception 100 ORA-01403: no data found Ex2: BEGIN dbms_output.put_line(SQLERRM(-900)). END.PREDEFINED EXCEPTION BEGIN select dname into v_dname from dept where deptno = 50.put_line(SQLERRM(100)).BEGIN raise e.put_line(SQLERRM(0)). facility=ORA -200: non-ORACLE exception ORA-00900: invalid SQL statement 173 . Output: ORA-01403: no data found ORA-0000: normal. dbms_output.

Output: Invalid Operation RAISE_APPLICATION_ERROR You can use this built-in function to create your own error messages. EXCEPTION when e then dbms_output. Ex: DECLARE c number. oracle_error_number). rather than via an OTHERS handler. Syntax: RAISE_APPLICATION_ERROR (error_number. END. the new error will replace the current list of errors. BEGIN c := 5/0. This gives you the ability to trap this error specifically.error_message. the new error is added to the list of errors already raised. which is default.put_line('Invalid Operation'). c number. 174 . The Boolean parameter keep_errors_flag is optional. Syntax: PRAGMA EXCEPTION_INIT(exception_name.-1476). Ex: DECLARE e exception. which can be more descriptive than named exceptions. If it is FALSE. [keep_errors_flag]). If it is TRUE. BEGIN c := 5/0.EXCEPTION_INIT PRAGMA Using this you can associate a named exception with a particular oracle error. pragma exception_init(e.

put_line('e is raised'). EXCEPTION when e then dbms_output.'Invalid Operation'). BEGIN BEGIN raise e. 175 . or the exception section of a PL/SQL block. END. END. Output: DECLARE * ERROR at line 1: ORA-20222: Invalid Operation ORA-06512: at line 7 EXCEPTION PROPAGATION Exceptions can occur in the declarative. BEGIN BEGIN raise e. EXCEPTION RAISED IN THE EXECUATABLE SECTION Exceptions raised in execuatable section can be handled in current block or outer block. END. Output: e is raised Ex2: DECLARE e exception.EXCEPTION when zero_divide then raise_application_error(-20222. Ex1: DECLARE e exception. the executable.

END. Output: ERROR at line 1: ORA-06510: PL/SQL: unhandled user-defined exception ORA-06512: at line 5 EXCEPTION RAISED IN THE DECLARATIVE SECTION Exceptions raised in the declarative secion must be handled in the outer block.put_line('Hello'). Output: ERROR at line 1: ORA-06502: PL/SQL: numeric or value error: character to number conversion error ORA-06512: at line 2 Ex2: BEGIN DECLARE c number(3) := 'abcd'. Ex1: DECLARE c number(3) := 'abcd'.put_line('Invalid string length').put_line('Invalid string length'). BEGIN dbms_output. EXCEPTION when others then dbms_output.put_line('Hello'). END. EXCEPTION 176 . EXCEPTION when others then dbms_output.END. END. BEGIN dbms_output.

177 . END. BEGIN raise e1. EXCEPTION when e1 then dbms_output. raise e2. Output: e1 is raised DECLARE * ERROR at line 1: ORA-06510: PL/SQL: unhandled user-defined exception ORA-06512: at line 9 ORA-06510: PL/SQL: unhandled user-defined exception Ex2: DECLARE e1 exception.put_line('e2 is raised'). e2 exception.when others then dbms_output. when e2 then dbms_output.put_line('From outer block: Invalid string length'). Output: From outer block: Invalid string length EXCEPTION RAISED IN THE EXCEPTION SECTION Exceptions raised in the declarative secion must be handled in the outer block. Ex1: DECLARE e1 exception. END.put_line('e1 is raised'). e2 exception.

Output: e is raised DECLARE * ERROR at line 1: ORA-06510: PL/SQL: unhandled user-defined exception ORA-06512: at line 8 ORA-06510: PL/SQL: unhandled user-defined exception 178 .put_line('e is raised').BEGIN BEGIN raise e1. END. EXCEPTION when e2 then dbms_output.put_line('e1 is raised'). raise e2.put_line('From outer block: e2 is raised'). END. Output: e1 is raised From outer block: e2 is raised Ex3: DECLARE e exception. BEGIN raise e. EXCEPTION when e1 then dbms_output. when e2 then dbms_output. EXCEPTION when e then dbms_output. raise e.put_line('e2 is raised'). END.

Sign up to vote on this title
UsefulNot useful

Master Your Semester with Scribd & The New York Times

Special offer for students: Only $4.99/month.

Master Your Semester with a Special Offer from Scribd & The New York Times

Cancel anytime.