Sie sind auf Seite 1von 605

ORACLE

ORACLE SYLABUS:
DATA BASE CONCEPTS:

WHAT IS DATABASE MANAGEMENT SYSTEMS (DBMS).


BENEFITS OFDBMS.
WHAT IS RELATONAL DATABASE MANAGEMENT SYSTEMS (RDBMS).
12RULES OFDR.E.F.CODDSRULESOFRDBMS.
DBMSV/SRDBMS.
OBJECTRELATIONALDATABASEMANAGEMENTSYSTEMS.(ORDBMS).
RDBMSVSORDBMS.
INTRODUCTION TO OODBMS.
ORDBMS VS OODBMS.
NORMALIZATION.

INSTALLATION OF ORACLE 9I:

COMPLETE INSTALATION OF ORACLE 9I ON MICROSOFT XP.


CHANGING THE DEFAULT PASSWORD FOR SYS.
POST INSTALLATION STEPS.
ACTIVATING/DEACTIVATING THE ORACLE 9I ENGINE.
DISABLING AUTOMATIC STARTUP.
MANUALLY ENABLING THE ORACLE 9I SERVICES.
CREATING USERS THROUGH THE ENTERPRISE MANAGER.
CREATING USER THROUGH SQL*PLUS.
CREATING TABLE SPACES THROUGH ENTERPRISE MANAGER.
CREATING TABLE SPACES THROUGH SQL*PLUS.

INTRODUCTION
SQL*PLUS:

OF

STRUCTURED

QUERY

LANGUAGE

(SQL)

AND

FEATURES OF SQL
FEATURES OF SQL * PLUS
SQL VS SQL*PLUS
RULES FOR SQL.
DDL, DRL, DML, TCL, DCL COMMANDS.

INTRODUCTION OF ISQL*PLUS:
NEW FEATURE OF ORACLE 9I SAME AS SQL*PLUS THAT WILL BE OPNED
ONLY IN BROWSER.
DATABASE OBJECTS:
DATABASE OBJECTS.
NAMING CONVENTIONS.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

THE CREATE TABLE STATEMENT.


DISPLAYING TABLE STRUCTURE.
THE DEFAULT OPTION.
TABLES IN ORACLE DATABASE.
QUERYING THE DATA DICTIONARY.
DATA TYPES IN ORACLE.
CREATING TABLE USING SELECT STATEMENT.
ADDING,MODIFYING,DROPING COULMNS, SET UNUSED OPTION.
DROPING TABLE.
CHANGING NAME OF A TABLE.
ADDING COMMENTS TO TABLES.

INSERTING DATA IN A TABLE:

THE INSERT STATEMENT.


ADDING A NEW ROW TO A TABLE.
INSERTING ROWS WITH NULL VALUES.
INSERTING SPECIFIC DATE VALUES,
INSERTING VALUES BY USING SUBSTITUTION VARIABLES.
CREATING ROWS FROM ANOTHER TABLE USING SELECT STATEMENT.
ORACLE 9I INSERT STATEMENTS.:
o CONDITIONAL INSERT.
o UNCONDITIONAL INSERT.
o INSERT FIRST.
o PIVOTING INSERT.

SELETING DATA IN A TABLE:

SELECT STATEMENT
SELETING ALL COLUMNS
SELECTING WITH WHERE CLAUSE,
COULMN HEADING DEFAULTS.

UPDATING DATA IN A TABLE:

THE UPDATE STATEMENT.


UPDATING ROWS IN A TABLE.
UPDATING ROWS IN A TABLE USING WHERE CLAUSE.
UPDATING WITH MULTIPLE-COLUMN SUBQUERY.
UPDATING ROWS BASED ON ANOTHER TABLE.
UPDATING TWO OR MORE COLUMNS.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

DELETING DATA IN A TABLE:

THE DELETE STATEMENT.


DELETING DATA IN A TABLE.
DELETING DATA IN A TABLE BASED ON ANOTHER TABLE.
COMMIT AND ROLL BACK STATEMENTS.
TRUNCATE DATA IN A TABLE.
DELETE VS TRUNCATE.

CONSTRAINTS:

WHAT ARE CONSTRAINTS.


DEFINING CONSTRAINTS.
NOT NULL CONSTRAINT.
UNIQUE CONSTRAINT.
PRIMARY KEY CONSTRAINT.
FOREIGN KEY CONSTRAINT.
FOREIGN KEY CONSTRAINT WITH ON DELETE CASCADE.
FOREIGN KEY CONSTRAINT WITH ON DELETE SET NULL.
CHECK CONSTRAINT.
GIVING CONSTRAINT AT COLUMN LEVEL.
GIVINGCONSTRAINTATTABLELEVEL.
GIVINGCONSTRAINTAFTERCREATIONOFTABLE.
DROPING CONSTRAINTS.
DISABLING CONSTRAINTS.
ENABLING CONSTRAINTS.
CASCADINGCONSTRAINTS.
VIEWING CONSTRAINTS.
VIEWING THE COLUMNS ASSOCIATED WITH CONSTRAINTS.

IMPORTANT OPERATORS AND FUNCTIONS:

WHERE CLAUSE.
CHARACTERSTRINGS AND DATES.
COMPARISON OPERATORS.
BETWEEN OPERATOR.
IN OPERATOR.
LIKE OPERATOR.
NULL OPERATOR.
ISNULL OPERATOR.
AND OPERATOR.
OR OPERATOR.
NOT OPERATOR.
ARITHMETIC EXPRESSIONS.
ARITHMETIC OPERATORS.
OPERATOR PRECEDENCE.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

DEFINING NULL VALUE.


NVL FUNCTION.
DEFINING A COLUMN ALIASES..
CONCATENATION OPERATOR.
DISTINCT FUNCTION.
ORDER BY CLAUSE.
SORTING BY COLUMN ALIASES.
SORTING BY MULTIPLE COLUMNS.

SQL FUNCTIONS:

CHARACTER FUNCTIONS.
NUMBER FUNCTIONS.
DATE FUNCTIONS.
EXPLICIT AND IMPLICIT DAAT TYPE CONVERSIONS.
TO_NUMBER FUNCTIONS.
TO_CHAR FUNCTIONS.
TO_DATEFUNCTIONS.
JULIAN DATE FUNTION.
SOME SPECIAL DATE FUNCTIONS.
DECODE FUNCTION.
SOUNDEX.
NULLIF
NVL2.
COALSEC.

WHAT IS JOIN.
CARTESIAN PRODUCT.
EQUI-JOIN.
NONEQUI-JOIN.
OUTER-JOIN.
SELF-JOIN.

JOINS:

SET OPERATORS:

UNION ALL.
UNION.
INTERSECT.
MINUS.

GROUP FUNCTIONS AND GROUP BY CLAUSE:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

WHAT ARE GROUP FUNCTIONS.


TYPES OF GROUP FUNCTIONS.
CREATING GROUPS OF DATA -GROUP BY CLAUSE.
HAVING CLAUSE.
ROLL UP OPERATOR.
CUBE OPERATOR.

SUBQUERIES:

USING SUB QUERIES.


TYPEOFSUB QUERIES.
SINGLE ROW SUBQUERIES WITH COMPARISON OPERATORS.
MULTI ROW SUBQUERIES.
ANY.
ALL.
FINDING 2ND HIGHEST,3RD HIGHEST AND SO ON..
EXSITS.
NOT EXSITS.
MULTI-COLUMNSUBQUERIES.
SUBQUERIESINFROM CLAUSE.
SUBQUERIES IN ORDER BY CLAUSE.
HIERARCHICAL DATA ACCESS.START WITH CONNECT BY PRIOR.
CORRELATED SUB QUERY.

SQL*PLUS COMMANDS:

SUBSTITUTION VARIABLES.
SET VERIFY ON/OFF.
& AND &&SUBSTITUTIONVARIABLES.
ACCEPT.
DEFINE,UNDEFINE COMMANDS.
SETCOMMANDVARIABLES.
SAVING CUTOMIZATIONS IN LOGIN.SQL.
SQL*PLUS EDITING COMMANDS.
SQL*PLUS FILE COMMANDS.
FORMAT COMMANDS.
COLUMN COMMANDS.
BREAK COMMAND.
TTITLE,BTITLE COMMANDS.
CREATING SAMPLE REPORT.

VIEWS:
WHAT IS VIEW.
USES OF VIEWS.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

CREATING SIMPLE VIEWS.


DML THROUGH SIMPLE VIEW.
MODIFYING VIEW.
VIEWING VIEWS IN DATABASE.
CREATING COMPLEX VIEW.
RULES FOR DML THROUGH COMPLEX VIES.
WITH CHECK OPTION.
WITH READ ONLY.
IN LINE VIEWS.
ROWNUM COLUMN.
FINDING PARTICULAR HIGHEST USING ROWNUM.
FINDING FROM X TO Y USING ROWNUM.
REMOVING VIEW.

SEQUENCES:

WHAT IS A SEQUENCE.
CREATING SEQUENCES.
NEXT VAL AN D CURR VAL STATEMENTS.
VIEWING SEQUENCES.
USING SEQUENCES FOR GENERATING UNIQUE NUMBER FOR COLUMNS.
ALTER A SEQUENCES.
REMOVING SEQUENCES.

DATABASE TUNING:

WHAT IS INDEX.
CREATING INDEX.
USES OF INDEX.
OVER VIEW ROWID.
WHEN TO CREATE AND WHEN NOT TO CREATE INDEXS.
REMOVING INDEXES.
WHAT IS SYNONYMS.
CREATING AND REMOVING SYNONYMS.
CREATING AND MANAGING CLUSTERS.
CREATING AND MANAGING SNAPSHOT.
PARTITIONING.

TRANSACTIONS:
COMMIT.
ROLLBACK.
SAVEPOINT.
CONTROLLING USER ACCESS:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

CONTROLLING USER ACCESS.


PRIVILEGES.
OBJECT AND SYSTEM PRIVILEGS.
HOW TO GRANT AND REVOKE PRIVILEGES.
GRANTING OBJECT AND SYSTEM PRIVILEGES WITH GRANT AND ADMIN
OPTIONS.
WHAT IS ROLE.
USES AND GRANTING PRIVILEGS TO ROLE.

PL SQL: (PROCEDURAL
LANGUAGE):

LANGUAGE

AND

STRUCTURED

QUERY

ABOUT PL/SQL.
BENEFITS OF PL/SQL.
PL/SQL BLOCKS.
DECLARING PL/SQL VARIABLES.
NAMING,ASSIGNING,VARIABLE INITIALIZTION OF VARIABLES.
PL/SQL RECORD STRUCTURE.
%TYPE,%ROWTYPE,LOBVARIABLES.
BIND VARIABLES, REFERENCING NON-PL/SQL VARIABLES.
DBMS_OUTPUT.PUT_LINE.
COMMENTING CODE.
SQL,PL/SQL FUNCTIONS.
PROGRAMMING GUIDE LINES.
CODE NAMING CONVENTIONS.
DETERMING VARIABLE SCOPE.

CONTROL STRUCTURES :

IF-THEN-ELSE STATEMENTS.
BASIC LOOP.
FOR LOOP.
WHILE LOOP
CASE STATEMENTS.

COMPOSITE DATATYPES:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

PL/SQL RECORDS.
%TYPE.
%ROW TYPE.
PL/SQL TABLES.

WORKING WITH IMPLICIT AND EXPLICIT CURSORS:


ABOUT CURSORS.
CURSOR ATTRIBUTES.
SQL%ISOPEN,SQL%FOUND,SQL%NOTFOUND,SQL
%ROWCOUNTFORIMPLICITCURSORS.
%ISOPEN,%FOUND,%NOTFOUND,%ROWCOUNT FOR EXPLICIT CURSORS.
VARIOUS LOOPS IN CURSORS.
CURSOR VARIABLES.
PARAMETERISED CURSORS.
WHERE CURRENT OF CLAUSE.
FOR UPDATE CLAUSE.
REF CURSORS.
CURSORS WITH SUBQUERY.
WORKING WITH EXCEPTIONS:

WHAT IS EXCEPTION.
TYPES OF EXCEPTIONS.
USER AND PREDEFINED EXCEPTIONS.
HANDLING EXCEPTIONS.
RAISE-APPLICATION-ERROR
EXCEPTION_INIT.
SQLCODE.
SQLERRM.

PL/SQL SECURITY:

ORACLE DEFAULT LOCKING.


TYPES OF LOCKS.
LEVEL OF LOCKS.
EXPLICIT LOCKING.
SELECT FOR UPDATE.
READ CONSISTENCY.

STORED PROCEDURES:
OVERVIEW OF PROCEDURES.
IMPORTANCE OF STORED PROCEDURES.
CREATING PROCEDURES.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

COMPILING PROCEDURES.
CREATING PROCEDURES WITH PARAMETERS.
IN,OUT,IN OUT PARAMETERS.
DEFAULT OPTION FOR PARAMETERS.
FORWARD DECLARATION.
OVERLOADING OF PROCEDURE.
REMOVING PROCEDURES.

STORED FUNCTIONS:

OVERVIEW OF FUNCTIONS.
IMPORTANCE OF STORED FUNCTIONS.
CREATING FUNCTIONS.
RETURN STATEMENT.
COMPILING FUNCTIONS
REMOVING FUNCTIONS..
COMPARING PROCEDURES AND FUNCTIONS.

PACKAGES:

OVERVIEW OF PACKAGES.
COMPONENTS OF PACKAGE.
IMPORTANCE OF PACKAGES.
CREATING PACKAGE SPECIFICATION.
CREATING PACKAGE BODY.
USER DEFINED PACKAGES.
REFERENCING PACKAGE OBJECTS.
ORACLE SUPPLIED PACKAGES,
GLOBAL VARIABLES.
PRAGMA RESTRICT_REFERENCES.
EXECUTE IMMEDIATE.
ORACLE BUILT IN PACKAGES.
DBMS_PIPE.
DBMS_SQL.
DBMS_DDL.
DBMS_JOB.
DBMS_OUTPUT.

CREATING DATABASE TRIGGERS:

OVER VIEW OF TRIGGERS.


CREATING AND MANAGINGTRIGGERS.
TRIGGER COMPONENTS.
FIRING SEQUENCE.
INSTEADOFTRIGGER.
ENABLING AND DISABLING TRIGGERS,

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

10

AUDIT-TRAIL USING TRIGGERS.


PROTECT DATA,REFERENTIAL INTEGRITY.
MUTATING TABLE.
GENERATION OF PRIMARY KEY USING TRIGGER.
REPLICATE A TABLE.
COMPUTE DERIVED VALUES
BENEFITS OF TRIGGERS.

MANAGING SUBPROGRAMS AND TRIGGERS:

USER_OBJECTS.
USER_SOURCE.
USER_ERRORS.
USER_TRIGGERS.
DEBUGGING USING DBMS_OUTPUT.

MANAGING DEPENDENCIES:
UNDERSTANDING DEPENDENCIES
USER_DEPENDENCIES.
FILE INPUT/OUTPUT:
PL/SQL FILE I/O
USING UTL-FILE PACKAGE.
OOPS IN ORACLE 9I:

CREATION OF OBJECTS.
USER DEFINED TYPES.
OBJECT TABLES.
OBJECT VIEWS.
DML THROUGH OBJECTS.

MANIPULATING LARGE OBJECTS:

WHAT IS LOB.
COLB.
BLOB.
NCOLB.
BFILE.
CREATING TABLES WITH LOBS.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

11

DBMS_LOB.
CREATION OF EXTERNAL TABLES.

WORKING WITH COLLECTIONS:

VARRAYS.
NESTED TABLES.
INDEX BY TABLES.
DML OPERATIONS ON NESTED TABLES.

DEVELOPMENT AND EXECUTION ENVIRONMENTS:

APPLICATION MODELS IN PL/SQL.


TWO-TIER,THREETIERMODEL.
SQL*PLUS.
RAPIDSQL.
SQL NAVIGATOR.
TOAD.
PL/SQLDEVELOPER.
SQLPROGRAMMER.
DBPARTNER DEBUGGER.
ISQL * PLUS.

ORACLE DATABASE ARCHITECTURE:


OVER VIEW OF ORACLE DATABASE.
LOGICAL AND PHYSICAL STRUCTURE.
INTRODUCTION TO INTERNET TECHNOLOGIES:

TWO TER ARCHITECTURE.


THREE-TIER ARCHITECTURE.
N-TIER ARCHITECTURE.
JAVA OBJECTS IN ORACLE. SQLJ

PROJECT:
THE ABOVE TOPICS WILL BE COVERED USING DEFAULT TABLES EMP,DEPT,SALGRADE
AND
PROJECT BASED STUDY ON BUSSINESS MODEL FOR RETAIL BANKING AND SALES
ORDER ENTRY SYSTEM.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

12

COMPLETE DATABASE OF ABOVE TWO PROJECTS WILL BE PROVIDED.


IN GENERAL IF WE WANT TO STORE EMPLOYEE INFORMATION,WE STORE AS SHOWN
BELOW:
EMPNO ENAM
E
100
PAVAN
101
102

GAYAT
RI
BALAJI

103

SMITH

JOB
CHAIRM
AN
P.S
MANAGE
R
MANAGE
R

MG
R
100
100
100

HIREDATE

SAL
30000

COM
M
10000

DEPTN
O
10

01-JAN2005
01-JAN2005
01-JAN2005
01-JAN2005

10000

1000

10

10000

1000

10

10000

1000

10

IN ORACLE WE USE TABLES TO STORE DATA.


TABLE CONTAINS COLUMNS AND ROWS.
OPENING SQL* PLUS IN ORACLE 8 :

GO TO ALL PROGRAMS
AND SELECT ORACLE FOR WINDOWS 95 AND
CLICK SQL*PLUS.
YOU GET DIALOG BOX.
TYPE SCOTT IN USERNAME AND TIGER IN PASSWORD AND PRESS ENTER.
YOU GET SQL PROMPT.

OPENING SQL* PLUS IN ORACLE 9 :

GO TO ALL PROGRAMS
AND SELECT ORACLE-ORAHOME90
SELECT APPLICATION DEVELOPMENT IN THERE CLICK SQL PLUS
AND TYPE SCOTT IN USER NAME TIGER IN PASSWORD BOX.

IN ORACLE 8 :USER CREATION:

HERE IF YOU WANT TO CREATE YOUR OWN USER YOU GO TO ALL PROGRAMS,
THERE PERSONAL ORACLE FOR WINDOWS 95
AND ORACLE NAVIGATOR.
CLICK THAT YOU WILL GET WINDOW
THERE DOUBLE CLICK PERSONAL ORACLE 8
AND DOUBLE CLICK ON LOCAL DATABASE.
YOU SEE DROP DOWN LIST.
THERE CLICK ON USER AND RIGHT CLICK ON USER AND NEW.
YOU GET WINDOW TYPE USERNAME,PASSWORD(TWICE).

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

13

YOUR USER CREATED.


THEN CLICK SQL*PLUS AS SHOWN ABOVE AND TYPE YOUR USERNAME AND
PASSWORD.
IN THE ABOVE TABLE WE TAKE EMPNO, ENAME, JOB,MGR,HIREDATE,SAL,COMM,
DEPTNO AS COLUMNS IN CREATING TABLE IN ORACLE.
CREATION OF TABLE:
SQL>CREATE TABLE EMPLOYEE_INFO
2 (EMPNO
NUMBER(10),
3 ENAME
VARCHAR2(10),
4 JOB
VARCHAR2(10),
5 MGR
NUMBER(10),
6 HIREDATE
DATE,
7 SAL
NUMBER(10),
8 COMM
NUMBER(10),
9* DEPTNO
NUMBER(10));
Table created.
IN SQL*PLUS,WE USE CL SCR TO CLEAR SCREEN.
IN SQL*PLUS,WE TYPE ED AT SQL PROMPT TO GET EDITOR,WE EDIT SQL STATEMENTS
THERE.
DESCRIBE COMMAND WILL GIVE US WITH WHAT COLUMNS WE CREATED TABLE AND
THEIR DATATYPE.
SQL> DESC EMPLOYEE_INFO
Name
EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO

Null? Type
NUMBER(10)
VARCHAR2(10)
VARCHAR2(10)
NUMBER(10)
DATE
NUMBER(10)
NUMBER(10)
NUMBER(10)

INSERTING VALUES IN TO TABLE:


SQL> INSERT INTO EMPLOYEE_INFO
2 VALUES
3 (100,'PAVAN','CHAIRMAN',NULL,'01-JAN-2005',30000,10000,10);
1 row created.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

14

WHEN EVER WE WRITE VALUES IN INSERT WE HAVE TO GIVE VALUES


FOR ALL COLUMNS.
SQL> INSERT INTO EMPLOYEE_INFO
2 VALUES
3 (101,'GAYATRI','P.S',100,'01-JAN-2005',10000,1000,10);
1 row created.
SQL> INSERT INTO EMPLOYEE_INFO
2 VALUES
3 (102,'KUMARI','MANAGER',100,'01-JAN-2005',10000,1000,10);
1 row created.
SQL> INSERT INTO EMPLOYEE_INFO
2 VALUES
3 (103,'SMITH','MANAGER',100,'01-JAN-2005',10000,1000,10);
1 row created.

IF I WANT TO INSERT INTO ONLY FEW COLUMNS THEN I WILL WRITE


LIKE THIS:
SQL> INSERT INTO EMPLOYEE_INFO
(EMPNO,ENAME,JOB,DEPTNO)
2 VALUES
3 (104,'SMITH','MANAGER',10);
1 row created.
SELECTING VALUES FROM A TABLE:
WHENEVER WE SELECT FROM THE TABLE WE GET COMPLETE INFORMATION IN A
TABLE.
SQL> SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO FROM
EMPLOYEE_INFO;
EMPNO ENAME JOB
MGR HIREDATE
SAL COMM DEPTNO
--------- ---------- ---------- --------- --------- --------- --------- --------100 PAVAN
CHAIRMAN
01-JAN-05 30000 10000
10
101 GAYATRI P.S
100 01-JAN-05 10000 1000
10
102 KUMARI MANAGER
100
01-JAN-05 10000 1000
10
103 SMITH
MANAGER
100
01-JAN-05 10000 1000
10

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

15

4 rows selected.
HERE INSTEAD OF TYPING ALL THE COLUMN NAMES WE TYPE *.
SQL> SELECT * FROM EMPLOYEE_INFO;
EMPNO ENAME
JOB
MGR HIREDATE
SAL COMM
--------- ---------- ---------- --------- --------- --------- --------- --------100 PAVAN
CHAIRMAN
01-JAN-05 30000 10000
101 GAYATRI P.S
100
01-JAN-05 10000 1000
102 KUMARI MANAGER 100 01-JAN-05 10000 1000
103 SMITH
MANAGER 100 01-JAN-05 10000 1000

DEPTNO
10
10
10
10

4 rows selected.
SELECTING WITH WHERE CLAUSE:
WHEN EVER WE SELECT USING WHERE CLAUSE WE GET PARTICULAR INFORMATION
DEPENDS ON THE COLUMN YOU SPECIFY IN WHERE CLAUSE.
SQL> SELECT * FROM EMPLOYEE_INFO
2 WHERE EMPNO=100;
EMPNO ENAME
JOB
MGR HIREDATE
SAL COMM
--------- ---------- ---------- --------- --------- --------- --------- --------100 PAVAN
CHAIRMAN
01-JAN-05
30000 10000

DEPTNO
10

1 row selected.
SQL> SELECT * FROM EMPLOYEE_INFO
2 WHERE ENAME='GAYATRI';
EMPNO ENAME
JOB
MGR HIREDATE
SAL COMM DEPTNO
--------- ---------- ---------- --------- --------- --------- --------- --------101 GAYATRI P.S
100 01-JAN-05 10000 1000
10
1 row selected.
UPDATE STATEMENT:
WHILE UPDATING A TABLE IF YOU DONT GIVE WHERE CLAUSE WHOLE TABLE WILL
BE UPDATED.
SQL> UPDATE EMPLOYEE_INFO
2 SET SAL= SAL+1000;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

16

4 rows updated.
SQL> SELECT * FROM EMPLOYEE_INFO;
EMPNO ENAME JOB
MGR HIREDATE
SAL COMM DEPTNO
--------- ---------- ---------- --------- --------- --------- --------- --------100 PAVAN
CHAIRMAN
01-JAN-05 31000 10000
10
101 GAYATRI P.S
100 01-JAN-05 11000 1000
10
102 KUMARI MANAGER 100 01-JAN-05 11000 1000
10
103 SMITH
MANAGER 100 01-JAN-05 11000 1000
10
4 rows selected.
UPDATE TABLE USING WHERE CLAUSE:
WHEN EVER WE GIVE WHERE CLAUSE IN UPDATION ONLY THAT COLUMN
CORESSPONDING ROWS WILL BE UPDATED.
SQL> UPDATE EMPLOYEE_INFO
2 SET SAL= SAL+1000
3 WHERE EMPNO=100;
1 row updated.
SQL> SELECT * FROM EMPLOYEE_INFO;
EMPNO ENAME
JOB
MGR
HIREDATE
DEPTNO
--------- ---------- ---------- --------- --------- --------- --------- --------100 PAVAN
CHAIRMAN
01-JAN-05
101 GAYATRI P.S
100
01-JAN-05
102 KUMARI MANAGER
100
01-JAN-05
103 SMITH
MANAGER
100
01-JAN-05

SAL
32000
11000
11000
11000

COMM
10000
1000
1000
1000

10
10
10
10

4 rows selected.
SQL> UPDATE EMPLOYEE_INFO
2 SET SAL= SAL+1000
3 WHERE ENAME='GAYATRI';
1 row updated.
SQL> SELECT * FROM EMPLOYEE_INFO;
EMPNO ENAME
JOB
MGR HIREDATE
SAL COMM DEPTNO
--------- ---------- ---------- --------- --------- --------- --------- --------100 PAVAN
CHAIRMAN
01-JAN-05 32000 10000 10
101 GAYATRI P.S
100 01-JAN-05 12000 1000
10
102 KUMARI MANAGER 100 01-JAN-05 11000 1000
10

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
103 SMITH

MANAGER

17

100 01-JAN-05

11000

1000

10

4 rows selected.

DELETING DATA FROM A TABLE:


IF YOU WANT TO DELETE INFO FROM A TABLE,HERE IF YOU WONT SPECIFY THE
WHERE CLAUSE WHOLE TABLE INFO WILL BE DELETED.
SQL> DELETE FROM EMPLOYEE_INFO
2 WHERE EMPNO=102;
1 row deleted.
SQL> SELECT * FROM EMPLOYEE_INFO;
EMPNO ENAME
JOB
MGR HIREDATE
SAL COMM DEPTNO
--------- ---------- ---------- --------- --------- --------- --------- --------100 PAVAN
CHAIRMAN
01-JAN-05 32000 10000
10
101 GAYATRI P.S
100 01-JAN-05 12000 1000
10
103 SMITH
MANAGER 100 01-JAN-05 11000 1000
10
3 rows selected.
SQL> DELETE FROM EMPLOYEE_INFO
2 WHERE ENAME='SMITH';
1 row deleted.
SQL> SELECT * FROM EMPLOYEE_INFO;
EMPNO ENAME
JOB
MGR HIREDATE
SAL COMM DEPTNO
--------- ---------- ---------- --------- --------- --------- --------- --------100 PAVAN
CHAIRMAN
01-JAN-05 32000 10000
10
101 GAYATRI P.S
100 01-JAN-05 12000 1000
10
2 rows selected.
HERE IF YOU WANT TO DELETE ALL EMPLOYEES WE USE THIS STATEMENT.
IF YOU DONT SPECIFY WHERE IN DELETE COMPLETE TABLE WILL BE DELETED.
SQL> DELETE FROM EMPLOYEE_INFO;
2 rows deleted.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

18

CREATING TABLE WITH SELECT STATEMENT:


IF YOU WANT TO CREATE SAME TABLE AS EMPLOYEE_INFO WITH DATA,
WE USE BELOW STATEMENT:
CREATE TABLE EMP
AS
SELECT * FROM EMPLOYEE_INFO;
HERE EMP TABLE HAS SAME COLUMNS AS THAT OF EMPLOYEE_INFO AND EMP HAS
SAME DATA THAT OF EMPLOYEE_INFO.HERE BOTH ARE SAME TABLES.
IF YOU WANT TO CREATE TABLE WITH SELETED COLUMNS THAT OF
EMPLOYEE_INFO WITH DATA FOR THAT COLUMNS,WE USE BELOW
STATEMENT:
CREATE TABLE EMP
AS
SELECT EMPNO,ENAME FROM EMPLOYEE_INFO;
HERE EMP TABLE CREATED WITH EMPNO,ENAME COLUMNS AND DATA FOR THAT
COLUMNS FROM EMPLOYEE_INFO TABLE.
IF YOU WANT TO CREATE TABLE WITH SELETED COLUMNS THAT OF
EMPLOYEE_INFO WITH DATA FOR THAT COLUMNS WITH YOUR OWN
NAME FOR COLUMNS,WE USE BELOW STATEMENT:
CREATE TABLE EMP
(EMPLOYEE_NO,EMPLOYEE_NAME)
AS
SELECT EMPNO,ENAME FROM EMPLOYEE_INFO;
HERE EMP TABLE CREATED WITH COLUMNS EMPNO,ENAME BUT THEIR HEADINGS
WILL BE EMPLOYEE_NO,EMPLOYEE_NAME.

INSERTING VALUES WITH SELECT STATEMENT:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

19

INSERT INTO EMP


SELECT * FROM EMPLOYEE_INFO;
HERE BOTH EMP,EMPLOYEE_INFO TABLES SHOULD HAVE SAME STRUCTURE.
MOST IMPORTANT TABLES IN ORACLE DATABASE:
IN USER SCOTT WE HAVE THREE IMPORTANT TABLES THOSE ARE
EMP
DEPT
SALGRADE.
DELETE VS TRUNCATE:

SQL> SELECT * FROM EMPLOYEE_INFO;


EMPNO ENAME
JOB
MGR
HIREDATE
SAL COMM DEPTNO
100
PAVAN
CHAIRMAN
01-JAN-05 32000 10000
10
101 GAYATRI P.S
100 01-JAN-05 12000 1000
10
SQL> DELETE FROM EMPLOYEE_INFO;
2 rows deleted.
SQL> SELECT * FROM EMPLOYEE_INFO;
no rows selected
SQL> ROLL BACK;
Rollback complete.

SQL> SELECT * FROM EMPLOYEE_INFO;


EMPNO ENAME
JOB
MGR
HIREDATE
100 PAVAN
CHAIRMAN
01-JAN-05 32000
101 GAYATRI P.S
100 01-JAN-05 12000

I Soft Solutions ,Bang-54.

SAL
10000
1000

COMM DEPTNO
10
10

STRUCTURED QUERY LANGUAGE

ORACLE

20

SQL> DELETE FROM EMPLOYEE_INFO;


2 ROWS DELETED.
SQL> COMMIT;
COMMIT COMPLETE.
SQL> ROLL BACK;
ROLLBACK COMPLETE.
SQL> SELECT * FROM EMPLOYEE_INFO;
NO ROWS SELECTED
SQL> INSERT INTO EMPLOYEE_INFO
2 VALUES
3 (100,'PAVAN','CHAIRMAN',NULL,'01-JAN-05',32000,10000,10);
1 ROW CREATED.
SQL> COMMIT;
COMMIT COMPLETE.
SQL> SELECT * FROM EMPLOYEE_INFO;
EMPNO ENAME
JOB
MGR HIREDATE
SAL COMM DEPTNO
--------- ---------- ---------- --------- --------- --------- --------- --------100 PAVAN
CHAIRMAN
01-JAN-05 32000 10000
10
SQL> TRUNCATE TABLE EMPLOYEE_INFO;
TABLE TRUNCATED.
SQL> ROLL BACK;
ROLLBACK COMPLETE.
SQL> SELECT * FROM EMPLOYEE_INFO;
NO ROWS SELECTED
IN TRUNCATE TABLE THE WHOLE INFORMATION WIIL BE DELETED PERMENENTLY.
BUT IN CASE OF DELETE THE INFORMATION WILL BE GET BACK AFTER ROLL BACK.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

21

BUT AFTER DELETE IF YOU TYPE COMMIT. THEN INFORMATION WILL BE DELETED
PERMENENTLY.
DELETE +COMMIT = TRUNCATE.

ORDER BY CLAUSE:
WE CAN RETRIVE DATA EITHER IN ASCENDING ORDER OR IN DESCENDING ORDER
BY USING ORDER BY CLAUSE:
FOR RETRIVING DATA IN ASCENDING ORDER:
SELECT ENAME , SAL FROM EMP ORDER BY SAL ASC ;
SELECT ENAME , SAL FROM EMP ORDER BY SAL ; DEFAULT IS ASCENDING ORDER.
FOR RETRIVING DATA IN DESCENDING ORDER:
SELECT ENAME,SAL FROM EMP ORDER BY SAL DESC ;
WE CAN RETRIVE ONE PARTICULAR
AND SPECIFIC TYPE OF DATA BY USING
THE KEY WORD LIKE:

SELECT ENMAE ,JOB,SAL FROM EMP WHERE DEPTNO LIKE 10;


SELECT ENAME,SAL,DEPTNO FROM EMP WHERE JOB LIKE CLERK ;
WE CAN RETRIVE MORE
SPECIFIC DATA BY USING
LIKE AND SYMBOLS % , _ :
% REPRESENTS GROUP OF CHARACTERS .
_ REPRESENTS SINGLE CHARACTER .
TO GET EMPLOYEES WITH S LETTER IN THE FIRST OF THEIR NAME:
SELECT * FROM EMP WHERE ENAME LIKE S% ;
TO GET EMPLOYEES WITH S LETTER IN THE LAST OF THEIR NAME:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

22

SELECT * FROM EMP WHERE JOB LIKE %S ;


TO GET EMPLOYEES WITH S LETTER IN THEIR NAME:
SELECT * FROM EMP WHERE ENAME LIKE %S% ;
TO GET EMPLOYEES WITH FOUR LETTERS:
SELECT * FROM EMP WHERE ENAME LIKE ____ ;
TO GET EMPLOYEES WITH SECOND LETTER A:
SQL> SELECT * FROM EMP WHERE ENAME LIKE '_A___';
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7900 JAMES
CLERK
7698 03-DEC-81
950
30

DEPTNO

TO GET EMPLOYEES WITH THIRD LETTER I:

SQL> SELECT * FROM EMP WHERE ENAME LIKE '__I__';


EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
20

DEPTNO

TO GET EMPLOYEES WITH THIRD AND FOURTH LETTERS AS NE:


SQL> SELECT * FROM EMP WHERE ENAME LIKE '__NE_';
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7566 JONES
MANAGER
7839 02-APR-81
2975
20
TO GET EMPLOYEES WITH HIREDATE IN THE YEAR 81:
1* SELECT * FROM EMP WHERE HIREDATE LIKE '%81'
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
300
30
7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
30

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

23

7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7839 KING
PRESIDENT
17-NOV-81
5000
7844 TURNER SALESMAN
7698 08-SEP-81
1500
7900 JAMES
CLERK
7698 03-DEC-81
950
7902 FORD
ANALYST
7566 03-DEC-81
3000

20
30
30
10
10
30

1400

0
30
20

10 ROWS SELECTED.
TO GET EMPLOYEES WITH HIREDATE IN THE MONTH FEB:
SELECT * FROM EMP WHERE HIREDATE LIKE '%FEB%';
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
300
30
7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
30

TO GET EMPLOYEES WITH HIREDATE - IN THEIR DATE:


1* SELECT * FROM EMP WHERE HIREDATE LIKE '%-%'
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
7521 WARD
SALESMAN
7698 22-FEB-81
1250
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT ANALYST
7566 19-APR-87
3000
7839 KING
PRESIDENT
17-NOV-81
5000
7844 TURNER SALESMAN
7698 08-SEP-81
1500
7876 ADAMS
CLERK
7788 23-MAY-87
1100
7900 JAMES
CLERK
7698 03-DEC-81
950
7902 FORD
ANALYST
7566 03-DEC-81
3000
7934 MILLER
CLERK
7782 23-JAN-82
1300

COMM
300
500
1400

DEPTNO

20
30
30
20
30
30
10
20
10
30
20
30
20
10

14 ROWS SELECTED.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

24

TO GET EMPLOYEES WITH 8 IN LAST IN THEIR EMPNO:


1* SELECT * FROM EMP WHERE EMPNO LIKE '%8'
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7698 BLAKE
MANAGER
7839 01-MAY-81
2850
30
7788 SCOTT ANALYST
7566 19-APR-87
3000
20

DISTINCT:
WE CAN SUPPRESS DUPLICATE ROWS WHILE SELECTING DATA BY USING THE KEY
WORD DISTINCT:
SELECT DISTINCT (JOB) FROM EMP;
HERE WE GET JOBS WITHOUT DUPLICATES.
SQL> SELECT JOB FROM EMP;
JOB
--------CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
14 rows selected.
SQL> SELECT DISTINCT(JOB) FROM EMP;
JOB
--------ANALYST

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

25

CLERK
MANAGER
PRESIDENT
SALESMAN
CONSTRAINTS:
CONSTRAINTS MEAN RESTRICTIONS. IN ORACLE CONSTRAINTS PREVENT INVALID
DATA ENTRY INTO TABLES.
FOLLOWING ARE THE DIFFERENT TYPES OF CONSTRAINTS: NOT NULL.
UNIQUE.
PRIMARY KEY.
FOREIGN KEY.
CHECK.
NOT NULL:
IT DOES NOT ALLOW NULL VALUES INTO COLUMNS.
CONSTRAINT AT COLUMN LEVEL:
CREATE TABLE EMP
( EMPNO NUMBER (9) NOT NULL,
ENAME VARCHAR(9)) ;
SQL> CREATE TABLE EMPLOYEE
2 (EMPNO NUMBER(10),
3 ENAME VARCHAR2(10));
Table created.
SQL> INSERT INTO EMPLOYEE
2 VALUES
3 (1,'PAVAN');
1 row created.
1 INSERT INTO EMPLOYEE
2 VALUES
3* (NULL,'KUMAR')

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

26

SQL> /
1 row created.
1 INSERT INTO EMPLOYEE
2 VALUES
3* (3,NULL)
SQL> /
1 row created.
SQL> SELECT * FROM EMPLOYEE;
EMPNO ENAME
---------- ---------1 PAVAN
KUMAR
3
IN THE ABOVE OUTPUT ONCE EMPNO IS NULL FOR KUMAR AND ONCE ENAME IS
NULL FOR EMPNO 3.
THIS KIND FOR DATA WRONG DATA WE HAVE TO STOP WHILE INSERTING DATA IN TO
THE TABLE.
FOR THIS WE USE NOT NULL CONSTRAINT ON COLUMNS WHERE U WANT STOP NULL
VALUES.
DROP TABLE EMPLOYEE;
Table dropped.
SQL> CREATE TABLE EMPLOYEE
2 (EMPNO NUMBER(10) NOT NULL,
3 ENAME VARCHAR2(10) NOT NULL);
Table created.
SQL> INSERT INTO EMPLOYEE
2 VALUES
3 (NULL,'KUMAR');
INSERT INTO EMPLOYEE
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."EMPLOYEE"."EMPNO")
SQL> INSERT INTO EMPLOYEE
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

27

2 VALUES
3 (3,NULL);
INSERT INTO EMPLOYEE
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."EMPLOYEE"."ENAME")
ABOVE WE KEPT NOT NULL FOR BOTH EMPNO,ENAME AND TRIED TO INSERT NULL
VALUES IN TO BOTH COLUMNS BUT IT HAS NOT ACCEPTED.
IF YOU WANT TO MAKE ANY COLUMN TO ENTER VALUE FOR THAT COLUMN
COMPLUSORY THEN WE HAVE TO KEEP NOT NULL FOR THAT COLUMN.
WE CANNOT KEEP NOT NULL AT THE TIME OF TABLE CREATION AT TABLE LEVEL.
WE CAN ADD CONSTRAINT NOT NULL AFTER CREATION OF TABLE.

UNIQUE:
IT DOES NOT ALLOW DUPLICATE VALUES IN COLUMNS.

CONSTRAINT AT COLUMN LEVEL:


CREATE TABLE EMP
( EMPNO NUMBER (9) UNIQUE ,
ENAME VARCHAR(9)) ;
CONSTRAINT AT TABLE LEVEL:
CREATE TABLE EMP
EMPNO NUMBER (9) ,
ENAME VARCHAR2(9),
CONSTRAINT EMP_UNI UNIQUE ( EMPNO) ;
SQL> DROP TABLE EMPLOYEE;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

28

Table dropped.
SQL> CREATE TABLE EMPLOYEE
2 (EMPNO NUMBER(10),
3 ENAME VARCHAR2(10));
Table created.
SQL> INSERT INTO EMPLOYEE
2 VALUES
3 (1,'PAVAN');
1 row created.
1 INSERT INTO EMPLOYEE
2 VALUES
3* (1,'PAVAN')
SQL> /
1 row created.
1 INSERT INTO EMPLOYEE
2 VALUES
3* (2,'KUMAR')
SQL> /
1 row created.
1 INSERT INTO EMPLOYEE
2 VALUES
3* (3,'KUMAR')
SQL> /
1 row created.

1 INSERT INTO EMPLOYEE


2 VALUES
3* (1,'PAVAN')
SQL> /
1 row created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

29

1 INSERT INTO EMPLOYEE


2 VALUES
3* (1,'PAVAN')
SQL> /
1 row created.
SQL> SELECT * FROM EMPLOYEE;
EMPNO ENAME
---------- ---------1 PAVAN
1 PAVAN
2 KUMAR
3 KUMAR
1 PAVAN
1 PAVAN
6 rows selected.
HERE IF YOU WANT SELECT ONLY PAVAN'S RECORD WE HAVE TO QUERY LIKE THIS
SQL> SELECT * FROM EMPLOYEE WHERE ENAME='PAVAN';
EMPNO ENAME
---------- ---------1 PAVAN
1 PAVAN
1 PAVAN
1 PAVAN

BUT WE WANT PARTICULAR PAVAN'S RECORD. HERE IT IS NOT POSSIBLE. THIS IS


WRONG DATA ENTERED IN TO THE TABLE.
IN REAL TIME WE HAVE SAME NAME EMPLOYEES IN AN ORAGANIZATION, THEN
WHAT WE SHOULD DO IS WE GIVE EACH ONE ONE UNIQUE NUMBER THAT IS
EMPLOYEE ID.
HERE ALSO WE MAKE EMPNO HAS UNIQUE, THAT IS EMPNO COLUMN SHOLD NOT
ALLOW US TO ENTER DUPLICATE VALUES.
FOR DOING THAT WE USE UNIQUE CONSTRAINT.
SQL> DROP TABLE EMPLOYEE;
Table dropped.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

30

SQL> CREATE TABLE EMPLOYEE


2 (EMPNO NUMBER(10) UNIQUE,
3 ENAME VARCHAR2(10));
Table created.
SQL> INSERT INTO EMPLOYEE
2 VALUES
3 (1,'PAVAN');
1 row created.
HERE 1 IS ASSIGNED TO PAVAN, IF FOR ANY EMPLOYEE IF U WANT TO GIVE EMPNO AS
1 IT WON'T ACCEPT.
SQL> INSERT INTO EMPLOYEE
2 VALUES
3 (1,'PAVAN');
INSERT INTO EMPLOYEE
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.SYS_C002751) violated
HERE IF YOU TRIES TO ASSIGN SAME NUMBER FOR PAVAN THAT IS WRONG BECAUSE
WE KEPT UNIQUE CONSTRAINT ON EMPNO.
IT ACCEPTS IF YOU GIVE 2 FOR NEXT PAVAN.
1 INSERT INTO EMPLOYEE
2 VALUES
3* (2,'PAVAN')
SQL> /
1 row created.
HERE UNIQUE CONSTRAINT HAS PROBLEM. THAT IS IT ALLOWS NULL VALUES.

SQL> INSERT INTO EMPLOYEE


2 VALUES
3 (NULL,'PAVAN');
1 row created.
SQL> SELECT * FROM EMPLOYEE;
EMPNO ENAME
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

31

---------- ---------1 PAVAN


2 PAVAN
PAVAN
SQL> THIS IS WRONG WITH UNIQUE.
TO DO ABOVE PROBLEM CORRECTLY WE GO FOR ANOTHER CONSTRAINT CALLED
PRIMARY KEY.
WHICH ACTS AS BOTH NOT NULL AND UNIQUE.

PRIMARY KEY:
IT DOES NOT ALLOW EITHER NULL VALUES OR DUPLICATE VALUES IN TO THE
COLUMNS ( IT SIMULTANEOUSLY FUNCTIONS BOTH AS NOT NULL AND UNIQUE
)
CONSTRAINT AT COLUMN LEVEL:
CREATE TABLE EMP
( EMPNO NUMBER (9) PRIMARY KEY,
ENAME VARCHAR2(9)) ;
CONSTRAINT AT TABLE LEVEL:
CREATE TABLE EMP
(EMPNO NUMBER(9),
ENAME VARCHAR2(9),
DEPTNO NUMBER(9),
CONSTRAINT EMPW_PK PRIMARY KEY (EMPNO)) ;
SQL> DROP TABLE EMPLOYEE;
Table dropped.
SQL> CREATE TABLE EMPLOYEE
2 (EMPNO NUMBER(10) PRIMARY KEY,
3 ENAME VARCHAR2(10));
Table created.
SQL> INSERT INTO EMPLOYEE
2 VALUES

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

32

3 (1,'PAVAN');
1 row created.
1 INSERT INTO EMPLOYEE
2 VALUES
3* (1,'PAVAN')
SQL> /
INSERT INTO EMPLOYEE
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.SYS_C002752) violated
ABOVE IT ACTED AS UNIQUE CONSTRAINT THAT MEANS IT STOPPED DUPLICATE
VALUES.
SQL> INSERT INTO EMPLOYEE
2 VALUES
3 (NULL,'PAVAN');
INSERT INTO EMPLOYEE
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."EMPLOYEE"."EMPNO")
OUR PROBLEM SLOVED.
HERE WE CAN GIVE NAME FOR CONSTRAINT,IF YOU DON'T GIVE NAME FOR
CONSTRAINT SYSTEM WILL AUTOMATICALLY ASSIGNS A UNIQUE NUMBER CALLED
SYS_UNIQUE NUMBER.
INSERT INTO EMPLOYEE
2 VALUES
3 (1,'PAVAN');
INSERT INTO EMPLOYEE
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.SYS_C002752) violated
SQL> DROP TABLE EMPLOYEE;
Table dropped.
SQL> CREATE TABLE EMPLOYEE
2 (EMPNO NUMBER(10) CONSTRAINT EMPLOYEE_PK PRIMARY KEY,
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

33

3 ENAME VARCHAR2(10));
Table created.
SQL> INSERT INTO EMPLOYEE
2 VALUES
3 (1,'PAVAN');
1 row created.
SQL> INSERT INTO EMPLOYEE
2 VALUES
3 (1,'PAVAN');
INSERT INTO EMPLOYEE
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.EMPLOYEE_PK) violated
WE CAN ALSO GIVE PRIMARY KEY FOR 2 COLUMNS:
CREATE TABLE EMP
(EMPNO NUMBER(9),
ENAME VARCHAR2(9),
DEPTNO NUMBER(9),
CONSTRAINT EMP_PK1 PRIMARY KEY (EMPNO,ENAME));
CHECK CONSTRAINT:
IT IS ALSO CALLED BUSINESS RULE CONSTRAINT.
CONSTRAINT AT COLOUMN LEVEL:
CREATE TABLE BANK
(ACC_NO NUMBER(9),
NAME VARCHAR2(9),
BALANCE NUMBER(9) CHECK(BALANCE >=1000),
ADDRESS VARCHAR2(9));
CONSTRAINT AT TABLE LEVEL:

CREATE TABLE BANK


(ACC_NO NUMBER(9),
NAME VARCHAR2(9),
BALANCE NUMBER(9),
ADDRESS VARCHAR2(9),
CONSTRAINT BANK_CHEK CHECK(BALANCE >=1000));

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

34

SQL> CREATE TABLE BANK


2 (ACC_NO NUMBER(10),
3 BALANCE NUMBER(10));
Table created.
SQL> INSERT INTO BANK
2 VALUES
3 (1,1000);
1 row created.
1 INSERT INTO BANK
2 VALUES
3* (2,2000)
SQL> /
1 row created.

1 INSERT INTO BANK


2 VALUES
3* (3,500)
SQL> /
1 row created.
HERE WE WANT STOP SOME ONE ENTERING BELOW 1000 IN BALANCE COLUMN, FOR
THAT WE KEEP CHECK CONSTRAINT ON COLUMN BALANCE.
SQL> DROP TABLE BANK;
Table dropped.
SQL> CREATE TABLE BANK
2 (ACC_NO NUMBER(10),
3 BALANCE NUMBER(10) CHECK(BALANCE > 1000));
Table created.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

35

SQL> INSERT INTO BANK


2 VALUES
3 (1,1000);
INSERT INTO BANK
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.SYS_C002758) violated

SQL> INSERT INTO BANK


2 VALUES
3 (2,2000);
1 row created.
SQL> INSERT INTO BANK
2 VALUES
3 (3,500);
INSERT INTO BANK
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.SYS_C002758) violated
HERE CHECK CONSTRAINT STOPED US FROM ENTERING BELOW 1000.
SQL> DROP TABLE BANK;
Table dropped.
SQL> CREATE TABLE BANK
2 (ACC_NO NUMBER(10),
3 BALANCE NUMBER(10),
4 CONSTRAINT BANK_CK CHECK(BALANCE > 1000));
Table created.
SQL> DROP TABLE BANK;
Table dropped.
SQL> CREATE TABLE BANK
2 (ACC_NO NUMBER(10),
3 BALANCE NUMBER(10));

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

36

Table created.
SQL> ALTER TABLE BANK
2 ADD CONSTRAINT BANK_CK CHECK(BALANCE > 1000);
Table altered.
FOREIGN KEY:
FOREIGN KEY ESTABLISHES RELATIONSHIPS BETWEEN TABLES. A FOREIGN KEY IS A
COLOUMN WHOSE VALUES ARE DERIVED FROM THE PRIMARY KEY OR UNIQUE KEY
OF SOME OTHER TABLE.

CONSTRAINT AT COLOUMN LEVEL:


CREATE TABLE EMP
(EMPNO NUMBER(9),
ENAME VARCHAR2(9),
DEPTNO NUMBER(9) REFERENCES DEPT(DEPTNO));
CONSTRAINT AT TABLE LEVEL:
CREATE TABLE EMP
(EMPNO NUMBER(9),
ENAME VARCHAR2(9),
DEPTNO NUMBER(9),
CONSTRAINT EMP_FK FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO));
NOTE: THE DEPTNO OF DEPT TABLE MUST HAVE PRIMARY KEY OR
UNIQUE KEY.

SQL> CREATE TABLE EMP1


2 AS
3 SELECT * FROM EMP;
Table created.
SQL> CREATE TABLE DEPT1
2 AS
3 SELECT * FROM DEPT;
Table created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

37

SQL> SELECT * FROM EMP1;


EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
7521 WARD
SALESMAN
7698 22-FEB-81
1250
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT ANALYST
7566 19-APR-87
3000
7839 KING
PRESIDENT
17-NOV-81
7844 TURNER SALESMAN
7698 08-SEP-81
7876 ADAMS
CLERK
7788 23-MAY-87
1100
7900 JAMES
CLERK
7698 03-DEC-81
950
7902 FORD
ANALYST
7566 03-DEC-81
3000
7934 MILLER CLERK
7782 23-JAN-82
1300

COMM
300
500
1400

5000
1500

DEPTNO
20
30
30
20
30
30
10
20
0
20
30
20
10

10
30

14 rows selected.
HERE IF I ENTER IN TO EMP1 EMPLOYEES IN DEPTNO 50,60,70 LIKE BELOW
1 INSERT INTO EMP1
2 VALUES
3* (1,'PAVAN','MANAGER',7369,'01-DEC-81',1000,1000,50)
SQL> /
1 row created.
1 INSERT INTO EMP1
2 VALUES
3* (2,'KUMAR','MANAGER',7369,'01-DEC-81',1000,1000,60)
SQL> /
1 row created.
1 INSERT INTO EMP1
2 VALUES
3* (3,'GAYATRI','MANAGER',7369,'01-DEC-81',1000,1000,70)
SQL> /
1 row created.
SQL> SELECT * FROM EMP1;
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------I Soft Solutions ,Bang-54.

DEPTNO

STRUCTURED QUERY LANGUAGE

ORACLE
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER
1 PAVAN
2 KUMAR
3 GAYATRI

CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
MANAGER
MANAGER
MANAGER

38

7902 17-DEC-80
7698 20-FEB-81
7698 22-FEB-81
7839 02-APR-81
7698 28-SEP-81
7839 01-MAY-81
7839 09-JUN-81
7566 19-APR-87
17-NOV-81
7698 08-SEP-81
7788 23-MAY-87
7698 03-DEC-81
7566 03-DEC-81
7782 23-JAN-82
7369 01-DEC-81
7369 01-DEC-81
7369 01-DEC-81

800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300
1000
1000
1000

300
500
1400

1000
1000
1000

20
30
30
20
30
30
10
20
10
30
20
30
20
10
50
60
70

17 rows selected.
HERE IF U OBSERVE DEPTNO COLUMN IN EMP1 TABLE, IF ANY ONE ASKS WHAT IS
THE NAME OF
DEPARTMENT NUMBER 20, U WILL QUERY DEPT1 TABLE LIKE THIS

SQL> SELECT * FROM DEPT;


DEPTNO DNAME
LOC
---------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS
BOSTON
AND SAYS RESEARCH IS NAME, NOW U TELL ME WHAT IS THE NAME OF
DEPARTMENT 50.
HERE CLEALY U CAN SAY THERE IS NO DEPARTMENT NO 50 EXISTING IN DEPT1
TABLE. THAT IS WE CANNOT FIND OUT THE DNAME FOR DEPTNO 50. THAT IS THIS IS
WRONG INFO U ENTERED IN TO EMP1 TABLE. U HAVE TO STOP THIS BY USING
FOREIGN KEY.
THAT IS YOU HAVE TO TELL ORACLE THAT BEFORE ACCEPTING A VALUE IN EMP1
TABLE DEPTNO COLUMNYOU PLEASE KINDLY SEARCH DEPT1 TABLE DEPTNO
COLUMN IF ENTERED NUMBER IS THERE IN DEPTNO COLUMN OF DEPT TABLE U
ACCEPT THAT NUMBER TO ENTER IN TO EMP1 TABLE DEPTNO COLUMN OTHERWISE
RAISE ERROR.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

39

HERE WE ASKING ORACLE TO REFER DEPT1 TABLE DEPTNO THAT IS WHY DEPT1
TABLE IS PARENT TABLE AND EMP1 IS CHILD TABLE.
FOR DOING ABOVE THING WE HAVE TO KEEP FOREIGN KEY FOR EMP1 TABLE DEPTNO
AND PRIMARY KEY FOR DEPT1 TABLE DEPTNO COLUMN.
FIRST U HAVE TO KEEP PRIMARY KEY FOR DEPT1 TABLE DEPTNO AND THEN FOREIGN
KEY FOR EMP TABLEDEPTNO LIKE BELOW.
SQL> ALTER TABLE DEPT1
2 ADD CONSTRAINT DEPT1_PK PRIMARY KEY(DEPTNO);
Table altered.
SQL> ALTER TABLE EMP1
2 ADD CONSTRAINT EMP1_FK FOREIGN KEY(DEPTNO) REFERENCES
DEPT1(DEPTNO);
Table altered.
SQL> INSERT INTO EMP1
2 (EMPNO,DEPTNO)
3 VALUES
4 (1,50);
INSERT INTO EMP1
*
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.EMP1_FK) violated - parent key not found

1 INSERT INTO EMP1


2 (EMPNO,DEPTNO)
3 VALUES
4* (1,60)
SQL> /
INSERT INTO EMP1
*
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.EMP1_FK) violated - parent key not found
HERE IF YOU ENTER OTHER THAN DEPTNO THAT IS EXISTING IN DEPT TABLE WE GET
ERROR.IT WON'T BE ENTERED IN TO EMP1 TABLE.
1 CREATE TABLE EMP1
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

40

2 (EMPNO NUMBER(10),
3 ENAME VARCHAR2(10),
4* DEPTNO NUMBER(10) REFERENCES DEPT1(DEPTNO))
SQL> /
Table created.
1 CREATE TABLE EMP11
2 (EMPNO NUMBER(10),
3 ENAME VARCHAR2(10),
4 DEPTNO NUMBER(10),
5* CONSTRAINT EMP2_FK FOREIGN KEY(DEPTNO) REFERENCES DEPT1(DEPTNO))
SQL> /
Table created.
IF YOU DONT GIVE NAMES TO THE CONSTRAINTS SYSTEM WILL AUTOMATICALLY
GIVE NAMES EX: SYS_UNIQUE NUMBER. IT IS ALWAYS GOOD PRACTICE TO GIVE
NAMES TO CONSTRAINTS.
WE CAN GIVE CONSTRAINTS AFTER THE CREATION OF THE TABLE ALSO.
UNIQUE:
ALTER TABLE EMP
ADD CONSTRAINT EMP_UK UNIQUE(EMPNO);
PRIMARY KEY:
ALTER TABLE EMP
ADD CONSTRAINT EMP_PK PRIMARY KEY(EMPNO);

FOREIGN KEY:
ALTER TABLE EMP
ADD CONSTRAINT EMP_FK FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO);
CHECK:
ALTER TABLE BANK
ADD CONSTRAINT BANK_CH CHECK(BALANCE >=1000) ;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

41

VIEWING CONSTRAINTS:

YOU CAN SEE THE CONSTRAINTS THAT ARE CREATED ON TABLES IN THE ORACLE
TABLE CALLED
USER_CONSTRAINTS
SELECT
TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE
USER_CONSTRAINTS

FROM

WHERE TABLE_NAME=EMP;
IF YOU WANT TO SEE COLUMNS ASSOCIATED WITH CONSTRAINTS THEN YOU HAVE
TO SEE IN
USER_CONS_COLUMNS
SELECT
TABLE_NAME,CONSTRAINT_NAME,COLUMN_NAME
USER_CONS_COLUMNS

FROM

WHERE TABLE_NAME=EMP;
SQL> CREATE TABLE EMPLOYEE
2 (EMPNO NUMBER(10) CONSTRAINT EMPLOYEE_NN NOT NULL,
3 ENAME VARCHAR2(10) CONSTRAINT EMPLOYEE_UK UNIQUE,
4 JOB VARCHAR2(10) CONSTRAINT EMPLOYEE_PK PRIMARY KEY,
5 SAL NUMBER(10) CONSTRAINT EMPLOYEE_CK CHECK(SAL > 1000),
6 DEPTNO NUMBER(10) CONSTRAINT EMPLOYEE_FK REFERENCES DEPT(DEPTNO));
Table created.
1 SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME FROM
USER_CONSTRAINTS
2* WHERE TABLE_NAME='EMPLOYEE'
SQL> /
CONSTRAINT_NAME
C TABLE_NAME
------------------------------ - -----------------------------EMPLOYEE_NN
C
EMPLOYEE
EMPLOYEE_CK
C
EMPLOYEE
EMPLOYEE_PK
P
EMPLOYEE
EMPLOYEE_UK
U
EMPLOYEE
EMPLOYEE_FK
R
EMPLOYEE
1 SELECT CONSTRAINT_NAME,COLUMN_NAME,TABLE_NAME FROM
USER_CONS_COLUMNS
2* WHERE TABLE_NAME='EMPLOYEE'
SQL> /

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

42

CONSTRAINT_NAME
-----------------------------COLUMN_NAME
---------------------------------------------------------------------------------------------------TABLE_NAME
-----------------------------EMPLOYEE_CK
SAL
EMPLOYEE
EMPLOYEE_FK
DEPTNO
EMPLOYEE
EMPLOYEE_NN
EMPNO
EMPLOYEE
EMPLOYEE_PK
JOB
EMPLOYEE
EMPLOYEE_UK
ENAME
EMPLOYEE

WE CAN ENABLE AND DISABLE CONSTRAINTS:


ALTER TABLE EMP
DISABLE CONSTRAINT EMP_PK;
ALTER TABLE EMP
DISABLE CONSTRAINT EMP_UK;
ALTER TABLE EMP
DISABLE CONSTRAINT EMP_FK;
ALTER TABLE BANK
DISABLE CONSTRAINT BANK_CH;
IF YOU ENTER CONSTRAINT AGAINST INFORMATION IN TO THE TABLE THEN YOU
HAVE TO DELETE THAT INFORMATION THEN ONLY YOU CAN ENABLE THE
CONSTRAINT.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

43

ALTER TABLE EMP


ENABLE CONSTRAINT EMP_PK;
ALTER TABLE EMP
ENABLE CONSTRAINT EMP_UK;
ALTER TABLE EMP
ENABLE CONSTRAINT EMP_FK;
ALTER TABLE BANK
ENABLE CONSTRAINT BANK_CH;
SQL> CREATE TABLE EMPLOYEE
2 (EMPNO NUMBER(10),
3 ENAME VARCHAR2(10));
Table created.
SQL> ALTER TABLE EMPLOYEE
2 ADD CONSTRAINT EMPLOYEE_PK PRIMARY KEY(EMPNO);
Table altered.
SQL> INSERT INTO EMPLOYEE
2 VALUES
3 (1,'PAVAN');
1 row created.
1 INSERT INTO EMPLOYEE
2 VALUES
3* (1,'KUMAR')
SQL> /
INSERT INTO EMPLOYEE
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.EMPLOYEE_PK) violated
HERE CONSTRAINT STOPED US ENTERING IN TO TABLE 1 AGAIN FOR EMPNO
COLUMN FOR KUMAR. HERE TABLE HAS NOT ACCEPTED 1 AGAIN FOR EMPNO
COLUMN WHICH IS ALREADY ASSIGNED TO PAVAN.
NOW I WILL DISABLE PRIMARY KEY.
ALTER TABLE EMPLOYEE
DISABLE CONSTRAINT EMPLOYEE_PK;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

44

Table altered.
SQL> INSERT INTO EMPLOYEE
2 VALUES
3 (1,'KUMAR');
1 row created.
1 INSERT INTO EMPLOYEE
2 VALUES
3* (1,'GAYATRI')
SQL> /
1 row created.
SQL> SELECT * FROM EMPLOYEE;
EMPNO ENAME
---------- ---------1 PAVAN
1 KUMAR
1 GAYATRI
HERE WHEN EVER I DISABLED CONSTRAINT PRIMARY KEY ON TABLE IT ALLOWED
WRONG INFO.
HERE IF I WANT TO ENABLE PRIMARY NOW LIKE THIS
SQL> ALTER TABLE EMPLOYEE
2 ENABLE CONSTRAINT EMPLOYEE_PK;
ALTER TABLE EMPLOYEE
*
ERROR at line 1:
ORA-02437: cannot validate (SCOTT.EMPLOYEE_PK) - primary key violated
HERE WHAT HAPPENED IS THE TABLE CONTAINED WRONG INFO UNLESS YOU
DELETE THAT IT WON'T ALLOW YOU TO ENABLE PRIMARY KEY CONSTRAINT ON
TABLE.
SQL> SELECT * FROM EMPLOYEE;
EMPNO ENAME
---------- ---------1 PAVAN
1 KUMAR
1 GAYATRI
SQL> DELETE FROM EMPLOYEE
2 WHERE ENAME IN ('KUMAR','GAYATRI');
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

45

2 rows deleted.
SQL> ALTER TABLE EMPLOYEE
2 ENABLE CONSTRAINT EMPLOYEE_PK;
Table altered.
SQL> SELECT * FROM EMPLOYEE;
EMPNO ENAME
---------- ---------1 PAVAN
SQL> INSERT INTO EMPLOYEE
2 VALUES
3 (1,'PAVAN');
INSERT INTO EMPLOYEE
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.EMPLOYEE_PK) violated

DROPING CONSTRAINTS:
ALTER TABLE EMP
DROP CONSTRAINT EMP_PK;
ALTER TABLE EMP
DROP CONSTRAINT EMP_UK;
ALTER TABLE EMP
DROP CONSTRAINT EMP_FK;
ALTER TABLE BANK
DROP CONSTRAINT BANK_CH;
FOREIGN KEY CONSTRAINT DEFINED WITH ON DELETE CASCADE :
GENRALLY IF CHILD TABLE HAS FOREIGN KEY CONSTRAINT,THEN PARENT TABLE
DOES NOT ALLOW US TO DELETE THE ROW. BUT IF FKC IS GIVEN WITH ODC,THEN IF
WE DELETE THE ROWS IN PARENT TABLE SIMULTANESOLY RESPECTIVE RECORDS IN
THE CHILD TABLE ALSO DELETED.
ALTER TABLE EMP

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

46

ADD CONSTRAINT EMP_FK FOREIGN KEY( DEPTNO ) REFERENCES DEPT ( DEPTNO )


ON DELETE CASCADE ;
FOREIGN KEY CONSTRAINT DEFINED WITH ON DELETE SET NULL :
GENRALLY IF CHILD TABLE HAS FOREIGN KEY CONSTRAINT,THEN PARENT TABLE
DOES NOT ALLOW US TO DELETE THE ROW. BUT IF FKC IS GIVEN WITH ON DELETE
SET NULL, THEN IF WE DELETE THE ROWS IN PARENT TABLE SIMULTANESOLY
RECORDS IN THE CHILD TABLE WILL NOT BE DELETED ONLY RESPECTIVE COLUMN
WILL BE KEPT NULL.

ALTER TABLE EMP


ADD CONSTRAINT EMP_FK FOREIGN KEY (DEPTNO) REFERENCES DEPT (DEPTNO) ON
DELETE SET NULL;

SQL> CREATE TABLE EMP100


2 AS
3 SELECT * FROM EMP;
Table created.
SQL> CREATE TABLE DEPT100
2 AS
3 SELECT * FROM DEPT;
Table created.
SQL> ALTER TABLE DEPT100
2 ADD CONSTRAINT DEPT100_PK PRIMARY KEY(DEPTNO);
Table altered.
SQL> ALTER TABLE EMP100
2 ADD CONSTRAINT EMP100_FK FOREIGN KEY(DEPTNO) REFERENCES
DEPT100(DEPTNO);
Table altered.
NOW IF YOU WANT TO DELETE FROM DEPT100 TABLE IT WON'T ALLOW YOU TO
DELETE THE INFO BCOZ WHENEVER YOU WANT TO DELETE FROM TABLE IF IT

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

47

ACCEPTS THE DELETION THERE ARE SOME PEOPLE WHO ARE WORKING IN EMP100
TABLE IN THAT PARTICULAR DEPARTMENT.
THEN FOR THOSE EMPLOYEE NO DEPARTMENT NAME.THE WHOLE CONCEPT OF
FOREIGN KEY GOES WRONG.IF YOU WANT TO DELETE ANY INFO FROM DEPT100
TABLE YOU HAVE TO ALTER FOREIGN KEY ON EMP100 TABLE.

SQL> ALTER TABLE EMP100


2 DROP CONSTRAINT EMP100_FK;
Table altered.
SQL> ALTER TABLE EMP100
2 ADD CONSTRAINT EMP_FK FOREIGN KEY(DEPTNO) REFERENCES
DEPT100(DEPTNO) ON DELETE CASCADE;
Table altered.
NOW IF YOU DELETE 10 IN DEPT100 TABLE THE EMPLOYEES WROKING IN
DEPARTMENT 10 IN EMP100 TABLE ALSO DELETED THEN THERE IS NO PROBLEM.

SQL> SELECT * FROM DEPT100;


DEPTNO DNAME
LOC
---------- -------------- ------------10 ACCOUNTING NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS BOSTON
SQL> DELETE FROM DEPT100
2 WHERE DEPTNO=10;
1 row deleted.
SQL> SELECT * FROM DEPT100;
DEPTNO DNAME
LOC
---------- -------------- ------------20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS BOSTON
SQL> SELECT * FROM EMP100;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

48

EMPNO ENAME
JOB
MGR HIREDATE
DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
7499 ALLEN
SALESMAN
7698 20-FEB-81
7521 WARD
SALESMAN
7698 22-FEB-81
7566 JONES
MANAGER
7839 02-APR-81
7654 MARTIN
SALESMAN
7698 28-SEP-81
7698 BLAKE
MANAGER
7839 01-MAY-81
7788 SCOTT
ANALYST
7566 19-APR-87
7844 TURNER
SALESMAN
7698 08-SEP-81
7876 ADAMS
CLERK
7788 23-MAY-87
7900 JAMES
CLERK
7698 03-DEC-81
7902 FORD
ANALYST
7566 03-DEC-81

SAL
800
1600
1250
2975
1250
2850
3000
1500
1100
950
3000

COMM
20
300
500

30
30
20
30
30
20
30
20

1400
0
30

20

11 rows selected.
1 ALTER TABLE EMP100
2* DROP CONSTRAINT EMP_FK
SQL> /
Table altered.
SQL> ALTER TABLE EMP100
2 ADD CONSTRAINT EMP_FK FOREIGN KEY(DEPTNO) REFERENCES
DEPT100(DEPTNO) ON DELETE SET NULL;
Table altered.
SQL> SELECT * FROM DEPT100;
DEPTNO DNAME
LOC
---------- -------------- ------------20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS
BOSTON
SQL> DELETE FROM DEPT100
2 WHERE DEPTNO=20;
1 row deleted.
SQL> SELECT * FROM DEPT100;
DEPTNO DNAME
LOC
---------- -------------- ------------30 SALES
CHICAGO
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
40 OPERATIONS

49

BOSTON

SQL> SELECT * FROM EMP100;


EMPNO ENAME
JOB
MGR HIREDATE
DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
7499 ALLEN
SALESMAN
7698 20-FEB-81
7521 WARD
SALESMAN
7698 22-FEB-81
7566 JONES
MANAGER
7839 02-APR-81
7654 MARTIN
SALESMAN
7698 28-SEP-81
7698 BLAKE
MANAGER
7839 01-MAY-81
7788 SCOTT
ANALYST
7566 19-APR-87
7844 TURNER
SALESMAN
7698 08-SEP-81
7876 ADAMS
CLERK
7788 23-MAY-87
7900 JAMES
CLERK
7698 03-DEC-81
7902 FORD
ANALYST
7566 03-DEC-81

SAL
800
1600
1250
2975
1250
2850
3000
1500
1100
950
3000

COMM

300
500

30
30

1400

30
30

30
30

11 rows selected.
HERE ALL THE INFO OF 20 DEPARTMENT WAS NOT DELETED ONLY DEPTNO 20 WAS
SET TO NULL.
ADDING NOT NULL AFTER CREATION OF THE TABLE:
ALTER TABLE EMP
MODIFY EMPNO NUMBER(10) CONSTRAINT EMP_NTN NOT NULL;

DROPING NOT NULL AFTER CREATION OF THE TABLE:


ALTER TABLE EMP
MODIFY EMPNO NUMBER(10) CONSTRAINT EMP_NTN NULL;
ADDING COLUMNS AFTER CREATION OF TABLE:
ALTER TABLE EMP ADD (ADDRESS VARCHAR2(10),CITY VARCHAR2(10));
SQL> CREATE TABLE EMP1
2 AS
3 SELECT * FROM EMP;
Table created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

50

SQL> DESC EMP1


Name
Null? Type
----------------------------------------------------- -------- -----------------------------------EMPNO
NUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NUMBER(2)
SQL> ALTER TABLE EMP1
2 ADD ADDRESS VARCHAR2(10);
Table altered.

SQL> DESC EMP1


Name
Null? Type
----------------------------------------------------- -------- -----------------------------------EMPNO
NUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NUMBER(2)
ADDRESS
VARCHAR2(10)
SQL> ALTER TABLE EMP1
2 ADD (ADDRESS1 VARCHAR2(10), ADDRESS2 VARCHAR2(10));
Table altered.
SQL> DESC EMP1
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------EMPNO
NUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
DEPTNO
ADDRESS
ADDRESS1
ADDRESS2

51

NUMBER(2)
VARCHAR2(10)
VARCHAR2(10)
VARCHAR2(10)

MODIFYING DATATYPES OF COLUMNS:


ALTER TABLE EMP
MODIFY EMPNO NUMBER(30);
WE CANNOT DECREASE DATATYPE OF COLUMNS IF DATA EXSITS.
ALTER TABLE EMP
MODIFY EMPNO NUMBER(1);
SQL> ALTER TABLE EMP1
2 MODIFY EMPNO NUMBER(20);
Table altered.
SQL> DESC EMP1
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------EMPNO
NUMBER(20)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NUMBER(2)
1 ALTER TABLE EMP1
2* MODIFY EMPNO NUMBER(4)
SQL> /
MODIFY EMPNO NUMBER(4)
*
ERROR at line 2:
ORA-01440: column to be modified must be empty to decrease precision or scale

DROPING COLUMNS:
SQL> ALTER TABLE EMP1
2 DROP COLUMN ADDRESS;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

52

Table altered.
SQL> ALTER TABLE EMP1
2 DROP COLUMN ADDRESS1;
Table altered.
SQL> ALTER TABLE EMP1
2 DROP COLUMN ADDRESS2;
Table altered.
SQL> DESC EMP1
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------EMPNO
NUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NUMBER(2)
GROUP FUNCTIONS:
SELECT
MAX(SAL),
FROM EMP;

MIN(SAL),AVG(SAL),SUM(SAL),STDDEV(SAL),VARIANCE(SAL)

SELECT COUNT ( * ) FROM EMP;SELECT COUNT ( DISTINCT DEPTNO ) FROM EMP;


DUAL TABLE:
DUAL IS A SYTEM TABLE.
WHICH WILL HAVE ONE COLUMN AND ONE ROW.
SELECT * FROM DUAL;
SELECT SYSDATE FROM DUAL;
SELECT 20*20 FROM DUAL;
SELECT USER FROM DUAL;
SELECT USERID FROM DUAL;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

53

1* SELECT MAX(SAL), MIN(SAL), AVG(SAL) , SUM(SAL) FROM EMP


SQL> /
MAX(SAL) MIN(SAL) AVG(SAL) SUM(SAL)
---------- ---------- ---------- ---------5000
800
2073.21429 29025
SQL> SELECT JOB FROM EMP;
JOB
--------CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
14 rows selected.
SQL> SELECT DISTINCT(JOB) FROM EMP;
JOB
--------ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN
SQL> SELECT COUNT(*) FROM EMP;
COUNT(*)
---------14
SQL> SELECT COUNT(DISTINCT(JOB)) FROM EMP;
COUNT(DISTINCT(JOB))
-------------------I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

54

SQL> SELECT SYSDATE FROM DUAL;


SYSDATE
--------19-JUL-05
SQL> SELECT SYSTIMESTAMP FROM DUAL;
SYSTIMESTAMP
--------------------------------------------------------------------------19-JUL-05 12.08.11.000001 AM +05:30
SQL> SELECT USER FROM DUAL;
USER
-----------------------------SCOTT
SQL> SELECT UID FROM DUAL;
UID
---------66
SQL> SELECT * FROM DUAL;
D
X
SQL> DESC DUAL;
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------DUMMY
VARCHAR2(1)
DUAL IS A SYSTEM TABLE.
SQL> SELECT 23* 23 FROM DUAL;
23*23
---------529
SQL> SELECT 2*2 FROM DUAL;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

55

2*2
---------4

GROUP FUNCTIONS:
AVG , MAX , MIN , SUM , COUNT , STDDEV( STANDERD DEVIATION ) , VARIANCE .
COLUMN HEADING DEFAULTS IN SQL* PLUS:
DEFAULT JUSTIFICATION:
----LEFT : DATE AND CHARACTER DATA
----RIGHT : NUMERIC DATA.
DEFAULT DISPLAY :UPPERCASE

ARITHMETIC EXPRESSIONS:
+
-*
/

ADD
SUBTRACT
MULTIPLY
DIVIDE

SELECT ENAME,SAL,SAL+300,SAL-300,SAL*300,SAL/300 FROM EMP;


SQL> SELECT SAL,SAL+300,SAL-300,SAL*300,SAL/300 FROM EMP;
SAL SAL+300 SAL-300 SAL*300 SAL/300
---------- ---------- ---------- ---------- ---------800
1100
500 240000
2.66666667
1600
1900
1300 480000 5.33333333
1250
1550
950 375000 4.16666667
2975
3275
2675 892500 9.91666667
1250
1550
950 375000 4.16666667
2850
3150
2550 855000
9.5
2450
2750
2150 735000 8.16666667
3000
3300
2700 900000
10
5000
5300
4700 1500000 16.6666667

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
1500
1100
950
3000
1300

1800
1400
1250
3300
1600

1200 450000
800 330000
650 285000
2700 900000
1000 390000

56

5
3.66666667
3.16666667
10
4.33333333

14 rows selected.

OPERATOR PRECEDENCE:
*

MULTIPLICATION AND DIVISION TAKE PRIORITY OVER ADDITION AND SUBTRACTION.


OPERATORS OF THE SAME PRIORITY ARE EVALUATED FROM LEFT TO RIGHT.
PARENTHESESES ARE USED TO FORCE PRIORITIZED EVALUTION.
NULL FUNCTION:
A NULL IS A VALUE THIS IS UNAVAILABLE,UNASSIGNED,UNKNOWN OR
INAPPLICABLE.
A NULL IS NOT THE SAME AS ZERO OR A BLANKSPACE.
ARITHMETIC EXPRESSIONS CONTAINING A NULL VALUE EVALUATE TO NULL;
SQL> SELECT * FROM EMP WHERE MGR IS NULL;
EMPNO
ENAME
JOB
MGR
HIREDATE
DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7839
KING
PRESIDENT
17-NOV-81

SAL

COMM

5000

10

1* SELECT * FROM EMP WHERE MGR IS NOT NULL


SQL> /
EMPNO ENAME

JOB

I Soft Solutions ,Bang-54.

MGR HIREDATE

SAL

COMM

DEPTNO

STRUCTURED QUERY LANGUAGE

ORACLE

57

---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH


CLERK
7902 17-DEC-80
800
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
7521 WARD
SALESMAN
7698 22-FEB-81
1250
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN
SALESMAN
7698 28-SEP-81
1250
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT
ANALYST
7566 19-APR-87
3000
7844 TURNER
SALESMAN
7698 08-SEP-81
1500
7876 ADAMS
CLERK
7788 23-MAY-87
1100
7900 JAMES
CLERK
7698 03-DEC-81
950
7902 FORD
ANALYST
7566 03-DEC-81
3000
7934 MILLER
CLERK
7782 23-JAN-82
1300

300
500

20
30
30
20

1400

30
30
10
20
30

0
20
30
20
10

13 rows selected.

ANNAUAL SALARY:
HERE 12 IS FIRST MULTIPLIED BY 100 THEN IT IS ADDED TO SAL THAT IS
WRONG.
SQL> SELECT SAL,SAL+100 *12 FROM EMP;
SAL SAL+100*12
---------- ---------800
2000
1600
2800
1250
2450
2975
4175
1250
2450
2850
4050
2450
3650
3000
4200
5000
6200
1500
2700
1100
2300
950
2150
3000
4200
1300
2500
14 rows selected.
HERE BY PUTTING PARANTHESIS THAT OUT IS CORRECT.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

58

1* SELECT SAL,(SAL+100) *12 FROM EMP


SQL> /
SAL (SAL+100)*12
---------- -----------800
10800
1600
20400
1250
16200
2975
36900
1250
16200
2850
35400
2450
30600
3000
37200
5000
61200
1500
19200
1100
14400
950
12600
3000
37200
1300
16800
14 rows selected.

SQL> SELECT ENAME,SAL,SAL+COMM FROM EMP;


ENAME
SAL SAL+COMM
---------- ---------- ---------SMITH
800
ALLEN
1600
1900
WARD
1250
1750
JONES
2975
MARTIN
1250
2650
BLAKE
2850
CLARK
2450
SCOTT
3000
KING
5000
TURNER
1500
1500
ADAMS
1100
JAMES
950
FORD
3000
MILLER
1300
14 rows selected.
HERE THE SAL + COMM IS NULL FOR THE EMPLOYEES WHO HAS COMM IS NULL.
THAT MEANS WHEN EVER WE DO ANY ADDITION WITH NULL WHOLE RESULT IS
NULL.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

59

TO AVOID THAT WE USE NULL.


SQL> SELECT ENAME,SAL,COMM,SAL+COMM FROM EMP;
ENAME
SAL
COMM SAL+COMM
---------- ---------- ---------- ---------SMITH
800
ALLEN
1600
300
1900
WARD
1250
500
1750
JONES
2975
MARTIN
1250
1400
2650
BLAKE
2850
CLARK
2450
SCOTT
3000
KING
5000
TURNER
1500
0
1500
ADAMS
1100
JAMES
950
FORD
3000
MILLER
1300
14 rows selected.

HERE WHENEVER WE USED NVL IT SUBSTITUED 0 IN PLACE OF NULL VALUES. THEN


ADDTION WITH 0 RESULTS CORRECT VALUE.
SQL> SELECT ENAME,SAL,NVL(COMM,0),SAL+NVL(COMM,0) FROM EMP;
ENAME
SAL NVL(COMM,0) SAL+NVL(COMM,0)
---------- ---------- ----------- --------------SMITH
800
0
800
ALLEN
1600
300
1900
WARD
1250
500
1750
JONES
2975
0
2975
MARTIN
1250
1400
2650
BLAKE
2850
0
2850
CLARK
2450
0
2450
SCOTT
3000
0
3000
KING
5000
0
5000
TURNER
1500
0
1500
ADAMS
1100
0
1100
JAMES
950
0
950
FORD
3000
0
3000
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
MILLER

1300

60

1300

14 rows selected.
HERE BECAUSE OF ORDER OF PRECEDENCE THE CONCEPT OF ANNUAL SALARY WAS
CAME WRONG. HERE FIRST 12 IS MULTIPLIED BY COMM THAT IS WHY FOR FIRST RWO
THE ANNUAL SALARY IS 800 ONLY.
1* SELECT ENAME,SAL,NVL(COMM,0),SAL+NVL(COMM,0)*12 FROM EMP
SQL> /
ENAME
SAL NVL(COMM,0) SAL+NVL(COMM,0)*12
---------- ---------- ----------- -----------------SMITH
800
0
800
ALLEN
1600
300
5200
WARD
1250
500
7250
JONES
2975
0
2975
MARTIN
1250
1400
18050
BLAKE
2850
0
2850
CLARK
2450
0
2450
SCOTT
3000
0
3000
KING
5000
0
5000
TURNER
1500
0
1500
ADAMS
1100
0
1100
JAMES
950
0
950
FORD
3000
0
3000
MILLER
1300
0
1300
14 rows selected.
WE HAVE TO KEEP PARANTHESIS FOR CORRECT ANNUAL SALARY.

1* SELECT ENAME,SAL,NVL(COMM,0),(SAL+NVL(COMM,0))*12 FROM EMP


SQL> /
ENAME
SAL NVL(COMM,0) (SAL+NVL(COMM,0))*12
---------- ---------- ----------- -------------------SMITH
800
0
9600
ALLEN
1600
300
22800
WARD
1250
500
21000
JONES
2975
0
35700
MARTIN
1250
1400
31800
BLAKE
2850
0
34200
CLARK
2450
0
29400
SCOTT
3000
0
36000
KING
5000
0
60000
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
TURNER
ADAMS
JAMES
FORD
MILLER

1500
1100
950
3000
1300

0
0
0
0
0

61

18000
13200
11400
36000
15600

14 rows selected.
IN THE ABOVE OUTPUT THE HEADING FOR ANNUAL SALARY COLUMN IS NOT
MEANING FULL.TO ACHIVE COEERCT OUTPUT WE GO FOR COLUMN ALIASING.
COLUMN ALIASES:
SELECT ENAME AS NAME ,SAL SALARY FROM EMP;
SELECT ENAME NAME, SAL*12 ANNUAL SALARY FROM EMP;
SELECT ENAME NAME FROM EMP;
1* SELECT ENAME,SAL,NVL(COMM,0),(SAL+NVL(COMM,0))*12 "ANNUAL SALARY"
FROM EMP
SQL> /
ENAME
SAL NVL(COMM,0) ANNUAL SALARY
---------- ---------- ----------- ------------SMITH
800
0
9600
ALLEN
1600
300
22800
WARD
1250
500
21000
JONES
2975
0
35700
MARTIN
1250
1400
31800
BLAKE
2850
0
34200
CLARK
2450
0
29400
SCOTT
3000
0
36000
KING
5000
0
60000
TURNER
1500
0
18000
ADAMS
1100
0
13200
JAMES
950
0
11400
FORD
3000
0
36000
MILLER
1300
0
15600
14 rows selected.
SQL> SELECT ENAME,SAL AS SALARY FROM EMP;
ENAME
SALARY
---------- ---------SMITH
800
ALLEN
1600
WARD
1250
JONES
2975
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

62

1250
2850
2450
3000
5000
1500
1100
950
3000
1300

14 rows selected.
SQL> SELECT ENAME,SAL SALARY FROM EMP;
ENAME
SALARY
---------- ---------SMITH
800
ALLEN
1600
WARD
1250
JONES
2975
MARTIN
1250
BLAKE
2850
CLARK
2450
SCOTT
3000
KING
5000
TURNER
1500
ADAMS
1100
JAMES
950
FORD
3000
MILLER
1300
14 rows selected.
HERE WE HAD GIVEN GAP FOR COLUMN ALIASING. THAT IS WRONG. FOR CORRECT
OUTPUT
WE HAVE TO GIVE FOR COLUMN ALIASING.
SQL> SELECT ENAME,SAL SALARY OF EMPLOYEE FROM EMP;
SELECT ENAME,SAL SALARY OF EMPLOYEE FROM EMP
*
ERROR at line 1:
ORA-00923: FROM keyword not found where expected

1* SELECT ENAME,SAL "SALARY OF EMPLOYEE" FROM EMP


SQL> /
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

63

ENAME
SALARY OF EMPLOYEE
---------- -----------------SMITH
800
ALLEN
1600
WARD
1250
JONES
2975
MARTIN
1250
BLAKE
2850
CLARK
2450
SCOTT
3000
KING
5000
TURNER
1500
ADAMS
1100
JAMES
950
FORD
3000
MILLER
1300
14 rows selected.
CONCATINATION OPERATOR:
SELECT ENAME||JOB AS EMPLOYEES FROM EMP;
SELECT ENAME || IS A || JOB AS EMPLOYEE DETAILS FROM EMP;
SQL> SELECT ENAME,JOB FROM EMP;
ENAME
JOB
---------- --------SMITH
CLERK
ALLEN
SALESMAN
WARD
SALESMAN
JONES
MANAGER
MARTIN
SALESMAN
BLAKE
MANAGER
CLARK
MANAGER
SCOTT
ANALYST
KING
PRESIDENT
TURNER
SALESMAN
ADAMS
CLERK
JAMES
CLERK
FORD
ANALYST
MILLER
CLERK
14 rows selected.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

64

SQL> SELECT ENAME||JOB FROM EMP;


ENAME||JOB
------------------SMITHCLERK
ALLENSALESMAN
WARDSALESMAN
JONESMANAGER
MARTINSALESMAN
BLAKEMANAGER
CLARKMANAGER
SCOTTANALYST
KINGPRESIDENT
TURNERSALESMAN
ADAMSCLERK
JAMESCLERK
FORDANALYST
MILLERCLERK
14 rows selected.
1* SELECT ENAME||' HAS A '||JOB FROM EMP
SQL> /
ENAME||'HASA'||JOB
-------------------------SMITH HAS A CLERK
ALLEN HAS A SALESMAN
WARD HAS A SALESMAN
JONES HAS A MANAGER
MARTIN HAS A SALESMAN
BLAKE HAS A MANAGER
CLARK HAS A MANAGER
SCOTT HAS A ANALYST
KING HAS A PRESIDENT
TURNER HAS A SALESMAN
ADAMS HAS A CLERK
JAMES HAS A CLERK
FORD HAS A ANALYST
MILLER HAS A CLERK
14 rows selected.
1* SELECT ENAME||' JOB NAME IS '||JOB FROM EMP
SQL> /

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

65

ENAME||'JOBNAMEIS'||JOB
-------------------------------SMITH JOB NAME IS CLERK
ALLEN JOB NAME IS SALESMAN
WARD JOB NAME IS SALESMAN
JONES JOB NAME IS MANAGER
MARTIN JOB NAME IS SALESMAN
BLAKE JOB NAME IS MANAGER
CLARK JOB NAME IS MANAGER
SCOTT JOB NAME IS ANALYST
KING JOB NAME IS PRESIDENT
TURNER JOB NAME IS SALESMAN
ADAMS JOB NAME IS CLERK
JAMES JOB NAME IS CLERK
FORD JOB NAME IS ANALYST
MILLER JOB NAME IS CLERK
14 rows selected.
COMPARISON OPERATORS:
=

EQUAL TO

>

GREATER THAN

>=

GREATER THAN OR EQUAL TO

<

LESS THAN

<=

LESS THAN OR EQUAL TO

<>

NOT EQUAL TO

SELECT * FROM EMP WHERE SAL<=2000;


SELECT * FROM EMP WHERE SAL>=2000;
SELECT * FROM EMP WHERE SAL <> 2000;
SELECT ENAME,SAL FROM EMP WHERE SAL BETWEEN 1000 AND 1500;
SQL> SELECT * FROM EMP WHERE SAL < 1000;
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
20
7900 JAMES
CLERK
7698 03-DEC-81
950
30

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

66

1* SELECT * FROM EMP WHERE SAL <= 1000


2 /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
20
7900 JAMES
CLERK
7698 03-DEC-81
950
30

1* SELECT * FROM EMP WHERE SAL > 1000


SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
300
7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
1400
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT ANALYST
7566 19-APR-87
3000
7839 KING
PRESIDENT
17-NOV-81
5000
7844 TURNER SALESMAN
7698 08-SEP-81
1500
7876 ADAMS
CLERK
7788 23-MAY-87
1100
7902 FORD
ANALYST
7566 03-DEC-81
3000
7934 MILLER CLERK
7782 23-JAN-82
1300

DEPTNO
30
30
20
30
30
10
20
10
30

0
20
20
10

12 rows selected.
1* SELECT * FROM EMP WHERE SAL >= 1000
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
300
7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
1400
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT ANALYST
7566 19-APR-87
3000
7839 KING
PRESIDENT
17-NOV-81
5000
7844 TURNER SALESMAN
7698 08-SEP-81
1500
7876 ADAMS
CLERK
7788 23-MAY-87
1100
7902 FORD
ANALYST
7566 03-DEC-81
3000
I Soft Solutions ,Bang-54.

DEPTNO
30
30
20
30
30
10
20
10
30

0
20
20

STRUCTURED QUERY LANGUAGE

ORACLE
7934 MILLER

CLERK

67

7782

23-JAN-82

1300

10

12 rows selected.
1* SELECT * FROM EMP WHERE SAL <> 1000
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
300
7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
1400
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT ANALYST
7566 19-APR-87
3000
7839 KING
PRESIDENT
17-NOV-81
5000
7844 TURNER SALESMAN
7698 08-SEP-81
1500
0
7876 ADAMS
CLERK
7788 23-MAY-87
1100
7900 JAMES
CLERK
7698 03-DEC-81
950
7902 FORD
ANALYST
7566 03-DEC-81
3000
7934 MILLER CLERK
7782 23-JAN-82
1300

DEPTNO
20
30
30
20
30
30
10
20
10
30
20
30
20
10

14 rows selected.
1* SELECT * FROM EMP WHERE SAL =950
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7900 JAMES
CLERK
7698 03-DEC-81
950
30

DEPTNO

SQL> SELECT * FROM EMP WHERE SAL BETWEEN 1000 AND 2000;
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
300
7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
7654 MARTIN
SALESMAN
7698 28-SEP-81
1250
1400
7844 TURNER
SALESMAN
7698 08-SEP-81
1500
0
7876 ADAMS
CLERK
7788 23-MAY-87
1100
7934 MILLER
CLERK
7782 23-JAN-82
1300

DEPTNO
30
30
30
30
20
10

6 rows selected.
HERE BOTH 1000 AND 2000 INCLUSIVE IN THE OUTPUT IF THEY EXIST IN THE OUPUT.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

68

IN OPERATOR:
IF YOU WANT TO SELECT INFO FOR MORE THAN ONE EMPLOYEE YOU CANNOT USE
THE FOLLOWING QUERY:

SELECT * FROM EMP WHERE EMPNO=7369,7788,7566;


THE ABOVE QUERY WONT WORK.
TO SLOVE THE ABOVE PROBLEM WE HAVE TO WRITE QUERY LIKE BELOW:
SELECT EMPNO,ENAME,SAL,MGR FROM EMP WHERE MGR IN (7902,7566,7788);
THE ABOVE QUERY WILL GIVE THE INFO OF THREE EMPLOYEES.

SQL> SELECT * FROM EMP WHERE EMPNO=7788;


EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7788 SCOTT ANALYST
7566 19-APR-87
3000
20

DEPTNO

1* SELECT * FROM EMP WHERE EMPNO=7788,7369,7566


2 /
SELECT * FROM EMP WHERE EMPNO=7788,7369,7566
*
ERROR at line 1:
ORA-00933: SQL command not properly ended
1* SELECT * FROM EMP WHERE EMPNO IN (7788,7369,7566)
2 /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7566 JONES
MANAGER
7839 02-APR-81
2975
20
7369 SMITH
CLERK
7902 17-DEC-80
800
20
7788 SCOTT
ANALYST
7566 19-APR-87
3000
20
NOT IN OPERATOR:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

69

IF YOU DONT WANT TO SEE THOSE EMPLOYEES INFO,YOU KEEP THEM IN NOT IN
CLAUSE.
SELECT EMPNO,ENAME,SAL,MGR FROM EMP WHERE MGR NOT IN (7902,7566,7788);
1* SELECT * FROM EMP WHERE EMPNO NOT IN (7788,7369,7566)
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
300
7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
7654 MARTIN
SALESMAN
7698 28-SEP-81
1250
1400
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7839 KING
PRESIDENT
17-NOV-81
5000
7844 TURNER
SALESMAN
7698 08-SEP-81
1500
0
7876 ADAMS
CLERK
7788 23-MAY-87
1100
7900 JAMES
CLERK
7698 03-DEC-81
950
7902 FORD
ANALYST
7566 03-DEC-81
3000
7934 MILLER
CLERK
7782 23-JAN-82
1300

DEPTNO
30
30
30
30
10
10
30
20
30
20
10

11 rows selected.

AND OPERATOR:
REQUIRES BOTH CONDITIONS TO BE TRUE:
IN ADD OPERATOR IF BOTH CONDITIONS ARE TRUE THEN ONLY RESULT COMES.
HERE WE GET INFO ABOUT CLERKS AND WHOSE SALARY >=THAN 1100;
SELECT EMPNO,ENAME,JOB,SAL FROM EMP WHERE SAL>1100 AND JOB=CLERK;
SQL> SELECT * FROM EMP
2 WHERE SAL > 1000 AND JOB = 'CLERK';
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7876 ADAMS
CLERK
7788 23-MAY-87
1100
7934 MILLER
CLERK
7782 23-JAN-82
1300
AND
TRUE
FALSE

TRUE
TRUE
FALSE

DEPTNO
20
10

FALSE
FALSE
FALSE

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

70

OR OPERATOR:
REQUIRES EITHER CONDITION TO BE TRUE.
IN OR OPERATOR IF ONE CONDITION IS TRUE THEN ALSO RESULT COMES.
HERE WE GET INFO ABOUT CLERKS AND ALL THE INFO ABOUT EMPLOYEES WHOSE
SALARY >=1100.
SELECT EMPNO,ENAME,JOB,SAL FROM EMP WHERE SAL>=1100 OR JOB=CLERK;
1 SELECT * FROM EMP
2* WHERE SAL > 1000 OR JOB = 'CLERK'
3 /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
7521 WARD
SALESMAN
7698 22-FEB-81
1250
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN
SALESMAN
7698 28-SEP-81
1250
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT
ANALYST
7566 19-APR-87
3000
7839 KING
PRESIDENT
17-NOV-81
5000
7844 TURNER
SALESMAN
7698 08-SEP-81
1500
7876 ADAMS
CLERK
7788 23-MAY-87
1100
7900 JAMES
CLERK
7698 03-DEC-81
950
7902 FORD
ANALYST
7566 03-DEC-81
3000
7934 MILLER
CLERK
7782 23-JAN-82
1300
14 rows selected.
OR
TRUE
TRUE
TRUE
FALSE
TRUE

COMM

DEPTNO

300
500

20
30
30

1400

30

20
30
10
20
10
0

30
20
30
20
10

FALSE
TRUE
FALSE

SORTING BY COLUMN ALIAS:


TILL NOW WE HAVE SORTED OUTPUT ASC OR DESC ACCORDING TO COLUMN THAT
ARE PRESENT IN THE TABLE.
NOW WE CAN SORT THE OUTPUT IN EITHER WAY ACCORDING TO COLUMN ALIASES.
SELECT EMPNO,ENAME,SAL*12 ANNSAL FROM EMP ORDER BY ANNSAL;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

71

SQL> SELECT EMPNO,ENAME,JOB,SAL,(SAL+NVL(COMM,0)*12) ANSAL FROM EMP;


EMPNO ENAME
JOB
SAL ANSAL
---------- ---------- --------- ---------- ---------7369 SMITH
CLERK
800
800
7499 ALLEN
SALESMAN
1600
5200
7521 WARD
SALESMAN
1250
7250
7566 JONES
MANAGER
2975
2975
7654 MARTIN
SALESMAN
1250 18050
7698 BLAKE
MANAGER
2850
2850
7782 CLARK
MANAGER
2450
2450
7788 SCOTT
ANALYST
3000
3000
7839 KING
PRESIDENT 5000
5000
7844 TURNER
SALESMAN
1500
1500
7876 ADAMS
CLERK
1100
1100
7900 JAMES
CLERK
950
950
7902 FORD
ANALYST
3000
3000
7934 MILLER
CLERK
1300
1300
14 rows selected.
1* SELECT EMPNO,ENAME,JOB,SAL,(SAL+NVL(COMM,0)*12) ANSAL FROM EMP
ORDER BY ANSAL
SQL> /
EMPNO ENAME
JOB
SAL ANSAL
---------- ---------- --------- ---------- ---------7369 SMITH
CLERK
800
800
7900 JAMES
CLERK
950
950
7876 ADAMS
CLERK
1100
1100
7934 MILLER
CLERK
1300
1300
7844 TURNER
SALESMAN
1500
1500
7782 CLARK
MANAGER
2450
2450
7698 BLAKE
MANAGER
2850
2850
7566 JONES
MANAGER
2975
2975
7788 SCOTT
ANALYST
3000
3000
7902 FORD
ANALYST
3000
3000
7839 KING
PRESIDENT 5000
5000
7499 ALLEN
SALESMAN
1600
5200
7521 WARD
SALESMAN
1250
7250
7654 MARTIN
SALESMAN
1250 18050
14 rows selected.
1* SELECT EMPNO,ENAME,JOB,SAL,(SAL+NVL(COMM,0)*12) ANSAL FROM EMP ORDER
BY ANSAL DESC
SQL> /

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
EMPNO ENAME
JOB
SAL
---------- ---------- --------- ---------- ---------7654 MARTIN
SALESMAN
7521 WARD
SALESMAN
7499 ALLEN
SALESMAN
7839 KING
PRESIDENT
7788 SCOTT
ANALYST
7902 FORD
ANALYST
7566 JONES
MANAGER
7698 BLAKE
MANAGER
7782 CLARK
MANAGER
7844 TURNER
SALESMAN
7934 MILLER
CLERK
7876 ADAMS
CLERK
7900 JAMES
CLERK
7369 SMITH
CLERK

72

ANSAL
1250
1250
1600
5000
2975
2850
2450
1500
1300
1100
950
800

18050
7250
5200
5000
3000
3000
2975
2850
2450
1500
1300
1100
950
800

3000
3000

14 rows selected.
WHEN EVER IN INTERVIEW WHEN THEY ASK ABOUT JOINS U HAVE TO
EXPLAIN ANSWER WITH EMP,DEPT,SALGRADE TABLES.
IT IS VERY DIFFICULT IF YOU TRY TO ANSWER WITH OTHER TABLES.

JOINS:
USE A JOIN TO QUERY DATA FROM MORE THAN ONE TABLE.WRITE THE JOIN
CONDITION IN THE WHERE CLAUSE.PREFIX THE COLUMN NAME WITH THE TABLE
NAME WHEN THE SAME COLUMN NAME APPEARS IN MORE THAN ONE TABLE.
THERE ARE FIVE TYPES OF JOINS EXISTS IN ORACLE.
CARTESIAN PRODUCT
EQUI-JOIN

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

73

NON-EQUI JOIN
OUTER-JOIN.
SELF-JOIN.

CARTESIAN PRODUCT:
CARTESIAN PRODUCT IS FORMED WHEN A JOIN CONDITION IS OMITTED.TO AVOID A
CARTESIAN PRODUCT, ALWAYS INCLUDE A VALID CONDITION IN A WHERE CLAUSE.
HERE FIRST TABLE EMP ROWS COMPLETELY MULTIPLIED BY FIRST ROW IN SECOND
TABLE DEPT AND SO ON
SQL> SELECT EMPNO,ENAME,EMP.DEPTNO,DNAME,LOC FROM EMP,DEPT;
EMPNO ENAME
DEPTNO DNAME
LOC
---------- ---------- ---------- -------------- ------------7369 SMITH
20 ACCOUNTING NEW YORK
7499 ALLEN
30 ACCOUNTING NEW YORK
7521 WARD
30 ACCOUNTING NEW YORK
7566 JONES
20 ACCOUNTING NEW YORK
7654 MARTIN
30 ACCOUNTING NEW YORK
7698 BLAKE
30 ACCOUNTING NEW YORK
7782 CLARK
10 ACCOUNTING NEW YORK
7788 SCOTT
20 ACCOUNTING NEW YORK
7839 KING
10 ACCOUNTING NEW YORK
7844 TURNER
30 ACCOUNTING NEW YORK
7876 ADAMS
20 ACCOUNTING NEW YORK
7900 JAMES
30 ACCOUNTING NEW YORK
7902 FORD
20 ACCOUNTING NEW YORK
7934 MILLER
10 ACCOUNTING NEW YORK
7369 SMITH
20 RESEARCH
DALLAS
7499 ALLEN
30 RESEARCH
DALLAS
7521 WARD
30 RESEARCH
DALLAS
7566 JONES
20 RESEARCH
DALLAS
7654 MARTIN
30 RESEARCH
DALLAS
7698 BLAKE
30 RESEARCH
DALLAS
7782 CLARK
10 RESEARCH
DALLAS
7788 SCOTT
20 RESEARCH
DALLAS
7839 KING
10 RESEARCH
DALLAS
7844 TURNER
30 RESEARCH
DALLAS
7876 ADAMS
20 RESEARCH
DALLAS
7900 JAMES
30 RESEARCH
DALLAS
7902 FORD
20 RESEARCH
DALLAS
EMPNO ENAME
DEPTNO DNAME
---------- ---------- ---------- -------------- ------------I Soft Solutions ,Bang-54.

LOC

STRUCTURED QUERY LANGUAGE

ORACLE
7934 MILLER
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES

74

10 RESEARCH
DALLAS
20 SALES
CHICAGO
30 SALES
CHICAGO
30 SALES
CHICAGO
20 SALES
CHICAGO
30 SALES
CHICAGO
30 SALES
CHICAGO
10 SALES
CHICAGO
20 SALES
CHICAGO
10 SALES
CHICAGO
30 SALES
CHICAGO
20 SALES
CHICAGO
30 SALES
CHICAGO
20 SALES
CHICAGO
10 SALES
CHICAGO
20 OPERATIONS BOSTON
30 OPERATIONS BOSTON
30 OPERATIONS BOSTON
20 OPERATIONS BOSTON
30 OPERATIONS BOSTON
30 OPERATIONS BOSTON
10 OPERATIONS BOSTON
20 OPERATIONS BOSTON
10 OPERATIONS BOSTON
30 OPERATIONS BOSTON
20 OPERATIONS BOSTON
30 OPERATIONS BOSTON

EMPNO ENAME
DEPTNO DNAME
LOC
---------- ---------- ---------- -------------- ------------7902 FORD
20 OPERATIONS BOSTON
7934 MILLER
10 OPERATIONS BOSTON
56 rows selected.
HERE WE GET NO OF ROWS IN FIRST TABLE * NO OF ROWS IN SECOND TABLE AS
OUTPUT.
WHEN EVER IN INTERVIEW IF THEY ASK ABOUT EXPLAIN OUTPUT U HAVE TO
EXPLAIN LIKE THIS:
HERE FIRST TABLE WHOLE ROWS ARE MULTIPLIED BY FIRST ROW N SECOND ROW
AND AGAIN FIRST TABLE WHOLE ROWS ARE THEN MULTIPLIED BY SECOND TABLE
SECOND ROW AND SO ON.
EQUI-JOIN:SIMPLE JOINS OR INNER JOINS:
THE RELATIONSHIP BETWEEN EMP AND DEPT TABLE IS A EQUI-JOIN.THAT IS VALUES
IN DEPTNO COLUMN ON BOTH TABLES ARE EQUAL.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

75

HERE WE GET INFO THAT IS COMMON IN BOTH TABLES.


SQL> SELECT EMPNO,ENAME,DEPTNO,DNAME,LOC FROM EMP,DEPT
2 WHERE EMP.DEPTNO=DEPT.DEPTNO;
SELECT EMPNO,ENAME,DEPTNO,DNAME,LOC FROM EMP,DEPT
*
ERROR at line 1:
ORA-00918: column ambiguously defined
TO SLOVE THAT WE HAVE KEEP DEPT OR EMP BEFORE DEPTNO,BCOZ BOTH TABLES
HAVE DEPTNO COLUMN.
SQL> SELECT EMPNO,ENAME,EMP.DEPTNO,DNAME,LOC FROM EMP,DEPT
2 WHERE EMP.DEPTNO=DEPT.DEPTNO;
EMPNO ENAME
DEPTNO DNAME
LOC
---------- ---------- ---------- -------------- ------------7369 SMITH
20 RESEARCH
DALLAS
7499 ALLEN
30 SALES
CHICAGO
7521 WARD
30 SALES
CHICAGO
7566 JONES
20 RESEARCH
DALLAS
7654 MARTIN
30 SALES
CHICAGO
7698 BLAKE
30 SALES
CHICAGO
7782 CLARK
10 ACCOUNTING
NEW YORK
7788 SCOTT
20 RESEARCH
DALLAS
7839 KING
10 ACCOUNTING
NEW YORK
7844 TURNER
30 SALES
CHICAGO
7876 ADAMS
20 RESEARCH
DALLAS
7900 JAMES
30 SALES
CHICAGO
7902 FORD
20 RESEARCH
DALLAS
7934 MILLER
10 ACCOUNTING
NEW YORK
14 rows selected.
TABLE NAME ALIASING:
SELECT EMPNO,ENAME,SAL,E.DEPTNO,DNAME,LOC
FROM EMP E,DEPT D
WHERE E.DEPTNO=D.DEPTNO;

1 SELECT EMPNO,ENAME,E.DEPTNO,DNAME,LOC FROM EMP E,DEPT D

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

76

2* WHERE E.DEPTNO=D.DEPTNO
SQL> /
EMPNO ENAME
DEPTNO DNAME
LOC
---------- ---------- ---------- -------------- ------------7369 SMITH
20 RESEARCH
DALLAS
7499 ALLEN
30 SALES
CHICAGO
7521 WARD
30 SALES
CHICAGO
7566 JONES
20 RESEARCH
DALLAS
7654 MARTIN
30 SALES
CHICAGO
7698 BLAKE
30 SALES
CHICAGO
7782 CLARK
10 ACCOUNTING
NEW YORK
7788 SCOTT
20 RESEARCH
DALLAS
7839 KING
10 ACCOUNTING
NEW YORK
7844 TURNER
30 SALES
CHICAGO
7876 ADAMS
20 RESEARCH
DALLAS
7900 JAMES
30 SALES
CHICAGO
7902 FORD
20 RESEARCH
DALLAS
7934 MILLER
10 ACCOUNTING
NEW YORK
14 rows selected.
NON-EQUI JOIN:
THE RELATIONSHIP BETWEEN THE EMP TABLE AND THE SALGRADE TABLE IS A NONEQUIJOIN,MEANING THAT NO COLUMN IN THE EMP TABLE CORRESPONDS DIRECTLY
TO A COLUMN IN THE SALGRADE TABLE.
SELECT ENAME,SAL,GRADE
FROM EMP,SALGRADE
WHERE SAL BETWEEN LOSAL AND HISAL.
SELECT ENAME,SAL,GRADE
FROM EMP E ,SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
SQL> SELECT EMPNO,ENAME,SAL,GRADE FROM EMP,SALGRADE
2 WHERE SAL BETWEEN LOSAL AND HISAL;
EMPNO ENAME
SAL GRADE
---------- ---------- ---------- ---------7369 SMITH
800
1
7876 ADAMS
1100
1
7900 JAMES
950
1
7521 WARD
1250
2

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
7654 MARTIN
7934 MILLER
7499 ALLEN
7844 TURNER
7566 JONES
7698 BLAKE
7782 CLARK
7788 SCOTT
7902 FORD
7839 KING

1250
1300
2975

1500
4
2450
3000
3000
5000

77

2
2
1600
3
2850
4
4
4
5

3
4

14 rows selected.
OUTER-JOIN:
WE USE AN OUTER JOIN TO ALSO SEE ROWS THAT DO NOT USUALLY MEET THE JOIN
CONDITION.THE OUTER JOIN OPERATOR IS THE PLUS SIGN(+).
HERE WE GET EXTRA INFORMATION IN DEPT TABLE.
THIS IS RIGHT OUTER JOIN.
SELECT E.EMPNO,E.ENAME,D.DEPTNO,D.DNAME
FROM EMP E,DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO

HERE WE GET EXTRA INFORMATION IN EMP TABLE.


THIS LEFT OUTER JOIN.
SELECT E.EMPNO,E.ENAME,E.DEPTNO,D.DNAME
FROM EMP E,DEPT D
WHERE E.DEPTNO = D.DEPTNO(+)
YOU CANNOT PLACE (+) SIGN ON BOTH SIDES.

THIS IS RIGHT OUTER JOIN.

SQL> SELECT EMPNO,ENAME,EMP.DEPTNO,DNAME,LOC FROM EMP,DEPT


2 WHERE EMP.DEPTNO(+) = DEPT.DEPTNO;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

78

EMPNO ENAME
DEPTNO DNAME
LOC
---------- ---------- ---------- -------------- ------------7782 CLARK
10 ACCOUNTING
NEW YORK
7839 KING
10 ACCOUNTING
NEW YORK
7934 MILLER
10 ACCOUNTING
NEW YORK
7369 SMITH
20 RESEARCH
DALLAS
7876 ADAMS
20 RESEARCH
DALLAS
7902 FORD
20 RESEARCH
DALLAS
7788 SCOTT
20 RESEARCH
DALLAS
7566 JONES
20 RESEARCH
DALLAS
7499 ALLEN
30 SALES
CHICAGO
7698 BLAKE
30 SALES
CHICAGO
7654 MARTIN
30 SALES
CHICAGO
7900 JAMES
30 SALES
CHICAGO
7844 TURNER
30 SALES
CHICAGO
7521 WARD
30 SALES
CHICAGO
OPERATIONS
BOSTON
15 rows selected.

1 SELECT EMPNO,ENAME,DEPT.DEPTNO,DNAME,LOC FROM EMP,DEPT


2* WHERE EMP.DEPTNO(+) = DEPT.DEPTNO
SQL> /
EMPNO ENAME
DEPTNO DNAME
LOC
---------- ---------- ---------- -------------- ------------7782 CLARK
10 ACCOUNTING
NEW YORK
7839 KING
10 ACCOUNTING
NEW YORK
7934 MILLER
10 ACCOUNTING
NEW YORK
7369 SMITH
20 RESEARCH
DALLAS
7876 ADAMS
20 RESEARCH
DALLAS
7902 FORD
20 RESEARCH
DALLAS
7788 SCOTT
20 RESEARCH
DALLAS
7566 JONES
20 RESEARCH
DALLAS
7499 ALLEN
30 SALES
CHICAGO
7698 BLAKE
30 SALES
CHICAGO
7654 MARTIN
30 SALES
CHICAGO
7900 JAMES
30 SALES
CHICAGO
7844 TURNER
30 SALES
CHICAGO
7521 WARD
30 SALES
CHICAGO
40 OPERATIONS
BOSTON
15 rows selected.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

79

THIS IS LEFT OUTER JOIN.


1 SELECT EMPNO,ENAME,DEPT.DEPTNO,DNAME,LOC FROM EMP,DEPT
2* WHERE EMP.DEPTNO=DEPT.DEPTNO(+)
SQL> /
EMPNO ENAME
DEPTNO DNAME
LOC
---------- ---------- ---------- -------------- ------------7369 SMITH
20 RESEARCH
DALLAS
7499 ALLEN
30 SALES
CHICAGO
7521 WARD
30 SALES
CHICAGO
7566 JONES
20 RESEARCH
DALLAS
7654 MARTIN
30 SALES
CHICAGO
7698 BLAKE
30 SALES
CHICAGO
7782 CLARK
10 ACCOUNTING
NEW YORK
7788 SCOTT
20 RESEARCH
DALLAS
7839 KING
10 ACCOUNTING
NEW YORK
7844 TURNER
30 SALES
CHICAGO
7876 ADAMS
20 RESEARCH
DALLAS
7900 JAMES
30 SALES
CHICAGO
7902 FORD
20 RESEARCH
DALLAS
7934 MILLER
10 ACCOUNTING
NEW YORK
14 rows selected.
HERE WE DON'T HAVE ANY EXTRA INFO IN EMP TABLE BECAUSE OF FOREIGN KEY
RELATION.
THAT IS WE SHOULD NOT ENTER OTHER DEPARTMENT NUMBERS THAT ARE NOT
PRESENT IN THE DEPT TABLE

SQL> CREATE TABLE EMP1


2 AS
3 SELECT * FROM EMP;
Table created.
SQL> CREATE TABLE DEPT1
2 AS
3 SELECT * FROM DEPT;
Table created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

80

HERE BOTH THE TABLES HAVE NO RELATION WITH FOREIGN KEY AND PRIMARY
KEY.
HERE I AM INSERTING IN TO EMP1 TABLE DEPARTMENT 50,60,70 THAT ARE NOT THERE
IN DEPT1 TABLE
1 INSERT INTO EMP1
2 VALUES
3* (2,'KUMAR','MANAGER',7369,'01-JAN-90',1000,100,60)
SQL> /
1 row created.

1 INSERT INTO EMP1


2 VALUES
3* (3,'GAYATRI','MANAGER',7369,'01-JAN-90',1000,100,70)
SQL> /
1 row created.
SQL> COMMIT;
Commit complete.
SQL> SELECT EMPNO,ENAME,EMP1.DEPTNO,DNAME,LOC FROM EMP1,DEPT1
2 WHERE EMP1.DEPTNO=DEPT1.DEPTNO(+);
EMPNO ENAME
DEPTNO DNAME
LOC
---------- ---------- ---------- -------------- ------------7782 CLARK
10 ACCOUNTING NEW YORK
7839 KING
10 ACCOUNTING NEW YORK
7934 MILLER
10 ACCOUNTING NEW YORK
7369 SMITH
20 RESEARCH
DALLAS
7876 ADAMS
20 RESEARCH
DALLAS
7902 FORD
20 RESEARCH
DALLAS
7788 SCOTT
20 RESEARCH
DALLAS
7566 JONES
20 RESEARCH
DALLAS
7499 ALLEN
30 SALES
CHICAGO
7698 BLAKE
30 SALES
CHICAGO
7654 MARTIN
30 SALES
CHICAGO
7900 JAMES
30 SALES
CHICAGO
7844 TURNER
30 SALES
CHICAGO
7521 WARD
30 SALES
CHICAGO
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
1 PAVAN
2 KUMAR
3 GAYATRI

81

50
60
70

17 rows selected.
1 SELECT EMPNO,ENAME,EMP1.DEPTNO,DNAME,LOC FROM EMP1,DEPT1
2* WHERE EMP1.DEPTNO(+)=DEPT1.DEPTNO
SQL> /
EMPNO ENAME
DEPTNO DNAME
LOC
---------- ---------- ---------- -------------- ------------7782 CLARK
10 ACCOUNTING NEW YORK
7839 KING
10 ACCOUNTING NEW YORK
7934 MILLER
10 ACCOUNTING NEW YORK
7369 SMITH
20 RESEARCH
DALLAS
7876 ADAMS
20 RESEARCH
DALLAS
7902 FORD
20 RESEARCH
DALLAS
7788 SCOTT
20 RESEARCH
DALLAS
7566 JONES
20 RESEARCH
DALLAS
7499 ALLEN
30 SALES
CHICAGO
7698 BLAKE
30 SALES
CHICAGO
7654 MARTIN
30 SALES
CHICAGO
7900 JAMES
30 SALES
CHICAGO
7844 TURNER
30 SALES
CHICAGO
7521 WARD
30 SALES
CHICAGO
OPERATIONS BOSTON
15 rows selected.

1 SELECT EMPNO,ENAME,DEPT1.DEPTNO,DNAME,LOC FROM EMP1,DEPT1


2* WHERE EMP1.DEPTNO(+)=DEPT1.DEPTNO
SQL> /
EMPNO ENAME
DEPTNO DNAME
LOC
---------- ---------- ---------- -------------- ------------7782 CLARK
10 ACCOUNTING NEW YORK
7839 KING
10 ACCOUNTING NEW YORK
7934 MILLER
10 ACCOUNTING NEW YORK
7369 SMITH
20 RESEARCH
DALLAS
7876 ADAMS
20 RESEARCH
DALLAS
7902 FORD
20 RESEARCH
DALLAS
7788 SCOTT
20 RESEARCH
DALLAS
7566 JONES
20 RESEARCH
DALLAS
7499 ALLEN
30 SALES
CHICAGO
7698 BLAKE
30 SALES
CHICAGO
7654 MARTIN
30 SALES
CHICAGO
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
7900 JAMES
7844 TURNER
7521 WARD

82

30 SALES
CHICAGO
30 SALES
CHICAGO
30 SALES
CHICAGO
40 OPERATIONS BOSTON

15 rows selected.
1 SELECT EMPNO,ENAME,DEPT1.DEPTNO,DNAME,LOC FROM EMP1,DEPT1
2* WHERE EMP1.DEPTNO(+)=DEPT1.DEPTNO(+)
SQL> /
WHERE EMP1.DEPTNO(+)=DEPT1.DEPTNO(+)
*
ERROR at line 2:
ORA-01468: a predicate may reference only one outer-joined table
YOU CAN NOT KEEP + SIGN ON BOTH SIDES.
UPDATING ROWS:
UPDATE EMP
SET SAL = SAL+100,DEPTNO=10,JOB=CLERK;
UPDATE EMP
SET SAL = SAL+100,DEPTNO=10,JOB=CLERK;
WHERE <CONDITION>

YOU CAN UPDATE MORE THAN ONE COLUMN IN A TABLE AT A TIME.


SQL> CREATE TABLE EMPLOYEE
2 AS
3 SELECT * FROM EMP;
Table created.
SQL> UPDATE EMPLOYEE
2 SET SAL =1000, JOB = 'MANAGER';
14 rows updated.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

83

THE ABOVE STATEMENT UPDATED WHOLE TABLE.


SQL> UPDATE EMPLOYEE
2 SET SAL =2000, JOB='CLERK'
3 WHERE DEPTNO=10;
3 rows updated.
IN THE ABOVE TABLE THE ONLY DEPTNO 10 ROWS ARE UPDATED.
WHAT NOT WITH ALTER:
WE CANNOT DECREASE COLUMN SIZE IF DATA EXISTS.
WE CANNOT CHANGE NAME OF TABLE USING ALTER.
WE CANNOT CHANGE COLUMN NAME.
RENAMING THE TABLE :
RENAME EMP TO EMP1 ;
SQL> RENAME EMPLOYEE TO EMP_INFO;
Table renamed.
IN THE ABOVE STATEMENT EMPLOYEE WAS RENAMED TO EMP_INFO;
IF YOU QUERY EMPLOYEE NOW U WILL GET ERROR.
SQL> SELECT * FROM EMPLOYEE;
SELECT * FROM EMPLOYEE
*
ERROR at line 1:
ORA-00942: table or view does not exist
SAL> SELECT * FROM EMP_INFO;
THE ABOVE STATEMENT WILL WORK.
DEFAULT:
SQL> CREATE TABLE EMPLOYEE
2 (EMPNO NUMBER(10),
3 ENAME VARCHAR2(10),
4 DEPTNO NUMBER(10) DEFAULT 10);
Table created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

84

SQL> INSERT INTO EMPLOYEE


2 VALUES
3 (1,'PAVAN',10);
1 row created.
1 INSERT INTO EMPLOYEE
2 VALUES
3* (2,'KUMAR',20)
SQL> /
1 row created.
HERE WE HAD NOT GIVEN VALUE FOR DEPTNO.THEN IT HAD TAKEN 20 FOR DEPTNO,
BCOZ WE HAD GIVEN DEFAULT 20 FOR DEPTNO.
1 INSERT INTO EMPLOYEE
2 (EMPNO,ENAME)
3 VALUES
4* (2,'KUMAR')
5 /
1 row created.
1 INSERT INTO EMPLOYEE
2 VALUES
3* (2,'KUMAR')
4 /
INSERT INTO EMPLOYEE
*
ERROR at line 1:
ORA-00947: not enough values

SQL> SELECT * FROM EMPLOYEE;


EMPNO ENAME
DEPTNO
---------- ---------- ---------1 PAVAN
10
2 KUMAR
20
2 KUMAR
10
IN THE ABOVE QUERY WHENEVER YOU DON'T GIVE VALUE FOR DEPTNO THERE
DEFAULT VALUE WILL BE TAKEN.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

85

ADDING COMMENTS TO A TABLE .


YOU CAN ADD COMMENTS TO A TABLE USING THE COMMENT STATEMENT .
COMMENT ON TABLE EMP IS EMPLOYEE INFORMATION ;
IN THE REALTIME ENVIRONMENT WE WILL CREATING SO MANY TABLES THERE IT IS
VERY HARD TO FIND WHICH TABLE WILL HAVE WHAT INFO AT THAT TIME WE CREATE
COMMENTS ON TABLES.
NOW I AM CREATING COMMENTS ON THE TABLE EMP THAT IT SORES ALL THE
EMPLOYEE INFO.
COMMENT ON TABLE EMP IS ' IT STORES EMPLOYEE INFO '
SQL> /
Comment created.
VIEWING COMMENTS:
ALL_TAB_COMMENTS,USER_TAB_COMMENTS ;
SELECT * FROM USER_TAB_COMMENTS;
1* SELECT * FROM USER_TAB_COMMENTS WHERE TABLE_NAME='EMP'
SQL> /
TABLE_NAME
TABLE_TYPE
------------------------------ ----------COMMENTS
---------------------------------------------------------------------------------------------------EMP
TABLE
IT STORES EMPLOYEE INFO
TO SEE WHAT TABLE HAVE WHAT COMMENT WE HAVE TO QUERY
USER_TAB_COMMENTS.
DROP COMMENTS:
COMMENT ON TABLE EMP IS ;
TO DELETE THE COMMENT ON TABLE WE WRITE QUERY LIKE BELOW.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

86

COMMENT ON TABLE EMP IS ' ' ;


Comment created.
1 SELECT * FROM USER_TAB_COMMENTS
2* WHERE TABLE_NAME='EMP'
SQL> /
TABLE_NAME
TABLE_TYPE
------------------------------ ----------COMMENTS
---------------------------------------------------------------------------------------------------EMP
TABLE
REMOVE THE PRIMARY KEY CONSTRAINT ON THE DEPT TABLE AND
DEPTNO THE ASSOCIATED FOREIGN KEY CONSTRAINT ON THE
EMP(DEPTN0) COLUMN:
WHEN EVER YOU RELATE BOTH EMP AND DEPT TABLES WITH FOREIGN KEY THEN U
PRETTY WELL KNOW DEPT TABLE DEPTNO SHOULD HAVE PRIMARY KEY. NOW IF YOU
WANT TO DROP PRIMARY KEY CONSTRAINT ON DEPT TABLE IT WON'T ALLOW YOU
TO DROP BECAUSE IT IS CONNECTED WITH FOREIGN KEY OF EMP TABLE DEPTNO
COLUMN THEN IF YOU WANT TO DROP PRIMARY KEY WHAT U SHOULD DO IS TYPE
BELOW QUERY.
ALTER TABLE DEPT1
DROP CONSTRAINT DEPT1_PK CASCADE;
SQL> CREATE TABLE EMP1
2 AS
3 SELECT * FROM EMP;
Table created.
SQL> CREATE TABLE DEPT1
2 AS
3 SELECT * FROM DEPT;
Table created.
SQL> ALTER TABLE DEPT1
2 ADD CONSTRAINT DEPT1_PK PRIMARY KEY(DEPTNO);
Table altered.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

87

SQL> ALTER TABLE EMP1


2 ADD CONSTRAINT EMP1_FK FOREIGN KEY(DEPTNO) REFERENCES
DEPT1(DEPTNO);
Table altered.
SQL> ALTER TABLE DEPT1
2 DROP CONSTRAINT DEPT1_PK;
DROP CONSTRAINT DEPT1_PK
*
ERROR at line 2:
ORA-02273: this unique/primary key is referenced by some foreign keys
SQL> ALTER TABLE DEPT1
2 DROP CONSTRAINT DEPT1_PK CASCADE;
Table altered.
NOW BOTH PRIMARY KEY FOR DEPT1 AND FOREIGN KEY FOR EMP1 BOTH ARE
DELETED.

IF YOU WANT TO SEE WHAT COULMNS HAVE CONSTRAINTS,WE USE


BELOW TABLE.
SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME='DEPT1';
SET OPERATORS:
UNION ALL
UNION
INTERSECT
MINUS
SET OPERATORS ARE USED TO COMBINE INFORMATION OF SIMILAR TYPE FROM ONE
OR MORE
THAN ONE TABLE.DATATYPES OF CORRESPONDING COLUMNS MUST BE SAME.
UNION: ROWS OF FIRST QUERY + ROWS OF SECOND QUERY LESS
DUPLICATE ROWS

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

88

LIST OF JOBS IN DEPTNO=10 AND 20 LESS DUPLICATION.


SELECT JOB FROM EMP WHERE DEPTNO=10
UNION
SELECT JOB FROM EMP WHERE DEPTNO=20 ;
1 SELECT JOB FROM EMP WHERE DEPTNO=10
2 UNION
3* SELECT JOB FROM EMP WHERE DEPTNO=20
SQL> /
JOB
--------ANALYST
CLERK
MANAGER
PRESIDENT

UNION ALL: ROWS OF FIRST QUERY + ROWS OF SECOND QUERY WITH


DUPLICATE ROWS:
LIST OF JOBS IN DEPTNO=10 AND 20.
SELECT JOB FROM EMP WHERE DEPTNO=10
UNION ALL
SELECT JOB FROM EMP WHERE DEPTNO=20 ;
SQL> SELECT JOB FROM EMP WHERE DEPTNO=10
2 UNION ALL
3 SELECT JOB FROM EMP WHERE DEPTNO=20;
JOB
--------MANAGER
PRESIDENT
CLERK
CLERK
MANAGER
ANALYST
CLERK
ANALYST
8 rows selected.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

89

INTERSECT : COMMON ROWS FROM 2 QUERIES.


LIST OF JOBS COMMON IN DEPTNO=10 AND 20.
SELECT JOB FROM EMP WHERE DEPTNO=10
INTERSECT
SELECT JOB FROM EMP WHERE DEPTNO=20 ;
1 SELECT JOB FROM EMP WHERE DEPTNO=10
2 INTERSECT
3* SELECT JOB FROM EMP WHERE DEPTNO=20
SQL> /
JOB
--------CLERK
MANAGER
MINUS: WHICH GIVES UNIQUE ROWS:
LIST OFJOBS UNIQUE IN DEPTNO=20
SELECT JOB FROM EMP WHERE DEPTNO=20
MINUS
SELECT JOB FROM EMP WHERE DEPTNO=10
MINUS
SELECT JOB FROM EMP WHERE DEPTNO=30;
WITH IN OPERATOR:
SELECT JOB FROM EMP WHERE DEPTNO=20
MINUS
SELECT JOB FROM EMP WHERE DEPTNO IN(10,30);
1 SELECT JOB FROM EMP WHERE DEPTNO=10
2 MINUS
3* SELECT JOB FROM EMP WHERE DEPTNO=20
SQL> /
JOB
--------PRESIDENT

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

90

1 SELECT JOB FROM EMP WHERE DEPTNO=10


2 MINUS
3 SELECT JOB FROM EMP WHERE DEPTNO=20
4 MINUS
5* SELECT JOB FROM EMP WHERE DEPTNO=30
SQL> /

JOB
--------PRESIDENT

1 SELECT JOB FROM EMP WHERE DEPTNO=10


2 MINUS
3* SELECT JOB FROM EMP WHERE DEPTNO IN (20,30)
SQL> /
JOB
--------PRESIDENT
1* SELECT JOB FROM EMP WHERE DEPTNO IN (10,20) THIS IS UNION ALL
SQL> /
JOB
--------CLERK
MANAGER
MANAGER
ANALYST
PRESIDENT
CLERK
ANALYST
CLERK
8 rows selected.
SQL> SELECT DISTINCT(JOB) FROM EMP WHERE DEPTNO IN (10,20); - THIS IS UNION.
JOB
--------ANALYST
CLERK
MANAGER
PRESIDENT
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

91

CREATING GROUPS OF DATA: GROUP BY


DIVIDE ROWS IN A TABLE INTO SMALLER GROUPS BY USING THE GROUP BY CLAUSE.
THE BELOW STATEMENTS DOES NOT WORK:
SQL> SELECT DEPTNO,SUM(SAL) FROM EMP;
SELECT DEPTNO,SUM(SAL) FROM EMP
*
ERROR at line 1:
ORA-00937: not a single-group group function
THE ABOVE QUERY DOES NOT WORK BECAUSE DEPTNO WILL GIVES 14 ROWS AND
SUM(SAL) WILL GIVES ONE ROW. THERE IS NO MATCHING OF ROWS.
ALL COLUMNS IN THE SELECT LIST THAT ARE NOT IN GROUP FUNCTIONS MUST BE IN
THE GROUP
BY CLAUSE.
ANY COLUMN OR EXPRESSION IN THE SELECT LIST THST IS NOT AN AGGREGATE
FUNCTION MUST BE IN THE GROUP BY CLAUSE.
IF IT HAS TO WORK WE HAVE TO GIVE LIKE THIS.
SQL> SELECT DEPTNO,SUM(SAL) FROM EMP
2 GROUP BY DEPTNO;
DEPTNO SUM(SAL)
---------- ---------10
8750
20 10875
30
9400
WHENEVER WE SEE NON AGGREGATE COLUMN IN SELECT LIST THAT HAS TO BE
THERE AFTER GROUP BY CLAUSE
LIKE ABOVE BELOW QUERIES WONT WORK:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

92

SQL> SELECT DEPTNO,COUNT(DEPTNO) FROM EMP;


SELECT DEPTNO,COUNT(DEPTNO) FROM EMP
*
ERROR at line 1:
ORA-00937: not a single-group group function
SQL> SELECT DEPTNO,AVG(DEPTNO) FROM EMP
2 /
SELECT DEPTNO,AVG(DEPTNO) FROM EMP
*
ERROR at line 1:
ORA-00937: not a single-group group function
SQL> SELECT DEPTNO,MAX(DEPTNO) FROM EMP;
SELECT DEPTNO,MAX(DEPTNO) FROM EMP
*
ERROR at line 1:
ORA-00937: not a single-group group function
SQL> SELECT DEPTNO,MIN(DEPTNO) FROM EMP;
SELECT DEPTNO,MIN(DEPTNO) FROM EMP
*
ERROR at line 1:
ORA-00937: not a single-group group function
WE HAVE TO GIVE NON AGGREGATE COLUMNS THAT ARE IN THE SELECT
LIST IN GROUP BY CLAUSE.

SQL> SELECT DEPTNO,SUM(SAL) FROM EMP


2 GROUP BY DEPTNO;
DEPTNO SUM(SAL)
---------- ---------10
8750
20 10875
30
9400
SQL> SELECT DEPTNO,COUNT(ENAME)
2 FROM EMP
3 GROUP BY DEPTNO;
DEPTNO COUNT(ENAME)
---------- -----------10
3
20
5
30
6
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

93

SQL> SELECT DEPTNO,AVG(SAL)


2 FROM EMP
3 GROUP BY DEPTNO;
DEPTNO AVG(SAL)
---------- ---------10 2916.66667
20
2175
30 1566.66667
SQL> SELECT DEPTNO,SUM(SAL)
2 FROM EMP
3 GROUP BY DEPTNO;
DEPTNO SUM(SAL)
---------- ---------10
8750
20 10875
30
9400

THE GROUP BY COLUMN DOES NOT HAVE TO BE IN THE SELECT LIST:


SELECT AVG(SAL)
FROM EMP
GROUP BY DEPTNO;
SQL> SELECT AVG(SAL)
2 FROM EMP
3 GROUP BY DEPTNO;
AVG(SAL)
---------2916.66667
2175
1566.66667
YOU CAN USE THE GROUP FUCTIONS IN THE ORDER BY CLAUSE:
SELECT DEPTNO,AVG(SAL)
FROM EMP
GROUP BY DEPTNO

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

94

ORDER BY AVG(SAL);
SQL> SELECT DEPTNO,AVG(SAL)
2 FROM EMP
3 GROUP BY DEPTNO
4 ORDER BY AVG(SAL);
DEPTNO AVG(SAL)
---------- ---------30 1566.66667
20
2175
10 2916.66667

USING THE GROUP BY CLAUSE ON MULTIPLE COLUMNS:


SELECT DEPTNO,JOB,SUM(SAL)
FROM EMP
GROUP BY DEPTNO,JOB;

SQL> SELECT DEPTNO,JOB,SUM(SAL)


2 FROM EMP
3 GROUP BY DEPTNO,JOB;
DEPTNO JOB
SUM(SAL)
---------- --------- ---------10 CLERK
1300
10 MANAGER
2450
10 PRESIDENT
5000
20 ANALYST
6000
20 CLERK
1900
20 MANAGER
2975
30 CLERK
950
30 MANAGER
2850
30 SALESMAN
5600
9 rows selected.
USING WHERE CLAUSE FOR THE QUERY:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

95

SELECT DEPTNO,AVG(SAL)
FROM EMP
WHERE DEPTNO=10
GROUP BY DEPTNO
HAVING AVG(SAL) >2000;
SQL> SELECT DEPTNO,SUM(SAL) FROM EMP
2 WHERE DEPTNO=10
3 GROUP BY DEPTNO
4 HAVING SUM(SAL) > 9000;
no rows selected

1 SELECT DEPTNO,SUM(SAL) FROM EMP


2 WHERE DEPTNO=10
3 GROUP BY DEPTNO
4* HAVING SUM(SAL) > 8000
SQL> /
DEPTNO SUM(SAL)
---------- ---------10
8750
REMEMBER ONE THING WHENEVER YOU SEE AGGREGATE COLUMN IN WHERE
CLAUSE IT WON'T WORK. BUT WHENEVER YOU SEE NON-AGGREGATE COLUMN IN
WHERE CLAUSE IT WILL WORK.

YOU CANNOT USE THE WHERE CLAUSE TO RESTRICT GROUPS:

SELECT DEPTNO,AVG(SAL)
FROM EMP
WHERE AVG(SAL) >2000
GROUP BY DEPTNO;
SQL> SELECT DEPTNO,SUM(SAL) FROM EMP
2 WHERE SUM(SAL) > 9000
3 GROUP BY DEPTNO;
WHERE SUM(SAL) > 9000
*
ERROR at line 2:
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

96

ORA-00934: group function is not allowed here


HERE WHENEVER ORACLE EXECUTES THIS QUERY IT EXECUTES WHERE FIRST AND
THEN GROUP BY HERE IT IS NOT POSSIBLE TO FIND SUM(SAL) FOR ALL
DEPARTMENTS BEFORE GROUP BY CLAUSE.
WHENEVER YOU SEE AGGREGATE COLUMN IN WHERE CLAUSE IT WON'T WORK.

YOU USE THE HAVING CLAUSE TO RESTRICT GROUPS:


SELECT DEPTNO,AVG(SAL)
FROM EMP
GROUP BY DEPTNO
HAVING AVG(SAL) >2000;

SQL> SELECT DEPTNO,SUM(SAL) FROM EMP


2 GROUP BY DEPTNO
3 HAVING SUM(SAL) > 9000;
DEPTNO SUM(SAL)
---------- ---------20 10875
30
9400
HERE WE HAVE TO USE HAVING CLAUSE. THE ORDER OF EXECUTION FOR THE GROUP
BY QUERIES IS LIKE THIS FIRST WHERE CLAUSE,GROUP BY, HAVING CLAUSE.

THE ORDER OF EVALUATION OF THE CLAUSES.


WHERE,GROUP BY,HAVING CLAUSE.
DISPLAY MAXIMUM AVAERAGE SALARY:
SELECT MAX(AVG(SAL)) FROM EMP GROUP BY DEPTNO;
SQL> SELECT MAX(AVG(SAL)) FROM EMP GROUP BY DEPTNO;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

97

MAX(AVG(SAL))
------------2916.66667
CHARACTER FUNCTIONS:
SELECT LOWER(PAVAN) FROM DUAL;
SELECT UPPER(pavan) FROM DUAL;
SELECT INITCAP(pavan) FROM DUAL;
SELECT CONCAT('GOOD','BOY') FROM DUAL;
SELECT SUBSTR('PAVAN',1,3) FROM DUAL;
SELECT LENGTH('PAVAN') FROM DUAL;
SELECT INSTR('PAVAN','V') FROM DUAL;
SQL> SELECT LOWER('PAVAN') FROM DUAL;
LOWER
----pavan
SQL> SELECT UPPER('pavan') FROM DUAL;
UPPER
----PAVAN
SQL> SELECT INITCAP('pavan') FROM DUAL;
INITC
----Pavan
SQL> SELECT CONCAT('GOOD','BOY') FROM DUAL;
CONCAT(
------GOODBOY
SQL> SELECT SUBSTR('PAVAN',1,3) FROM DUAL;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

98

SUB
--PAV
SQL> SELECT LENGTH('PAVAN') FROM DUAL;
LENGTH('PAVAN')
--------------5
SQL> SELECT INSTR('PAVAN','V') FROM DUAL;
INSTR('PAVAN','V')
-----------------3
DATE FUNCTIONS:
MONTHS_BETWEEN

NUMBER OF MONTHS BETWEEN DATES

SELECT MONTHS_BETWEEN('01-SEP-95','11-JAN-94' )FROM DUAL;


SELECT MONTHS_BETWEEN('11-JAN-94' ,'01-SEP-95')FROM DUAL;

SQL> SELECT MONTHS_BETWEEN('01-SEP-95','11-JAN-94' )FROM DUAL;


MONTHS_BETWEEN('01-SEP-95','11-JAN-94')
--------------------------------------19.6774194
SQL> SELECT MONTHS_BETWEEN('11-JAN-94' ,'01-SEP-95')FROM DUAL;
MONTHS_BETWEEN('11-JAN-94','01-SEP-95')
---------------------------------------19.677419
ADD_MONTHS

ADD MONTHS TO DATE.

SELECT ADD_MONTHS('11-JAN-94',6) FROM DUAL;


SQL> SELECT ADD_MONTHS('11-JAN-94',6) FROM DUAL;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

99

ADD_MONTH
--------11-JUL-94
NEXT_DAY

NEXT DAY OF THE DATE SPECIFIED.

SELECT NEXT_DAY('01-SEP-96','FRIDAY') FROM DUAL;


SQL> SELECT NEXT_DAY('01-SEP-96','FRIDAY') FROM DUAL;
NEXT_DAY(
--------06-SEP-96
LAST_DAY

LAST DAY OF THE MONTH.

SELECT LAST_DAY('01-SEP-96') FROM DUAL;


SQL> SELECT LAST_DAY('01-SEP-96') FROM DUAL;
LAST_DAY(
--------30-SEP-96
SQL *PLUS FILE COMMANDS:
SAVE FILENAME : SAVES CURRENT CONTENTS OF SQL BUFFER TO FILE,THE DEFAULT
FILE EXTENSION IS .SQL
GET FILENAME:WRITES THE CONTENTS OF THE FILE.
STARTFILENAME:RUNS THE FILE.
@FILENAME:RUNS THE FILE,
EDIT FILENAME:INVOKES EDITOR TO EDIT CONTENTS OF A SAVED FILE.
SPOOL C:\PAVAN : IT IS USED FOR SAVING OUTPUT OF THE QUERY IN THE FILE.THE
FILE
EXTENSION IS .LST.
EXIT:LEAVES THE SQL* PLUS.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

100

SQL> SELECT * FROM EMP;


EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
7521 WARD
SALESMAN
7698 22-FEB-81
1250
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT ANALYST
7566 19-APR-87
3000
7839 KING
PRESIDENT
17-NOV-81
5000
7844 TURNER SALESMAN
7698 08-SEP-81
1500
7876 ADAMS CLERK
7788 23-MAY-87
1100
7900 JAMES
CLERK
7698 03-DEC-81
950
7902 FORD
ANALYST
7566 03-DEC-81
3000
7934 MILLER CLERK
7782 23-JAN-82
1300

COMM
300
500
1400

DEPTNO

20
30
30
20
30
30
10
20
10
30
20
30
20
10

14 rows selected.
SQL> SAVE PAVAN
Created file PAVAN.sql
IT SAVES THE QUERY WHICH IS THERE IN EDITOR.
SQL> GET PAVAN
1* SELECT * FROM EMP
IT DISPLAYS THE QUERY IN THE FILE.
SQL> START PAVAN
IT EXECUTES THE QUERY THAT IS THERE IN FILE PAVAN.
SQL> SELECT * FROM EMP;
EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
7521 WARD
SALESMAN
7698 22-FEB-81
1250
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT ANALYST
7566 19-APR-87
3000
I Soft Solutions ,Bang-54.

COMM
300
500
1400

DEPTNO
20
30
30
20
30
30
10
20

STRUCTURED QUERY LANGUAGE

ORACLE
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER
14 rows selected.

PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK

101

17-NOV-81
7698 08-SEP-81
7788 23-MAY-87
7698 03-DEC-81
7566 03-DEC-81
7782 23-JAN-82

5000
1500
1100
950
3000
1300

10
30
20
30
20
10

SQL> @PAVAN
IT EXECUTES THE QUERY THAT IS THERE IN FILE PAVAN.
SQL> SELECT * FROM EMP;
EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
7521 WARD
SALESMAN
7698 22-FEB-81
1250
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT ANALYST
7566 19-APR-87
3000
7839 KING
PRESIDENT
17-NOV-81
5000
7844 TURNER SALESMAN
7698 08-SEP-81
1500
7876 ADAMS CLERK
7788 23-MAY-87
1100
7900 JAMES
CLERK
7698 03-DEC-81
950
7902 FORD
ANALYST
7566 03-DEC-81
3000
7934 MILLER CLERK
7782 23-JAN-82
1300

COMM
300
500
1400

DEPTNO

20
30
30
20
30
30
10
20
10
30
20
30
20
10

SQL> RUN PAVAN


IT EXECUTES THE QUERY THAT IS THERE IN FILE PAVAN.
1* SELECT * FROM EMP
SQL> SELECT * FROM EMP;
EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
7521 WARD
SALESMAN
7698 22-FEB-81
1250
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT ANALYST
7566 19-APR-87
3000
7839 KING
PRESIDENT
17-NOV-81
5000
I Soft Solutions ,Bang-54.

COMM
300
500
1400

DEPTNO
20
30
30
20
30
30
10
20
10

STRUCTURED QUERY LANGUAGE

ORACLE
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER
14 rows selected.

SALESMAN
CLERK
CLERK
ANALYST
CLERK

102

7698 08-SEP-81
7788 23-MAY-87
7698 03-DEC-81
7566 03-DEC-81
7782 23-JAN-82

1500
1100
950
3000
1300

30
20
30
20
10

SQL> EDIT PAVAN


IT OPENS THE FILE FOR EDITING.
DIFFERENCE BETWEEN SQL AND SQL*PLUS:
SQL : STRUCTURED QUERY LANGUAGE.
SQL
IS A LANGUAGE FOR COMMUNICATING WITH
THE ORACLE SERVER TO ACCESS DATA.
IS BASED ON AMERICAN NATIONAL
STANDARDS INSTITUTE.
MANIPULATES DATA AND TABLE DEFINITIONS
IN THE DATABASE.

SQL*PLUS
RECOGNIZES SQL STATEMENTS AND SENDS
THEM TO THE SERVER.
IS THE ORACLE PROPRIETARY INTERFACE FOR
EXECUTING SQL STATEMENTS.
DOES NOT ALLOWMANIPULATION OF VALUES
IN THE DATABASE.

OPERATORS PRECEDENCE:
ORDER EVALUATED
1
2
3
4

OPERATOR
ALL COMPARISON OPERATORS
NOT
AND
OR

OVERRIDE RULES OF PRECEDENCE BY USING PARENTHESES.


USING TWO COLUMNS IN ORDER BY:
SELECT ENAME,DEPTNO,SAL FROM EMP
ORDER BY DEPTNO DESC,SAL DESC;
SELECT ENAME,DEPTNO,SAL FROM EMP
ORDER BY DEPTNO,SAL;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

103

SELECT ENAME,DEPTNO,SAL FROM EMP


ORDER BY DEPTNO DESC,SAL;
SQL> SELECT ENAME,DEPTNO,SAL FROM EMP
2 ORDER BY DEPTNO DESC,SAL DESC;
ENAME
DEPTNO
SAL
---------- ---------- ---------BLAKE
30
2850
ALLEN
30
1600
TURNER
30
1500
WARD
30
1250
MARTIN
30
1250
JAMES
30
950
SCOTT
20
3000
FORD
20
3000
JONES
20
2975
ADAMS
20
1100
SMITH
20
800
KING
10
5000
CLARK
10
2450
MILLER
10
1300
14 rows selected.

SQL> SELECT ENAME,DEPTNO,SAL FROM EMP


2 ORDER BY DEPTNO,SAL;
ENAME
DEPTNO
SAL
---------- ---------- ---------MILLER
10
1300
CLARK
10
2450
KING
10
5000
SMITH
20
800
ADAMS
20
1100
JONES
20
2975
SCOTT
20
3000
FORD
20
3000
JAMES
30
950
WARD
30
1250
MARTIN
30
1250
TURNER
30
1500
ALLEN
30
1600
BLAKE
30
2850

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

104

14 rows selected.
SQL> SELECT ENAME,DEPTNO,SAL FROM EMP
2 ORDER BY DEPTNO DESC,SAL;
ENAME
DEPTNO
SAL
---------- ---------- ---------JAMES
30
950
WARD
30
1250
MARTIN
30
1250
TURNER
30
1500
ALLEN
30
1600
BLAKE
30
2850
SMITH
20
800
ADAMS
20
1100
JONES
20
2975
SCOTT
20
3000
FORD
20
3000
MILLER
10
1300
CLARK
10
2450
KING
10
5000
14 rows selected.
YOU CAN SORT BY A COLUMN THAT IS NOT IN THE SELECT LIST.

USE A VARIABLE PREFIXED WITH AN AMPERSAND (&) TO PROMPT THE


USER FO A VALUE:

SET VERIFY OFF


SELECT EMPNO,ENAME,SAL,DEPTNO FROM EMP
WHERE EMPNO=&EMPLOYEE_NUMBER;
SET VERIFY ON
SELECT EMPNO,ENAME,SAL,DEPTNO FROM EMP
WHERE EMPNO=&EMPLOYEE_NUMBER;
SQL> SELECT EMPNO,ENAME,SAL,DEPTNO FROM EMP
2 WHERE EMPNO=&EMPLOYEE_NUMBER;
Enter value for employee_number: 7788
old 2: WHERE EMPNO=&EMPLOYEE_NUMBER
new 2: WHERE EMPNO=7788

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

105

EMPNO ENAME
SAL DEPTNO
---------- ---------- ---------- ---------7788 SCOTT
3000
20
SQL> SET VERIFY OFF
SQL> /
Enter value for employee_number: 7369
EMPNO ENAME
SAL DEPTNO
---------- ---------- ---------- ---------7369 SMITH
800
20
SQL> SET VERIFY ON
SQL> /
Enter value for employee_number: 7566
old 2: WHERE EMPNO=&EMPLOYEE_NUMBER
new 2: WHERE EMPNO=7566
EMPNO ENAME
SAL DEPTNO
---------- ---------- ---------- ---------7566 JONES
2975
20
USING SINGLE QUOTATION MARKS FOR DATE AND CHARACTER VALUES:
SELECT ENAME,DEPTNO,SAL*2 FROM EMP
WHERE JOB='&JOB_TITLE'
SELECT ENAME,DEPTNO,SAL*2 FROM EMP
WHERE JOB=UPPER('&JOB_TITLE')
SQL> SELECT ENAME,DEPTNO,SAL*2 FROM EMP
2 WHERE JOB='&JOB_TITLE'
3 /
Enter value for job_title: MANAGER
old 2: WHERE JOB='&JOB_TITLE'
new 2: WHERE JOB='MANAGER'
ENAME
DEPTNO
SAL*2
---------- ---------- ---------JONES
20
5950
BLAKE
30
5700
CLARK
10
4900

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

106

SQL> SELECT ENAME,DEPTNO,SAL*2 FROM EMP


2 WHERE JOB=UPPER('&JOB_TITLE')
SQL> /
Enter value for job_title: clerk
old 2: WHERE JOB=UPPER('&JOB_TITLE')
new 2: WHERE JOB=UPPER('clerk')
ENAME
DEPTNO
SAL*2
---------- ---------- ---------SMITH
20
1600
ADAMS
20
2200
JAMES
30
1900
MILLER
10
2600

USE SUBSTITUTION VARIABLES TO SUPPLEMENT THE FOLLOWING:


WHERE CONDITION
ORDER BY
COLUMN EXPRESSION
TABLE
ENTIRE SELECT STATEMENT
SELECT & REMENNING_SELECT_STATEMENT;
SELECT EMPNO,ENAME,&COLUMN_NAME
FROM &TABLE_NAME
WHERE &WHERE_CONDITIN
ORDER BY & COL_NAME

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

107

SQL> SELECT & REMENNING_SELECT_STATEMENT;


Enter value for remenning_select_statement: * from emp
old 1: SELECT & REMENNING_SELECT_STATEMENT
new 1: SELECT * from emp
EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
7521 WARD
SALESMAN
7698 22-FEB-81
1250
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT ANALYST
7566 19-APR-87
3000
7839 KING
PRESIDENT
17-NOV-81
5000
7844 TURNER SALESMAN
7698 08-SEP-81
1500
7876 ADAMS
CLERK
7788 23-MAY-87
1100
7900 JAMES
CLERK
7698 03-DEC-81
950
7902 FORD
ANALYST
7566 03-DEC-81
3000
7934 MILLER CLERK
7782 23-JAN-82
1300

COMM

DEPTNO

20
30
30
20
1400
30
30
10
20
10
0
30
20
30
20
10
300
500

14 rows selected.
SQL> SELECT EMPNO,ENAME,&COLUMN_NAME
2 FROM &TABLE_NAME
3 WHERE &WHERE_CONDITIN
4 ORDER BY & COL_NAME
5 /
Enter value for column_name: SAL
old 1: SELECT EMPNO,ENAME,&COLUMN_NAME
new 1: SELECT EMPNO,ENAME,SAL
Enter value for table_name: EMP
old 2: FROM &TABLE_NAME
new 2: FROM EMP
Enter value for where_conditin: SAL > 2000
old 3: WHERE &WHERE_CONDITIN
new 3: WHERE SAL > 2000
Enter value for col_name: SAL
old 4: ORDER BY & COL_NAME
new 4: ORDER BY SAL
EMPNO ENAME
---------- ---------- ----------

SAL

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
7782 CLARK
7698 BLAKE
7566 JONES
7788 SCOTT
7902 FORD
7839 KING

108

2450
2850
2975
3000
3000
5000

6 rows selected.

WE USE & FOR INSERTING VALUES IN THE TABLE:


INSERT INTO DEPT VALUES (&DEPARTMENT_NO,&DEPARTMENT
NAME,&LOCATION);

SQL> CREATE TABLE DEPT_DUP


2 AS
3 SELECT * FROM DEPT;
Table created.
1* INSERT INTO DEPT_DUP VALUES (&DEPARTMENT_NO,'&DEPARTMENT
NAME','&LOCATION')
SQL> /
Enter value for department_no: 50
Enter value for department: COMPUTERS
Enter value for location: NEW YORK
old 1: INSERT INTO DEPT_DUP VALUES (&DEPARTMENT_NO,'&DEPARTMENT
NAME','&LOCATION')
new 1: INSERT INTO DEPT_DUP VALUES (50,'COMPUTERS NAME','NEW YORK')
1 row created.

SQL STATEMENTS:
SELECT

DATA RETRIVAL

INSERT
UPDATE
DELETE

DATA MANIPULATION LANGUAGE


(DML STATEMENTS)

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

109

CREATE
ALTER
DROP
RENAME
TRUNCATE

DATA DEFINITION LANGUAGE


(DDL STATEMENTS)

COMMIT
ROLLBACK
SAVEPOINT
GRANT
REVOKE

TRANSACTION CONTROL

DATA CONTROL LANGUAGE


(DCL)

SYNONYMS:
SQL> CREATE SYNONYM D FOR DEPT;
Synonym created.
SQL> SELECT * FROM D;
SQL> DROP SYNONYM D;
Synonym dropped.
SQL> CREATE SYNONYM DEPARTMENT FOR DEPT;
Synonym created.
SQL> SELECT * FROM DEPT;
DEPTNO DNAME
LOC
---------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS
BOSTON
SQL> SELECT * FROM DEPARTMENT;
DEPTNO DNAME
LOC
---------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
40 OPERATIONS

110

BOSTON

RENAME IS DIFFERENT FROM SYNONYM.

SUBQUERIES:
QUERY INSIDE A QUERY IS CALLED SUBQUERY.
THE SUBQUERY (INNER QUERY)EXECUTES ONCE BEFORE THE MAIN QUERY.
THE RESULT OF THE SUBQUERY IS USED BY THE MAIN QUERY(OUTER QUERY).
SINGLE-ROW SUBQUERIES:
RETURN ONLY ONE ROW.
USE SINGLE ROW COMPARISON OPERATORS =,>,>=,<,<=,<>
SELECT MINIMUM SALARY OF THE EMPLOYEE.
SELECT ENAME,JOB,SAL
FROM EMP
WHERE SAL = (SELECT MIN(SAL) FROM EMP)
SELECT MAXIMUM SALARY OF THE EMPLOYEE.
SELECT ENAME,JOB,SAL
FROM EMP
WHERE SAL = (SELECT MAX(SAL) FROM EMP)

SQL> SELECT MAX(SAL) FROM EMP;


MAX(SAL)
---------5000
SQL> SELECT * FROM EMP WHERE SAL = 5000;
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7839 KING
PRESIDENT
17-NOV-81
5000
10

DEPTNO

SQL> SELECT * FROM EMP WHERE SAL = (SELECT MAX(SAL) FROM EMP);
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

111

EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7839 KING
PRESIDENT
17-NOV-81
5000
10

DEPTNO

1* SELECT * FROM EMP WHERE SAL = (SELECT MIN(SAL) FROM EMP)


SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
20

DEPTNO

NULL VALUE SUBQUERY:


SQL> SELECT * FROM EMP WHERE JOB=(SELECT JOB FROM EMP WHERE
ENAME='SMYTHE');
no rows selected
MULTI-ROW SUBQURIES:
SELECT * FROM EMP
WHERE SAL =(SELECT SAL FROM EMP);
WHERE SAL =(SELECT SAL FROM EMP)
*
ERROR at line 2:
ORA-01427: single-row sub query returns more than one row
RETURN MORE THAN ONE ROW.USE MULTIPLE-ROW COMPARISON OPERATORS.
IN , ANY , ALL OPERATORS.
SELECT * FROM EMP
WHERE SAL IN (SELECT SAL FROM EMP);
WHICH DISPLAYS ALL THE ROWS OF EMP, THAT IS IT IS SAME AS SELECT * FROM EMP;
=ANY OPERATOR AND = SOME:
SELECT * FROM EMP
WHERE SAL = ANY (SELECT SAL FROM EMP);

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

112

HERE IN IS SAME AS = ANY AND = SOME.


WHICH DISPLAYS ALL THE ROWS OF EMP. THAT IS = ANY MEANS IN
SQL> SELECT * FROM EMP
2 WHERE SAL IN (SELECT SAL FROM EMP);
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
20
7900 JAMES
CLERK
7698 03-DEC-81
950
30
7876 ADAMS
CLERK
7788 23-MAY-87
1100
20
7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
30
7654 MARTIN
SALESMAN
7698 28-SEP-81
1250
1400
30
7934 MILLER
CLERK
7782 23-JAN-82
1300
10
7844 TURNER
SALESMAN
7698 08-SEP-81
1500
0
30
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
300
30
7782 CLARK
MANAGER
7839 09-JUN-81
2450
10
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
30
7566 JONES
MANAGER
7839 02-APR-81
2975
20
7788 SCOTT
ANALYST
7566 19-APR-87
3000
20
7902 FORD
ANALYST
7566 03-DEC-81
3000
20
7839 KING
PRESIDENT
17-NOV-81
5000
10
14 rows selected.
1 SELECT * FROM EMP
2* WHERE SAL = ANY (SELECT SAL FROM EMP)
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
20
7900 JAMES
CLERK
7698 03-DEC-81
950
30
7876 ADAMS
CLERK
7788 23-MAY-87
1100
20
7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
30
7654 MARTIN
SALESMAN
7698 28-SEP-81
1250
1400
30
7934 MILLER
CLERK
7782 23-JAN-82
1300
10
7844 TURNER
SALESMAN
7698 08-SEP-81
1500
0
30
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
300
30
7782 CLARK
MANAGER
7839 09-JUN-81
2450
10
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
30
7566 JONES
MANAGER
7839 02-APR-81
2975
20
7788 SCOTT
ANALYST
7566 19-APR-87
3000
20
7902 FORD
ANALYST
7566 03-DEC-81
3000
20
7839 KING
PRESIDENT
17-NOV-81
5000
10
14 rows selected.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

113

1 SELECT * FROM EMP


2* WHERE SAL = SOME (SELECT SAL FROM EMP)
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
20
7900 JAMES
CLERK
7698 03-DEC-81
950
30
7876 ADAMS
CLERK
7788 23-MAY-87
1100
20
7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
30
7654 MARTIN
SALESMAN
7698 28-SEP-81
1250
1400
30
7934 MILLER
CLERK
7782 23-JAN-82
1300
10
7844 TURNER
SALESMAN
7698 08-SEP-81
1500
0
30
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
300
30
7782 CLARK
MANAGER
7839 09-JUN-81
2450
10
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
30
7566 JONES
MANAGER
7839 02-APR-81
2975
20
7788 SCOTT
ANALYST
7566 19-APR-87
3000
20
7902 FORD
ANALYST
7566 03-DEC-81
3000
20
7839 KING
PRESIDENT
17-NOV-81
5000
10
14 rows selected.
<ANY OR < SOME OPERATOR:
SELECT * FROM EMP
WHERE SAL < ANY (SELECT SAL FROM EMP);
< ANY MEANS LESS THAN THE MAXIMUM.HERE MAX SALARY IS 5000.
EXCEPT THAT EVERY SAL DISPALYED.
1 SELECT * FROM EMP
2* WHERE SAL < ANY (SELECT SAL FROM EMP)
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
20
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
300
30
7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
30
7566 JONES
MANAGER
7839 02-APR-81
2975
20
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
1400
30
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
30
7782 CLARK
MANAGER
7839 09-JUN-81
2450
10
7788 SCOTT ANALYST
7566 19-APR-87
3000
20
7844 TURNER SALESMAN
7698 08-SEP-81
1500
0
30
7876 ADAMS
CLERK
7788 23-MAY-87
1100
20
7900 JAMES
CLERK
7698 03-DEC-81
950
30
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
7902 FORD
ANALYST
7934 MILLER CLERK

114

7566 03-DEC-81
7782 23-JAN-82

3000
1300

20
10

13 rows selected.

1 SELECT * FROM EMP


2* WHERE SAL < SOME (SELECT SAL FROM EMP)
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
20
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
300
30
7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
30
7566 JONES
MANAGER
7839 02-APR-81
2975
20
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
1400
30
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
30
7782 CLARK
MANAGER
7839 09-JUN-81
2450
10
7788 SCOTT ANALYST
7566 19-APR-87
3000
20
7844 TURNER SALESMAN
7698 08-SEP-81
1500
0
30
7876 ADAMS
CLERK
7788 23-MAY-87
1100
20
7900 JAMES
CLERK
7698 03-DEC-81
950
30
7902 FORD
ANALYST
7566 03-DEC-81
3000
20
7934 MILLER CLERK
7782 23-JAN-82
1300
10
13 rows selected.
2ND HIGHEST:

1 SELECT * FROM EMP


2 WHERE SAL = (SELECT MAX(SAL) FROM EMP
3* WHERE SAL < ANY (SELECT SAL FROM EMP))
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ----------

I Soft Solutions ,Bang-54.

DEPTNO

STRUCTURED QUERY LANGUAGE

ORACLE
7788 SCOTT
7902 FORD

ANALYST
ANALYST

115

7566 19-APR-87
7566 03-DEC-81

3000
3000

20
20

3RD HIGHEST:
1 SELECT * FROM EMP
2 WHERE SAL = (SELECT MAX(SAL) FROM EMP
3 WHERE SAL < ANY (SELECT SAL FROM EMP
4 WHERE SAL < ANY (SELECT SAL FROM EMP
5* )))
6 /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7566 JONES
MANAGER
7839 02-APR-81
2975
20

4TH HIGHEST:
1 SELECT * FROM EMP
2 WHERE SAL = (SELECT MAX(SAL) FROM EMP
3 WHERE SAL < ANY (SELECT SAL FROM EMP
4 WHERE SAL < ANY (SELECT SAL FROM EMP
5 WHERE SAL < ANY (SELECT SAL FROM EMP
6* ))))
7 /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7698 BLAKE
MANAGER
7839 01-MAY-81
2850
30
5TH HIGHEST:
1 SELECT * FROM EMP
2 WHERE SAL = (SELECT MAX(SAL) FROM EMP
3 WHERE SAL < ANY (SELECT SAL FROM EMP
4 WHERE SAL < ANY (SELECT SAL FROM EMP
5 WHERE SAL < ANY (SELECT SAL FROM EMP
6 WHERE SAL < ANY (SELECT SAL FROM EMP
7* )))))
8 /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7782 CLARK
MANAGER
7839 09-JUN-81
2450
10
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

116

AND SO ON
2ND HIGHEST:
1 SELECT * FROM EMP
2 WHERE SAL = (SELECT MAX(SAL) FROM EMP
3 WHERE SAL < SOME (SELECT SAL FROM EMP
4* ))
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7788 SCOTT ANALYST
7566 19-APR-87
3000
20
7902 FORD
ANALYST
7566 03-DEC-81
3000
20

DEPTNO

3RD HIGHEST:
1 SELECT * FROM EMP
2 WHERE SAL = (SELECT MAX(SAL) FROM EMP
3 WHERE SAL < SOME (SELECT SAL FROM EMP
4 WHERE SAL < SOME (SELECT SAL FROM EMP
5* )))
6 /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7566 JONES
MANAGER
7839 02-APR-81
2975
20
4TH HIGHEST:
1 SELECT * FROM EMP
2 WHERE SAL = (SELECT MAX(SAL) FROM EMP
3 WHERE SAL < SOME (SELECT SAL FROM EMP
4 WHERE SAL < SOME (SELECT SAL FROM EMP
5 WHERE SAL < SOME (SELECT SAL FROM EMP
6* ))))
7 /
EMPNO ENAME

JOB

I Soft Solutions ,Bang-54.

MGR HIREDATE

SAL

COMM

DEPTNO

STRUCTURED QUERY LANGUAGE

ORACLE

117

---------- ---------- --------- ---------- --------- ---------- ---------- ---------7698 BLAKE


MANAGER
7839 01-MAY-81
2850

30

5TH HIGHEST:
1 SELECT * FROM EMP
2 WHERE SAL = (SELECT MAX(SAL) FROM EMP
3 WHERE SAL < SOME (SELECT SAL FROM EMP
4 WHERE SAL < SOME (SELECT SAL FROM EMP
5 WHERE SAL < SOME (SELECT SAL FROM EMP
6 WHERE SAL < SOME (SELECT SAL FROM EMP
7* )))))
8 /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7782 CLARK
MANAGER
7839 09-JUN-81
2450
10
>ANY OR > SOME OPERATOR:
SELECT * FROM EMP
WHERE SAL > ANY (SELECT SAL FROM EMP) ;
> ANY MEANS MORE THAN THE MINIMUM.HERE MIN SALARY IS 800. EXCEPT THAT
EVERY SAL DISPALYED
1 SELECT * FROM EMP
2* WHERE SAL > ANY (SELECT SAL FROM EMP)
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
7521 WARD
SALESMAN
7698 22-FEB-81
1250
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT ANALYST
7566 19-APR-87
3000
7839 KING
PRESIDENT
17-NOV-81
7844 TURNER SALESMAN
7698 08-SEP-81
7876 ADAMS
CLERK
7788 23-MAY-87
1100
7900 JAMES
CLERK
7698 03-DEC-81
950
7902 FORD
ANALYST
7566 03-DEC-81
3000
7934 MILLER CLERK
7782 23-JAN-82
1300

COMM
300
500
1400

5000
1500

DEPTNO
30
30
20
30
30
10
20
0
20
30
20
10

10
30

13 rows selected.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

118

1 SELECT * FROM EMP


2* WHERE SAL > SOME (SELECT SAL FROM EMP)
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
7521 WARD
SALESMAN
7698 22-FEB-81
1250
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT ANALYST
7566 19-APR-87
3000
7839 KING
PRESIDENT
17-NOV-81
7844 TURNER SALESMAN
7698 08-SEP-81
7876 ADAMS
CLERK
7788 23-MAY-87
1100
7900 JAMES
CLERK
7698 03-DEC-81
950
7902 FORD
ANALYST
7566 03-DEC-81
3000
7934 MILLER CLERK
7782 23-JAN-82
1300

COMM
300
500
1400

5000
1500

DEPTNO
30
30
20
30
30
10
20
0
20
30
20
10

10
30

13 rows selected.
2ND LEAST:
1 SELECT * FROM EMP
2 WHERE SAL = (SELECT MIN(SAL) FROM EMP
3* WHERE SAL > ANY (SELECT SAL FROM EMP))
4 /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7900 JAMES
CLERK
7698 03-DEC-81
950
30

DEPTNO

1 SELECT * FROM EMP


2 WHERE SAL = (SELECT MIN(SAL) FROM EMP
3* WHERE SAL > SOME (SELECT SAL FROM EMP))
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7900 JAMES
CLERK
7698 03-DEC-81
950
30

DEPTNO

3RD LEAST:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

119

1 SELECT * FROM EMP


2 WHERE SAL = (SELECT MIN(SAL) FROM EMP
3 WHERE SAL > ANY (SELECT SAL FROM EMP
4 WHERE SAL > ANY (SELECT SAL FROM EMP
5* )))
6 /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7876 ADAMS
CLERK
7788 23-MAY-87
1100
20

DEPTNO

1 SELECT * FROM EMP


2 WHERE SAL = (SELECT MIN(SAL) FROM EMP
3 WHERE SAL > SOME (SELECT SAL FROM EMP
4 WHERE SAL > SOME (SELECT SAL FROM EMP
5* )))
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7876 ADAMS
CLERK
7788 23-MAY-87
1100
20

DEPTNO

4TH LEAST:

1 SELECT * FROM EMP


2 WHERE SAL = (SELECT MIN(SAL) FROM EMP
3 WHERE SAL > ANY (SELECT SAL FROM EMP
4 WHERE SAL > ANY (SELECT SAL FROM EMP
5 WHERE SAL > ANY (SELECT SAL FROM EMP
6* ))))
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
30
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
1400
30
1
2
3
4

SELECT * FROM EMP


WHERE SAL = (SELECT MIN(SAL) FROM EMP
WHERE SAL > SOME (SELECT SAL FROM EMP
WHERE SAL > SOME (SELECT SAL FROM EMP

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

120

5 WHERE SAL > SOME (SELECT SAL FROM EMP


6* ))))
7 /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
30
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
1400
30
AND SO ON.

<ALL OPERATOR:
< ALL MEANS LESS THAN MINIMUM.
SELECT * FROM EMP
WHERE SAL < ALL (SELECT SAL FROM EMP);
no rows selected
SQL> SELECT * FROM EMP
2 WHERE SAL < ALL (SELECT SAL FROM EMP);
no rows selected
SQL> SELECT * FROM EMP
2 WHERE SAL < ALL (SELECT MAX(SAL) FROM EMP);
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
20
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
300
30
7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
30
7566 JONES
MANAGER
7839 02-APR-81
2975
20
7654 MARTIN
SALESMAN
7698 28-SEP-81
1250
1400
30
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
30
7782 CLARK
MANAGER
7839 09-JUN-81
2450
10
7788 SCOTT
ANALYST
7566 19-APR-87
3000
20
7844 TURNER
SALESMAN
7698 08-SEP-81
1500
0
30
7876 ADAMS
CLERK
7788 23-MAY-87
1100
20
7900 JAMES
CLERK
7698 03-DEC-81
950
30
7902 FORD
ANALYST
7566 03-DEC-81
3000
20
7934 MILLER
CLERK
7782 23-JAN-82
1300
10
13 rows selected.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

121

2ND HIGHEST:
1 SELECT * FROM EMP
2 WHERE SAL = (SELECT MAX(SAL) FROM EMP
3* WHERE SAL < ALL (SELECT MAX(SAL) FROM EMP))
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7788 SCOTT ANALYST
7566 19-APR-87
3000
20
7902 FORD
ANALYST
7566 03-DEC-81
3000
20

DEPTNO

3RD HIGHEST:
1 SELECT * FROM EMP
2 WHERE SAL = (SELECT MAX(SAL) FROM EMP
3 WHERE SAL < ALL (SELECT MAX(SAL) FROM EMP
4 WHERE SAL < ALL (SELECT MAX(SAL) FROM EMP
5* )))
6 /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7566 JONES
MANAGER
7839 02-APR-81
2975
20
4TH HIGHEST:
1 SELECT * FROM EMP
2 WHERE SAL = (SELECT MAX(SAL) FROM EMP
3 WHERE SAL < ALL (SELECT MAX(SAL) FROM EMP
4 WHERE SAL < ALL (SELECT MAX(SAL) FROM EMP
5 WHERE SAL < ALL (SELECT MAX(SAL) FROM EMP
6* ))))
7 /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7698 BLAKE
MANAGER
7839 01-MAY-81
2850
30
AND SO ON

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

122

>ALL OPERATOR:

> ALL MEANS GREATER THAN MAXIMUM.


SELECT * FROM EMP
WHERE SAL > ALL (SELECT SAL FROM EMP);
no rows selected
SELECT * FROM EMP
WHERE SAL > ALL (SELECT MIN(SAL) FROM EMP);
HERE EXCEPT MIN SALARY ALL SALARIES DISPLAYS.
SQL> SELECT * FROM EMP
2 WHERE SAL > ALL (SELECT SAL FROM EMP);
no rows selected

1 SELECT * FROM EMP


2* WHERE SAL > ALL (SELECT MIN(SAL) FROM EMP)
3 /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
7521 WARD
SALESMAN
7698 22-FEB-81
1250
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT ANALYST
7566 19-APR-87
3000
7839 KING
PRESIDENT
17-NOV-81
7844 TURNER SALESMAN
7698 08-SEP-81
7876 ADAMS
CLERK
7788 23-MAY-87
1100
7900 JAMES
CLERK
7698 03-DEC-81
950
7902 FORD
ANALYST
7566 03-DEC-81
3000
7934 MILLER CLERK
7782 23-JAN-82
1300

COMM

DEPTNO

300
500

30
30
20
30
30
10
20

1400

5000
1500

10
30

0
20
30
20
10

13 rows selected.

2ND LEAST:
1 SELECT * FROM EMP
2 WHERE SAL = (SELECT MIN(SAL) FROM EMP
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

123

3* WHERE SAL > ALL (SELECT MIN(SAL) FROM EMP))


SQL> /

EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7900 JAMES
CLERK
7698 03-DEC-81
950
30

DEPTNO

3RD LEAST:
1 SELECT * FROM EMP
2 WHERE SAL = (SELECT MIN(SAL) FROM EMP
3 WHERE SAL > ALL (SELECT MIN(SAL) FROM EMP
4 WHERE SAL > ALL (SELECT MIN(SAL) FROM EMP
5* )))
6 /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7876 ADAMS
CLERK
7788 23-MAY-87
1100
20

DEPTNO

4TH LEAST:
1 SELECT * FROM EMP
2 WHERE SAL = (SELECT MIN(SAL) FROM EMP
3 WHERE SAL > ALL (SELECT MIN(SAL) FROM EMP
4 WHERE SAL > ALL (SELECT MIN(SAL) FROM EMP
5 WHERE SAL > ALL (SELECT MIN(SAL) FROM EMP
6* ))))
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
30
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
1400
30
AND SO ON.
YOU CAN USE SUBQUERY IN FROM CLAUSE:
SELECT * FROM (SELECT * FORM SAL);
SELECT * FROM (SELECT * FORM SAL ORDER BY SAL DESC );
SQL> SELECT * FROM (SELECT * FROM EMP);
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

124

EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
20
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
300
30
7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
30
7566 JONES
MANAGER
7839 02-APR-81
2975
20
7654 MARTIN
SALESMAN
7698 28-SEP-81
1250
1400
30
7698 BLAKE
MANAGER
7839 01-MAY-81 2850
30
7782 CLARK
MANAGER
7839 09-JUN-81
2450
10
7788 SCOTT
ANALYST
7566 19-APR-87 3000
20
7839 KING
PRESIDENT
17-NOV-81
5000
10
7844 TURNER
SALESMAN
7698 08-SEP-81
1500
0
30
7876 ADAMS
CLERK
7788 23-MAY-87
1100
20
7900 JAMES
CLERK
7698 03-DEC-81
950
30
7902 FORD
ANALYST
7566 03-DEC-81
3000
20
7934 MILLER
CLERK
7782 23-JAN-82
1300
10
14 rows selected.
1* SELECT * FROM (SELECT * FROM EMP ORDER BY SAL DESC )
SQL> /
EMPNO ENAME
JOB
MGR
HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7839 KING
PRESIDENT
17-NOV-81
5000
7788 SCOTT ANALYST
7566
19-APR-87
3000
7902 FORD
ANALYST
7566
03-DEC-81
3000
7566 JONES
MANAGER
7839
02-APR-81
2975
7698 BLAKE
MANAGER
7839
01-MAY-81
2850
7782 CLARK
MANAGER
7839
09-JUN-81
2450
7499 ALLEN
SALESMAN
7698
20-FEB-81
1600
300
7844 TURNER SALESMAN 7698
08-SEP-81
1500
0
7934 MILLER CLERK
7782
23-JAN-82
1300
7521 WARD
SALESMAN
7698
22-FEB-81
1250
500
7654 MARTIN SALESMAN
7698
28-SEP-81
1250
1400
7876 ADAMS
CLERK
7788
23-MAY-87
1100
7900 JAMES
CLERK
7698
03-DEC-81
950
7369 SMITH
CLERK
7902
17-DEC-80
800

DEPTNO
10
20
20
20
30
10
30
30
10
30
30
20
30
20

14 rows selected.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

125

JOINS: ORACLE 9I:


CARTESIAN PRODUCT:
CATERSIAN PRODUCT WILL BE FORMED WHEN EVER WE OMIT THE JOIN CONDITION
OR IF YOU DONT WRITE JOIN CONDITIONWHEN WE ARE RETRIVING INFO FROM TWO
OR MORE TABLES.
HERE WE GET OUTPUT LIKE THIS ALL THE ROWS IN THE FIRST TABLE WILL BE
MULTIPLIED BY FIRST ROW IN THE SECOND TABLE,AND ONCE AGAIN ALL ROWS IN
THE FIRST TABLE WILL BE MULTIPLIED BY SECOND ROW AND SO ON.
WE GET FIRST TABLE NO OF ROWS MULTIPLIED BY SECOND TABLE NO OF ROWS AS
OUTPUT.
PRIOR TO ORACLE 9I:
SELECT ENAME,DNAME FROM EMP,DEPT;
ORACLE 9I:
SELECT ENAME,DNAME FROM EMP CROSS JOIN DEPT;
EQUI JOIN IN PRIOR TO ORACLE 9I:
WHEN EVER WE DO EQUI JOIN WE GET COMMON INFO WHICH IS THERE IN TWO
TABLES.
PRIOR TO ORACLE 9I:
SELECT EMPNO,ENAME,DEPT.DEPTNO,DNAME,LOC
FROM EMP,DEPT
WHERE EMP.DEPTNO=DEPT.DEPTNO;
EMPNO ENAME
DEPTNO
DNAME
---------- ---------- ---------- -------------- ------------7369 SMITH
20
RESEARCH
7499 ALLEN
30
SALES

I Soft Solutions ,Bang-54.

LOC
DALLAS
CHICAGO

STRUCTURED QUERY LANGUAGE

ORACLE
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER

126

30
20
30
30
10
20
10
30
20
30
20
10

SALES
CHICAGO
RESEARCH
DALLAS
SALES
CHICAGO
SALES
CHICAGO
ACCOUNTING
NEW YORK
RESEARCH
DALLAS
ACCOUNTING
NEW YORK
SALES
CHICAGO
RESEARCH
DALLAS
SALES
CHICAGO
RESEARCH
DALLAS
ACCOUNTING
NEW YORK

14 rows selected.
ORACLE 9I:
NATURAL JOIN:
THIS IS ALSO EQUI JOIN HERE NO NEED GIVE JOIN CONDITION.
SQL> SELECT EMPNO,ENAME,DEPTNO,DNAME
2 FROM EMP NATURAL JOIN DEPT;
EMPNO ENAME
DEPTNO
---------- ---------- ---------- -------------7369 SMITH
20
7499 ALLEN
30
7521 WARD
30
7566 JONES
20
7654 MARTIN
30
7698 BLAKE
30
7782 CLARK
10
7788 SCOTT
20
7839 KING
10
7844 TURNER
30
7876 ADAMS
20
7900 JAMES
30
7902 FORD
20
7934 MILLER
10

DNAME
RESEARCH
SALES
SALES
RESEARCH
SALES
SALES
ACCOUNTING
RESEARCH
ACCOUNTING
SALES
RESEARCH
SALES
RESEARCH
ACCOUNTING

INNER JOIN IN ORACLE 9I


SELECT EMPNO,ENAME,EMP.DEPTNO,DNAME,LOC
FROM EMP INNER JOIN DEPT
ON EMP.DEPTNO=DEPT.DEPTNO ;
EMPNO ENAME

DEPTNO

I Soft Solutions ,Bang-54.

DNAME

LOC

STRUCTURED QUERY LANGUAGE

ORACLE

127

---------- ---------- ---------- -------------- ------------7369 SMITH


20
RESEARCH
DALLAS
7499 ALLEN
30
SALES
CHICAGO
7521 WARD
30
SALES
CHICAGO
7566 JONES
20
RESEARCH
DALLAS
7654 MARTIN
30
SALES
CHICAGO
7698 BLAKE
30
SALES
CHICAGO
7782 CLARK
10
ACCOUNTING
NEW YORK
7788 SCOTT
20
RESEARCH
DALLAS
7839 KING
10
ACCOUNTING
NEW YORK
7844 TURNER
30
SALES
CHICAGO
7876 ADAMS
20
RESEARCH
DALLAS
7900 JAMES
30
SALES
CHICAGO
7902 FORD
20
RESEARCH
DALLAS
7934 MILLER
10
ACCOUNTING
NEW YORK
14 rows selected.

JOIN-USING:
SQL> SELECT E.EMPNO,E.ENAME,D.LOC FROM
2 EMP E JOIN DEPT D
3 USING(DEPTNO);
EMPNO ENAME
LOC
---------- ---------- ------------7369 SMITH
DALLAS
7499 ALLEN
CHICAGO
7521 WARD
CHICAGO
7566 JONES
DALLAS
7654 MARTIN
CHICAGO
7698 BLAKE
CHICAGO
7782 CLARK
NEW YORK
7788 SCOTT
DALLAS
7839 KING
NEW YORK
7844 TURNER CHICAGO
7876 ADAMS
DALLAS
7900 JAMES
CHICAGO
7902 FORD
DALLAS
7934 MILLER
NEW YORK
WITHOUT ALIASING:
1 SELECT EMPNO,ENAME,LOC FROM
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

128

2 EMP JOIN DEPT


3* USING(DEPTNO)
4 /
EMPNO ENAME
LOC
---------- ---------- ------------7369 SMITH
DALLAS
7499 ALLEN
CHICAGO
7521 WARD
CHICAGO
7566 JONES
DALLAS
7654 MARTIN
CHICAGO
7698 BLAKE
CHICAGO
7782 CLARK
NEW YORK
7788 SCOTT
DALLAS
7839 KING
NEW YORK
7844 TURNER CHICAGO
7876 ADAMS
DALLAS
7900 JAMES
CHICAGO
7902 FORD
DALLAS
7934 MILLER
NEW YORK

1 SELECT EMPNO,ENAME,DEPTNO,DNAME,LOC FROM


2 EMP JOIN DEPT
3* USING(DEPTNO)
SQL> /
EMPNO ENAME
DEPTNO DNAME
---------- ---------- ---------- -------------- ------------7369 SMITH
20
RESEARCH
7499 ALLEN
30
SALES
7521 WARD
30
SALES
7566 JONES
20
RESEARCH
7654 MARTIN
30
SALES
7698 BLAKE
30
SALES
7782 CLARK
10
ACCOUNTING
7788 SCOTT
20
RESEARCH
7839 KING
10
ACCOUNTING
7844 TURNER
30
SALES
7876 ADAMS
20
RESEARCH
7900 JAMES
30
SALES
7902 FORD
20
RESEARCH
7934 MILLER
10
ACCOUNTING

I Soft Solutions ,Bang-54.

LOC
DALLAS
CHICAGO
CHICAGO
DALLAS
CHICAGO
CHICAGO
NEW YORK
DALLAS
NEW YORK
CHICAGO
DALLAS
CHICAGO
DALLAS
NEW YORK

STRUCTURED QUERY LANGUAGE

ORACLE

129

JOIN ON:

SELECT EMPNO,ENAME,EMP.DEPTNO,DNAME,LOC
FROM EMP JOIN DEPT
ON EMP.DEPTNO=DEPT.DEPTNO
SQL> /
EMPNO ENAME
DEPTNO DNAME
LOC
---------- ---------- ---------- -------------- ------------7369 SMITH
20 RESEARCH
DALLAS
7499 ALLEN
30 SALES
CHICAGO
7521 WARD
30 SALES
CHICAGO
7566 JONES
20 RESEARCH
DALLAS
7654 MARTIN
30 SALES
CHICAGO
7698 BLAKE
30 SALES
CHICAGO
7782 CLARK
10 ACCOUNTING
NEW YORK
7788 SCOTT
20 RESEARCH
DALLAS
7839 KING
10 ACCOUNTING
NEW YORK
7844 TURNER
30 SALES
CHICAGO
7876 ADAMS
20 RESEARCH
DALLAS
7900 JAMES
30 SALES
CHICAGO
7902 FORD
20 RESEARCH
DALLAS
7934 MILLER
10 ACCOUNTING
NEW YORK

RIGHT OUTER JOIN: IN ORACLE 9I


IN RIGHT OUTER JOIN WE GET THE EXTRA INFORMATION IN DEPT.
THAT IS DEPTNO=40.BECAUSE NO BODY WORKING IN DEPTNO 40.
WHEN EVER WE DO EQUI JOIN WE GET COMMON INFO WHICH
IS THERE IN TWO TABLES.
SELECT EMPNO,ENAME,EMP.DEPTNO,DNAME,LOC
FROM EMP RIGHT OUTER JOIN DEPT
ON EMP.DEPTNO=DEPT.DEPTNO;
EMPNO ENAME
DEPTNO
DNAME
---------- ---------- ---------- -------------- ------------7369 SMITH
20
RESEARCH
7499 ALLEN
30
SALES

I Soft Solutions ,Bang-54.

LOC
DALLAS
CHICAGO

STRUCTURED QUERY LANGUAGE

ORACLE
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER

130

30
20
30
30
10
20
10
30
20
30
20
10

SALES
CHICAGO
RESEARCH
DALLAS
SALES
CHICAGO
SALES
CHICAGO
ACCOUNTING
NEW YORK
RESEARCH
DALLAS
ACCOUNTING
NEW YORK
SALES
CHICAGO
RESEARCH
DALLAS
SALES
CHICAGO
RESEARCH
DALLAS
ACCOUNTING
NEW YORK
OPERATIONS
BOSTON

15 rows selected.

SELECT EMPNO,ENAME,DEPT.DEPTNO,DNAME,LOC
FROM EMP RIGHT OUTER JOIN DEPT
ON EMP.DEPTNO=DEPT.DEPTNO;
EMPNO ENAME
DEPTNO
DNAME
LOC
---------- ---------- ---------- -------------- ------------7369 SMITH
20
RESEARCH
DALLAS
7499 ALLEN
30
SALES
CHICAGO
7521 WARD
30
SALES
CHICAGO
7566 JONES
20
RESEARCH
DALLAS
7654 MARTIN
30
SALES
CHICAGO
7698 BLAKE
30
SALES
CHICAGO
7782 CLARK
10
ACCOUNTING
NEW YORK
7788 SCOTT
20
RESEARCH
DALLAS
7839 KING
10
ACCOUNTING
NEW YORK
7844 TURNER
30
SALES
CHICAGO
7876 ADAMS
20
RESEARCH
DALLAS
7900 JAMES
30
SALES
CHICAGO
7902 FORD
20
RESEARCH
DALLAS
7934 MILLER
10
ACCOUNTING
NEW YORK
40
OPERATIONS
BOSTON
15 rows selected.
RIGHT OUTER JOIN IN PRIOR TO ORACLE 9I
SELECT EMPNO,ENAME,EMP2.DEPTNO,DNAME,LOC
FROM EMP2,DEPT
WHERE EMP2.DEPTNO(+)=DEPT.DEPTNO;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

131

EMPNO ENAME
DEPTNO
DNAME
LOC
---------- ---------- ---------- -------------- ------------7369 SMITH
20
RESEARCH
DALLAS
7499 ALLEN
30
SALES
CHICAGO
7521 WARD
30
SALES
CHICAGO
7566 JONES
20
RESEARCH
DALLAS
7654 MARTIN
30
SALES
CHICAGO
7698 BLAKE
30
SALES
CHICAGO
7782 CLARK
10
ACCOUNTING
NEW YORK
7788 SCOTT
20
RESEARCH
DALLAS
7839 KING
10
ACCOUNTING
NEW YORK
7844 TURNER
30
SALES
CHICAGO
7876 ADAMS
20
RESEARCH
DALLAS
7900 JAMES
30
SALES
CHICAGO
7902 FORD
20
RESEARCH
DALLAS
7934 MILLER
10
ACCOUNTING
NEW YORK
OPERATIONS

BOSTON

15 rows selected.
1 SELECT EMPNO,ENAME,DEPT.DEPTNO,DNAME,LOC
2 FROM EMP2,DEPT
3* WHERE EMP2.DEPTNO(+)=DEPT.DEPTNO;
EMPNO ENAME
DEPTNO
DNAME
LOC
---------- ---------- ---------- -------------- ------------7369 SMITH
20
RESEARCH
DALLAS
7499 ALLEN
30
SALES
CHICAGO
7521 WARD
30
SALES
CHICAGO
7566 JONES
20
RESEARCH
DALLAS
7654 MARTIN
30
SALES
CHICAGO
7698 BLAKE
30
SALES
CHICAGO
7782 CLARK
10
ACCOUNTING
NEW YORK
7788 SCOTT
20
RESEARCH
DALLAS
7839 KING
10
ACCOUNTING
NEW YORK
7844 TURNER
30
SALES
CHICAGO
7876 ADAMS
20
RESEARCH
DALLAS
7900 JAMES
30
SALES
CHICAGO
7902 FORD
20
RESEARCH
DALLAS
7934 MILLER
10
ACCOUNTING
NEW YORK

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
40

132

OPERATIONS

BOSTON

15 rows selected.
LEFT OUTER JOIN: IN ORACLE 9I
IN THE ABOVE QUERY NO EXTRA ROWS WERE SELECTED BECAUSE THERE NO BODY
WHO IS WORKING OTHER THAN DEPTNOS WHICH ARE THERE IN DEPT TABLE.
THAT IS BECAUSE OF FOREIGN KEY.
SELECT EMPNO,ENAME,DEPT.DEPTNO,DNAME,LOC
FROM EMP LEFT OUTER JOIN DEPT
ON EMP.DEPTNO=DEPT.DEPTNO;
EMPNO ENAME
DEPTNO
DNAME
LOC
---------- ---------- ---------- -------------- ------------7369 SMITH
20
RESEARCH
DALLAS
7499 ALLEN
30
SALES
CHICAGO
7521 WARD
30
SALES
CHICAGO
7566 JONES
20
RESEARCH
DALLAS
7654 MARTIN
30
SALES
CHICAGO
7698 BLAKE
30
SALES
CHICAGO
7782 CLARK
10
ACCOUNTING
NEW YORK
7788 SCOTT
20
RESEARCH
DALLAS
7839 KING
10
ACCOUNTING
NEW YORK
7844 TURNER
30
SALES
CHICAGO
7876 ADAMS
20
RESEARCH
DALLAS
7900 JAMES
30
SALES
CHICAGO
7902 FORD
20
RESEARCH
DALLAS
7934 MILLER
10
ACCOUNTING
NEW YORK
14 rows selected.

HERE WE CREATE EMP2 TABLE AND INSERT 50,60,70 VALUES IN TO THE TABLE.
SQL> CREATE TABLE EMP2
2 AS
3 SELECT * FROM EMP;
Table created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

133

SQL> SELECT * FROM EMP2;


EMPNO ENAMEJOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
7499 ALLEN
SALESMAN 7698 20-FEB-81
1600
300
7521 WARD
SALESMAN 7698 22-FEB-81
1250
500
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN SALESMAN 7698 28-SEP-81
1250
1400
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT ANALYST
7566 19-APR-87
3000
7839 KING
PRESIDENT
17-NOV-81
5000
7844 TURNER SALESMAN 7698 08-SEP-81
1500
0
7876 ADAMS
CLERK
7788 23-MAY-87
1100
7900 JAMES
CLERK
7698 03-DEC-81
950
7902 FORD
ANALYST
7566 03-DEC-81
3000
7934 MILLER
CLERK
7782 23-JAN-82
1300

DEPTNO
20
30
30
20
30
30
10
20
10
30
20
30
20
10

14 rows selected.
SQL> INSERT INTO EMP2
2 VALUES
3 (1,'PAVAN','MANAGER',123,'01-DEC-05',1000,100,50);
1 row created.
1 INSERT INTO EMP2
2 VALUES
3* (2,'KUMAR','MANAGER',123,'01-DEC-05',1000,100,60);
1 row created.
1 INSERT INTO EMP2
2 VALUES
3* (3,'GAYATRI','MANAGER',123,'01-DEC-05',1000,100,70);
1 row created.

SELECT EMPNO,ENAME,EMP2.DEPTNO,DNAME,LOC
FROM EMP2 LEFT OUTER JOIN DEPT
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

134

ON EMP2.DEPTNO=DEPT.DEPTNO;
EMPNO ENAME
DEPTNO
DNAME
LOC
---------- ---------- ---------- -------------- ------------7369 SMITH
20
RESEARCH
DALLAS
7499 ALLEN
30
SALES
CHICAGO
7521 WARD
30
SALES
CHICAGO
7566 JONES
20
RESEARCH
DALLAS
7654 MARTIN
30
SALES
CHICAGO
7698 BLAKE
30
SALES
CHICAGO
7782 CLARK
10
ACCOUNTING
NEW YORK
7788 SCOTT
20
RESEARCH
DALLAS
7839 KING
10
ACCOUNTING
NEW YORK
7844 TURNER
30
SALES
CHICAGO
7876 ADAMS
20
RESEARCH
DALLAS
7900 JAMES
30
SALES
CHICAGO
7902 FORD
20
RESEARCH
DALLAS
7934 MILLER
10
ACCOUNTING
NEW YORK
1 PAVAN
50
2 KUMAR
60
3 GAYATRI
70
LEFT OUTER JOIN IN PRIOR TO ORACLE 9I

1 SELECT EMPNO,ENAME,EMP2.DEPTNO,DNAME,LOC
2 FROM EMP2,DEPT
3* WHERE EMP2.DEPTNO=DEPT.DEPTNO(+)
EMPNO ENAME
DEPTNO
DNAME
LOC
---------- ---------- ---------- -------------- ------------7369 SMITH
20
RESEARCH
DALLAS
7499 ALLEN
30
SALES
CHICAGO
7521 WARD
30
SALES
CHICAGO
7566 JONES
20
RESEARCH
DALLAS
7654 MARTIN
30
SALES
CHICAGO
7698 BLAKE
30
SALES
CHICAGO
7782 CLARK
10
ACCOUNTING
NEW YORK
7788 SCOTT
20
RESEARCH
DALLAS
7839 KING
10
ACCOUNTING
NEW YORK
7844 TURNER
30
SALES
CHICAGO
7876 ADAMS
20
RESEARCH
DALLAS
7900 JAMES
30
SALES
CHICAGO
7902 FORD
20
RESEARCH
DALLAS
7934 MILLER
10
ACCOUNTING
NEW YORK

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
1 PAVAN
2 KUMAR
3 GAYATRI

135

50
60
70

17 rows selected.

FULL OUTER JOIN: IN ORACLE 9I


SELECT EMPNO,ENAME,EMP2.DEPTNO,DNAME,LOC
FROM EMP2 FULL OUTER JOIN DEPT
ON EMP2.DEPTNO=DEPT.DEPTNO;
EMPNO ENAME
DEPTNO
DNAME
LOC
---------- ---------- ---------- -------------- ------------7369 SMITH
20
RESEARCH
DALLAS
7499 ALLEN
30
SALES
CHICAGO
7521 WARD
30
SALES
CHICAGO
7566 JONES
20
RESEARCH
DALLAS
7654 MARTIN
30
SALES
CHICAGO
7698 BLAKE
30
SALES
CHICAGO
7782 CLARK
10
ACCOUNTING
NEW YORK
7788 SCOTT
20
RESEARCH
DALLAS
7839 KING
10
ACCOUNTING
NEW YORK
7844 TURNER
30
SALES
CHICAGO
7876 ADAMS
20
RESEARCH
DALLAS
7900 JAMES
30
SALES
CHICAGO
7902 FORD
20
RESEARCH
DALLAS
7934 MILLER
10
ACCOUNTING
NEW YORK
1 PAVAN
50
2 KUMAR
60
3 GAYATRI
70
OPERATIONS

BOSTON

18 rows selected.
SELECT EMPNO,ENAME,EMP2.DEPTNO,DEPT.DEPTNO,DNAME,LOC
FROM EMP2 FULL OUTER JOIN DEPT
ON EMP2.DEPTNO=DEPT.DEPTNO
EMPNO ENAME
DEPTNO DEPTNO DNAME
LOC
---------- ---------- ---------- ---------- -------------- ------------7934 MILLER
10
10 ACCOUNTING NEW YORK

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
7839 KING
7782 CLARK
7902 FORD
7876 ADAMS
7788 SCOTT
7566 JONES
7369 SMITH
7900 JAMES
7844 TURNER
7698 BLAKE
7654 MARTIN
7521 WARD
7499 ALLEN
1 PAVAN
2 KUMAR
3 GAYATRI

10
10
20
20
20
20
20
30
30
30
30
30
30
50
60
70

136

10 ACCOUNTING
10 ACCOUNTING
20 RESEARCH
20 RESEARCH
20 RESEARCH
20 RESEARCH
20 RESEARCH
30 SALES
30 SALES
30 SALES
30 SALES
30 SALES
30 SALES

NEW YORK
NEW YORK
DALLAS
DALLAS
DALLAS
DALLAS
DALLAS
CHICAGO
CHICAGO
CHICAGO
CHICAGO
CHICAGO
CHICAGO

40 OPERATIONS

BOSTON

18 rows selected.
FULL OUTER JOIN IN PRIOR TO ORACLE 9I

SQL> SELECT EMPNO,ENAME,DEPT.DEPTNO,DNAME,LOC


2 FROM EMP2,DEPT
3 WHERE EMP2.DEPTNO(+)=DEPT.DEPTNO
4 UNION
5 SELECT EMPNO,ENAME,EMP2.DEPTNO,DNAME,LOC
6 FROM EMP2,DEPT
7 WHERE EMP2.DEPTNO=DEPT.DEPTNO(+);
EMPNO ENAME
DEPTNO DNAME
---------- ---------- ---------- -------------- ------------1 PAVAN
50
2 KUMAR
60
3 GAYATRI
70
7369 SMITH
20 RESEARCH
7499 ALLEN
30 SALES
7521 WARD
30 SALES
7566 JONES
20 RESEARCH
7654 MARTIN
30 SALES
7698 BLAKE
30 SALES
I Soft Solutions ,Bang-54.

LOC

DALLAS
CHICAGO
CHICAGO
DALLAS
CHICAGO
CHICAGO
STRUCTURED QUERY LANGUAGE

ORACLE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER

137

10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
10 ACCOUNTING
NEW YORK
30 SALES
CHICAGO
20 RESEARCH
DALLAS
30 SALES
CHICAGO
20 RESEARCH
DALLAS
10 ACCOUNTING
NEW YORK
40 OPERATIONS

BOSTON

18 rows selected.

1 SELECT EMPNO,ENAME,DEPT.DEPTNO D_DEPTNO,EMP2.DEPTNO E_DEPTNO,


DNAME,LOC
2 FROM EMP2,DEPT
3 WHERE EMP2.DEPTNO(+)=DEPT.DEPTNO
4 UNION
5 SELECT EMPNO,ENAME,DEPT.DEPTNO D_DEPTNO, EMP2.DEPTNO
E_DEPTNO,DNAME,LOC
6 FROM EMP2,DEPT
7 WHERE EMP2.DEPTNO=DEPT.DEPTNO(+)
EMPNO ENAME
D_DEPTNO E_DEPTNO DNAME
LOC
---------- ---------- ---------- ---------- -------------- ------------1 PAVAN
50
2 KUMAR
60
3 GAYATRI
70
7369 SMITH
20
20 RESEARCH
DALLAS
7499 ALLEN
30
30 SALES
CHICAGO
7521 WARD
30
30 SALES
CHICAGO
7566 JONES
20
20 RESEARCH
DALLAS
7654 MARTIN
30
30 SALES
CHICAGO
7698 BLAKE
30
30 SALES
CHICAGO
7782 CLARK
10
10 ACCOUNTING
NEW YORK
7788 SCOTT
20
20 RESEARCH
DALLAS
7839 KING
10
10 ACCOUNTING
NEW YORK
7844 TURNER
30
30 SALES
CHICAGO
7876 ADAMS
20
20 RESEARCH
DALLAS
7900 JAMES
30
30 SALES
CHICAGO
7902 FORD
20
20 RESEARCH
DALLAS

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
7934 MILLER

10

138

10 ACCOUNTING

40

NEW YORK

OPERATIONS

BOSTON

18 rows selected.

SELF JOIN:
1 SELECT W.EMPNO,W.ENAME,M.EMPNO,M.ENAME FROM
2 EMP W, EMP M
3* WHERE W.MGR=M.EMPNO
SQL> /
EMPNO ENAME
EMPNO ENAME
---------- ---------- ---------- ---------7369 SMITH
7902 FORD
7499 ALLEN
7698 BLAKE
7521 WARD
7698 BLAKE
7566 JONES
7839 KING
7654 MARTIN
7698 BLAKE
7698 BLAKE
7839 KING
7782 CLARK
7839 KING
7788 SCOTT
7566 JONES
7844 TURNER
7698 BLAKE
7876 ADAMS
7788 SCOTT
7900 JAMES
7698 BLAKE
7902 FORD
7566 JONES
7934 MILLER
7782 CLARK
JOIN -ON
1 SELECT W.EMPNO,W.ENAME,M.EMPNO,M.ENAME FROM
2 EMP W JOIN EMP M
3* ON W.MGR=M.EMPNO
4 /
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

139

EMPNO ENAME
EMPNO ENAME
---------- ---------- ---------- ---------7369 SMITH
7902 FORD
7499 ALLEN
7698 BLAKE
7521 WARD
7698 BLAKE
7566 JONES
7839 KING
7654 MARTIN
7698 BLAKE
7698 BLAKE
7839 KING
7782 CLARK
7839 KING
7788 SCOTT
7566 JONES
7844 TURNER
7698 BLAKE
7876 ADAMS
7788 SCOTT
7900 JAMES
7698 BLAKE
7902 FORD
7566 JONES
7934 MILLER
7782 CLARK

SEQUENCES:

DEFINE A SEQUENCE TO GENERATE SEQUENTIAL NUMBERS AUTOMATICALLY.


WHAT IS A SEQUENCE?
A SEQUENCE:

AUTOMATICALLY GENERATES UNIQUE NUMBERS.


IS A SHARABLE OBJECT.(MULTIPLE USERS CAN SHARE SEQUENCE BECAUSE
SEQUENCE NUMBERS ARE STORED AND GENERATED INDEPENDENTLY OF
TABLES.)
IT IS TYPICALLY USED TO CREATE A PRIMARY KEY VALUE.
REPLACES APPLICATION CODE.(THIS IS TIME SAVING OBJECT BECAUSE IT CAN
REDUCE THE AMOUNT OF APPLICATION CODE NEEDED TO WRITE A
SEQUENCE-GENERATING ROUTINE).

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

140

SPEEDS UP THE EFFICIENCY OF ACCESSING SEQUENCE VALUES WHEN


CACHED IN MEMORY.

CREATE SEQUENCE SEQUENCE_NAME


[INCREMENT BY N]
[START WITH N]
[{MAXVALUE N | NOMAXVALUE}]
[{MINVALUE N | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE N | NOCACHE}];

IN SYNTAX:
SEQUENCE_NAME

SEQUENCE NAME

INCREMENT BY N
WHERE N IS AN

SPECIFIES THE INTERVAL BETWEEN SEQUENCE NUMBERS


INTEGER.(IF THIS CLAUSE IS OMMITED , THE SEQUENCE
INCREMENTS BY 1.)

STARTWITH N
GENERATED.

SPECIFIES THE FIRST SEQUENCE NUMBER TO BE


(IF THIS CLAUSE IS OMMITED , THE SEQUENCE STARTS
WITH 1.)

MAXVALUE N
GENERATE.

I Soft Solutions ,Bang-54.

SPECIFIES

MAXVALUE

THE

SEQUENCE

CAN

STRUCTURED QUERY LANGUAGE

ORACLE

141

NOMAXVALUE

SPECIFIES A MAXIMUM VALUE OF 10 ^ 27 FOR ASENDING


SEQUENCE AND -1 FOR DESENDING SEQUENCE.(THIS IS
DEFAULT OPTION)

MINVALUE N

SPECIFIES MINVALUE THE SEQUENCE CAN GENERATE.

NOMINVALUE

SPECIFIES A MAXIMUM VALUE OF 1 FOR AN ASCENDING


SEQUENCE AND -1 FOR DESCENDING SEQUENCE.(THIS IS
DEFAULT OPTION)

CYCLE | NOCYCLE

SPECIFIES WHETHER THE SEQUENCE CONTINUES TO


GENERATE VALUE AFTER REACHING ITS MAXIMUM OR
MINIMUM VALUE(NO CYCLE IS DEFAULT OPTION)
SPECIFIES HOW MANY VALUES THE ORACLE SERVER
PREALLOCATES AND KEEP IN MEMORY.(BY DEFAULT
ORACLE SERVER CACHES 20 VALUES)

CACHE N | NO CACHE

CREATION OF SEQUENCE:

SQL> CREATE SEQUENCE DEPT_DUP_SEQ


2 INCREMENT BY 10
3 START WITH 10
4 MAXVALUE 100
5 NOCACHE
6 NOCYCLE;
Sequence created.

SQL> SELECT * FROM USER_SEQUENCES;


SEQUENCE_NAME
MIN_VALUE MAX_VALUE INCREMENT_BY C O
CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- ----------DEPT_DUP_SEQ
1
100
10
NN
0
10
NEXTVAL AND CURRVAL PSEUDOCOLUMNS;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

142

1* SELECT DEPT_DUP_SEQ.CURRVAL FROM DUAL


SQL> /
SELECT DEPT_DUP_SEQ.CURRVAL FROM DUAL
*
ERROR at line 1:
ORA-08002: sequence DEPT_DUP_SEQ.CURRVAL is not yet defined in this session
INSERTING THE VALUES OF SEQUENCES IN TO THE TABLE:
SQL> INSERT INTO DEPT_DUP
2 VALUES
3 (DEPT_DUP_SEQ.NEXTVAL,'COM','NY');
1 row created.
1 INSERT INTO DEPT_DUP
2 VALUES
3* (DEPT_DUP_SEQ.NEXTVAL,'SALES','NY')
SQL> /
1 row created.
1 INSERT INTO DEPT_DUP
2 VALUES
3* (DEPT_DUP_SEQ.NEXTVAL,'OPR','NY')
SQL> /
1 row created.
SQL> SELECT * FROM DEPT_DUP;
DEPTNO DNAME
LOC
---------- -------------- ------------10 COM
NY
20 SALES
NY
30 OPR
NY
SQL> SELECT DEPT_DUP_SEQ.CURRVAL FROM DUAL;
CURRVAL
---------30
VIEWING SEQUENCES IN DATABASE:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

143

SQL> SELECT * FROM USER_SEQUENCES;


SEQUENCE_NAME
MIN_VALUE MAX_VALUE INCREMENT_BY C O
CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- ----------DEPT_DUP_SEQ
1
100
10
N N
0
40
HERE IN LAST_NUMBER COLUMN WE CAN SEE NEXT AVALIABLE NUMBER.
DON'T SEE NEXT AVALIABLE NUMBER BY SELECTING LIKE THIS
SELECT DEPT_DUP_SEQ.NEXTVAL FROM DUAL;
NEXTVAL
---------40
SQL> INSERT INTO DEPT_DUP
2 VALUES
3 (DEPT_DUP_SEQ.NEXTVAL,'AA','NY');
1 row created.
SQL> SELECT * FROM DEPT_DUP;
DEPTNO DNAME
LOC
---------- -------------- ------------10 COM
NY
20 SALES
NY
30 OPR
NY
50 AA
NY
HERE WE ARE SUPPOSED TO GET 40 BUT WE GOT 50. THAT MEANS WHEN WE SAW
NEXT AVALIABLE
NUMBER BY USING SEQUENCE_NAME.NEXTVAL. IT GENERATED THAT NUMBER.IT
CANNOT BE REVOKED BACK.IT IS ALWAYS ADVISED TO SEE NEXT AVALIABLE
NUMBER IN USER_SEQUENCES TABLES LAST_NUMBER COLUMN.
1* SELECT DEPT_DUP_SEQ.NEXTVAL FROM DUAL
SQL> /
NEXTVAL
---------60
SQL> /
NEXTVAL
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

144

---------70
SQL> /
NEXTVAL
---------80
SQL> /
NEXTVAL
---------90
SQL> /
NEXTVAL
---------100
SQL> /
SELECT DEPT_DUP_SEQ.NEXTVAL FROM DUAL
*
ERROR at line 1:
ORA-08004: sequence DEPT_DUP_SEQ.NEXTVAL exceeds MAXVALUE and cannot be
instantiated
HERE SEQUENCE REACHED MAXVALUE.IT CANNOT GENERATE NUMBER. WE CAN
ALTER SEQUENCE

ALTERING A SEQUENCE:
SQL> ALTER SEQUENCE DEPT_DUP_SEQ
2 MAXVALUE 150;
Sequence altered.
SQL> SELECT DEPT_DUP_SEQ.NEXTVAL FROM DUAL;
NEXTVAL
---------110
SQL> SELECT * FROM USER_SEQUENCES;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

145

SEQUENCE_NAME
MIN_VALUE MAX_VALUE INCREMENT_BY C O
CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- ----------DEPT_DUP_SEQ
1
150
10
NN
0
A120
WE CAN CHANGE INCREMENT VALUE,MAXVALUE,MINVALUE,CYCLE,CACHE OPTIONS
IN ALTER.
WE CANNOT CHNAGE START WITH OPTION IN ALTER.TO START SEQUENCE WITH NEW
NUMBER IT SHOULD BE DROPPED AND RECREATED.
SOME VALIDATION IS IMPOSED WHEN ALTER A SEQUENCE.
SQL> ALTER SEQUENCE DEPT_DUP_SEQ
2 MAXVALUE 100;
ALTER SEQUENCE DEPT_DUP_SEQ
*
ERROR at line 1:
ORA-04009: MAXVALUE cannot be made to be less than the current value
SQL> ALTER SEQUENCE DEPT_DUP_SEQ
2 CYCLE;
Sequence altered.
1* SELECT DEPT_DUP_SEQ.NEXTVAL FROM DUAL
SQL> /
NEXTVAL
---------120
SQL> SELECT * FROM USER_SEQUENCES;
SEQUENCE_NAME
MIN_VALUE MAX_VALUE INCREMENT_BY C O
CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- ----------DEPT_DUP_SEQ
1
150
10
Y N
0
130
SQL> SELECT DEPT_DUP_SEQ.NEXTVAL FROM DUAL;
NEXTVAL
---------130

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

146

SQL> /
NEXTVAL
---------140
SQL> /
NEXTVAL
---------150
SQL> /
NEXTVAL
---------1
SQL> /
NEXTVAL
---------11
HERE BECAUSE OF CYCLE OPTION WE GOT NUMBER FROM MINVALUE OF THE
SEQUENCE.
SQL> CREATE SEQUENCE DEPT_DUP_SEQ1
2 INCREMENT BY 1
3 START WITH 100
4 CACHE 30;
Sequence created.
SQL> SELECT * FROM USER_SEQUENCES;
SEQUENCE_NAME
MIN_VALUE MAX_VALUE INCREMENT_BY C O
CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- ----------DEPT_DUP_SEQ1
1
1.0000E+27
1
N N
30
100
1* SELECT DEPT_DUP_SEQ1.NEXTVAL FROM DUAL
2 /
NEXTVAL
---------100
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

147

SQL> SELECT * FROM USER_SEQUENCES;


SEQUENCE_NAME
MIN_VALUE MAX_VALUE INCREMENT_BY C O
CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- ----------DEPT_DUP_SEQ1
1
1.0000E+27
1
N N
30
130
HERE U CANNOT DEPEND ON LAST_NUMBER COLUMN FOR NEXT NUMBER.
DROPING SEQUENCES:
SQL> DROP SEQUENCE DEPT_DUP_SEQ1
Sequence dropped.
HERE CACHE MEANS ORACLE KEEPS 30 VALUES IN THE CACHE MEMORY.DEFAULT IS
20.CYCLE MEANS IF THE NUMBER GENERATES MAX NUMBER THEN ONCE AGAIN IT
START FROM MIN VALUE.
CREATING SEQUENCE WITHOUT ANY PARAMETERS:

SQL> CREATE SEQUENCE DEPT_DEPT2;


Sequence created.
ORACLE FUNCTIONS:
SQL> SELECT ABS(-20) FROM DUAL;
ABS(-20)
---------20
SQL> SELECT POWER(3,2) FROM DUAL;
POWER(3,2)
---------9
SQL> SELECT ROUND(15.19,1) FROM DUAL;
ROUND(15.19,1)
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

148

-------------15.2
SQL> SELECT SQRT(25) FROM DUAL;
SQRT(25)
---------5
1 SELECT EXTRACT(YEAR FROM DATE '2004-07-02') "YEAR",
2*
EXTRACT(MONTH FROM DATE '2004-07-02')"MONTH" FROM DUAL
SQL> /
YEAR
MONTH
---------- ---------2004
7
SQL> SELECT MOD(15,7) "MOD1",MOD(15.7,7) "MOD2" FROM DUAL;
MOD1
MOD2
---------- ---------1
1.7
SQL> SELECT FLOOR(24.8),FLOOR(13.15) FROM DUAL;
FLOOR(24.8) FLOOR(13.15)
----------- -----------24
13
SQL> SELECT CEIL(24.8),CEIL(13.15) FROM DUAL;
CEIL(24.8) CEIL(13.15)
---------- ----------25
14
SQL> SELECT TRANSLATE('1PAVAV523','123','7A9') FROM DUAL;
TRANSLATE
--------7PAVAV5A9
SQL> SELECT LENGTH('PAVAN') FROM DUAL;
LENGTH('PAVAN')
--------------5

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

149

SQL> SELECT LTRIM('NISHA','N') FROM DUAL;


LTRI
---ISHA
SQL> SELECT RTRIM('NISHA','A') FROM DUAL;
RTRI
---NISH
SQL> SELECT TRIM(' PAVAN ') FROM DUAL;
TRIM(
----PAVAN
SQL> SELECT TRIM(LEADING 'X' FROM 'XXXHANSELXXX') FROM DUAL;
TRIM(LEAD
--------HANSELXXX
SQL> SELECT TRIM(BOTH 'X' FROM 'XXXHANSELXXX') FROM DUAL;
TRIM(B
-----HANSEL
SQL> SELECT TRIM(BOTH '1' FROM '123HANSEL12111') FROM DUAL;
TRIM(BOTH'
---------23HANSEL12
SQL> SELECT LPAD('PAGE 1',10,'*') "LPAD" FROM DUAL;
LPAD
---------****PAGE 1
SQL> SELECT RPAD(ENAME,10,'X') "RPAD" FROM EMP WHERE ENAME = 'SMITH';
RPAD
---------SMITHXXXXX
SQL> SELECT ROUND(45.923,2),ROUND(45.923,0),ROUND(45.923,-1) FROM DUAL;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

150

ROUND(45.923,2) ROUND(45.923,0) ROUND(45.923,-1)


--------------- --------------- ---------------45.92
46
50
SQL> SELECT TRUNC(45.923,2),TRUNC(45.923,0),TRUNC(45.923,-1) FROM DUAL;
TRUNC(45.923,2) TRUNC(45.923,0) TRUNC(45.923,-1)
--------------- --------------- ---------------45.92
45
40
SQL> SELECT HIREDATE,ROUND(HIREDATE,'MONTH'),TRUNC(HIREDATE,'MONTH')
FROM EMP;
HIREDATE ROUND(HIR TRUNC(HIR
--------- --------- --------17-DEC-80 01-JAN-81 01-DEC-80
20-FEB-81 01-MAR-81 01-FEB-81
22-FEB-81 01-MAR-81 01-FEB-81
02-APR-81 01-APR-81 01-APR-81
28-SEP-81 01-OCT-81 01-SEP-81
01-MAY-81 01-MAY-81 01-MAY-81
09-JUN-81 01-JUN-81 01-JUN-81
19-APR-87 01-MAY-87 01-APR-87
17-NOV-81 01-DEC-81 01-NOV-81
08-SEP-81 01-SEP-81 01-SEP-81
23-MAY-87 01-JUN-87 01-MAY-87
03-DEC-81 01-DEC-81 01-DEC-81
03-DEC-81 01-DEC-81 01-DEC-81
23-JAN-82 01-FEB-82 01-JAN-82
14 rows selected.

SQL> SELECT HIREDATE,ROUND(HIREDATE,'YEAR'),TRUNC(HIREDATE,'YEAR') FROM


EMP;
HIREDATE ROUND(HIR TRUNC(HIR
--------- --------- --------17-DEC-80 01-JAN-81 01-JAN-80
20-FEB-81 01-JAN-81 01-JAN-81
22-FEB-81 01-JAN-81 01-JAN-81
02-APR-81 01-JAN-81 01-JAN-81
28-SEP-81 01-JAN-82 01-JAN-81
01-MAY-81 01-JAN-81 01-JAN-81
09-JUN-81 01-JAN-81 01-JAN-81
19-APR-87 01-JAN-87 01-JAN-87
17-NOV-81 01-JAN-82 01-JAN-81
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

151

08-SEP-81 01-JAN-82 01-JAN-81


23-MAY-87 01-JAN-87 01-JAN-87
03-DEC-81 01-JAN-82 01-JAN-81
03-DEC-81 01-JAN-82 01-JAN-81
23-JAN-82 01-JAN-82 01-JAN-82
14 rows selected.
TO_NUMBER:
CONVERTS CHARACTER VALUE EXPRESSING A NUMBER TO A NUMBER DATA TYPE.
SELECT TO_NUMBER(SUBSTR('$100',2,3)) FROM DUAL;
SQL> SELECT TO_NUMBER(SUBSTR('$100',2,3)) FROM DUAL;
TO_NUMBER(SUBSTR('$100',2,3))
----------------------------100
TO_CHAR:
CONVERTS A VALUE OF NUMBER DATATYPE TO A CHARACTER DATA
TYPE.
SQL> SELECT TO_CHAR(1234,'$9,999') FROM DUAL;
TO_CHAR
------$1,234
CONVERTS A DATE DATATYPE TO A CHARACTER DATA TYPE.

SQL> SELECT TO_CHAR(SYSDATE,'MONTH DD,YYYY') FROM DUAL;


TO_CHAR(SYSDATE,'
----------------JULY 28,2005
SQL> SELECT TO_CHAR(SYSDATE,'MONTH DAY,YYYY') FROM DUAL;
TO_CHAR(SYSDATE,'MONTHDA
-----------------------JULY THURSDAY ,2005

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

152

SQL> SELECT TO_CHAR(SYSDATE,'MONTH DAY YEAR') FROM DUAL;


TO_CHAR(SYSDATE,'MONTHDAYYEAR')
-------------------------------------------------------------JULY THURSDAY TWO THOUSAND FIVE
SQL> SELECT TO_CHAR(SYSDATE,'MM DD YY') FROM DUAL;
TO_CHAR(
-------07 28 05
SQL> SELECT TO_CHAR(SYSDATE,'DD MM YY') FROM DUAL;
TO_CHAR(
-------28 07 05
TO_DATE:
CONVERTS A CHARACTER DATATYPE TO A DATE DATA TYPE.
SQL> SELECT TO_DATE('06/07/02','DD/MM/YY') FROM DUAL;
TO_DATE('
--------06-JUL-02
SPECIAL DATE FORMATS USING TO_CHAR :
SQL> SELECT ENAME,TO_CHAR(HIREDATE,'DDTH-MON-YY') FROM EMP;
ENAME TO_CHAR(HIR
---------- ----------SMITH
17TH-DEC-80
ALLEN
20TH-FEB-81
WARD
22ND-FEB-81
JONES
02ND-APR-81
MARTIN
28TH-SEP-81
BLAKE
01ST-MAY-81
CLARK
09TH-JUN-81
SCOTT
19TH-APR-87
KING
17TH-NOV-81

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
TURNER
ADAMS
JAMES
FORD
MILLER

153

08TH-SEP-81
23RD-MAY-87
03RD-DEC-81
03RD-DEC-81
23RD-JAN-82

14 rows selected.
SQL> SELECT ENAME,TO_CHAR(HIREDATE,'DDSP-MON-YY') FROM EMP;
ENAME TO_CHAR(HIREDATE,'D
---------- ------------------SMITH
SEVENTEEN-DEC-80
ALLEN
TWENTY-FEB-81
WARD
TWENTY-TWO-FEB-81
JONES
TWO-APR-81
MARTIN
TWENTY-EIGHT-SEP-81
BLAKE
ONE-MAY-81
CLARK
NINE-JUN-81
SCOTT
NINETEEN-APR-87
KING
SEVENTEEN-NOV-81
TURNER
EIGHT-SEP-81
ADAMS
TWENTY-THREE-MAY-87
JAMES
THREE-DEC-81
FORD
THREE-DEC-81
MILLER
TWENTY-THREE-JAN-82
14 rows selected.

SQL> SELECT ENAME,TO_CHAR(HIREDATE,'DDSPTH-MON-YY') FROM EMP;


ENAME TO_CHAR(HIREDATE,'DDS
---------- --------------------SMITH
SEVENTEENTH-DEC-80
ALLEN
TWENTIETH-FEB-81
WARD
TWENTY-SECOND-FEB-81
JONES
SECOND-APR-81
MARTIN
TWENTY-EIGHTH-SEP-81
BLAKE
FIRST-MAY-81
CLARK
NINTH-JUN-81
SCOTT
NINETEENTH-APR-87
KING
SEVENTEENTH-NOV-81
TURNER
EIGHTH-SEP-81
ADAMS
TWENTY-THIRD-MAY-87
JAMES
THIRD-DEC-81
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
FORD
MILLER

154

THIRD-DEC-81
TWENTY-THIRD-JAN-82

14 rows selected.
TURNING NUMERICS TO ALPHABETS:
THERE ARE TIMES WHEN AMOUNTS IN AN APPLICATION HAVE TO BE REPRESENTED
BY ALPHABETICALLY.THIS CAN BE DONE BY JULIAN DATE CONVERSIONS.
SQL> SELECT TO_CHAR(TO_DATE(34654,'J'),'JSP') FROM DUAL;
TO_CHAR(TO_DATE(34654,'J'),'JSP')
------------------------------------------THIRTY-FOUR THOUSAND SIX HUNDRED FIFTY-FOUR
SQL> SELECT TO_CHAR(TO_DATE(34654,'J'),'JsP') FROM DUAL;
TO_CHAR(TO_DATE(34654,'J'),'JSP')
------------------------------------------Thirty-Four Thousand Six Hundred Fifty-Four
SQL> SELECT TO_CHAR(TO_DATE(34654,'J'),'jSP') FROM DUAL;
TO_CHAR(TO_DATE(34654,'J'),'JSP')
------------------------------------------thirty-four thousand six hundred fifty-four

ADDING LINE FEEDS TO SELECT STATEMENT OUTPUT:

SQL> SELECT 'EMPLOYEE NAME:' ||ENAME||CHR(10)


2 || 'JOB:'|| JOB || CHR(10) ||
3 'JOINING DATE:' || HIREDATE "EMPLOYEE DETAILS" FROM EMP;
EMPLOYEE DETAILS
------------------------------------------------------------EMPLOYEE NAME:SMITH
JOB:CLERK
JOINING DATE:17-DEC-80
EMPLOYEE NAME:ALLEN
JOB:SALESMAN
JOINING DATE:20-FEB-81

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

155

EMPLOYEE NAME:WARD
JOB:SALESMAN
JOINING DATE:22-FEB-81
EMPLOYEE NAME:JONES
JOB:MANAGER
JOINING DATE:02-APR-81
EMPLOYEE NAME:MARTIN
JOB:SALESMAN
JOINING DATE:28-SEP-81
EMPLOYEE NAME:BLAKE
JOB:MANAGER
JOINING DATE:01-MAY-81
EMPLOYEE NAME:CLARK
JOB:MANAGER
JOINING DATE:09-JUN-81
EMPLOYEE NAME:SCOTT
JOB:ANALYST
JOINING DATE:19-APR-87
EMPLOYEE NAME:KING
JOB:PRESIDENT
JOINING DATE:17-NOV-81
EMPLOYEE NAME:TURNER
EMPLOYEE DETAILS
------------------------------------------------------------JOB:SALESMAN
JOINING DATE:08-SEP-81
EMPLOYEE NAME:ADAMS
JOB:CLERK
JOINING DATE:23-MAY-87
EMPLOYEE NAME:JAMES
JOB:CLERK
JOINING DATE:03-DEC-81
EMPLOYEE NAME:FORD
JOB:ANALYST
JOINING DATE:03-DEC-81
EMPLOYEE NAME:MILLER
JOB:CLERK
JOINING DATE:23-JAN-82
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

156

14 rows selected.
GROUP BY:
SQL> SELECT DEPTNO,JOB,SUM(SAL)
2 FROM EMP
3 GROUP BY DEPTNO,JOB;
DEPTNO JOB
SUM(SAL)
---------- --------- ---------10 CLERK
1300
10 MANAGER
2450
10 PRESIDENT
5000
20 ANALYST
6000
20 CLERK
1900
20 MANAGER
2975
30 CLERK
950
30 MANAGER
2850
30 SALESMAN
5600
10 rows selected.

ROLL UP:
1 SELECT DEPTNO,JOB,SUM(SAL)
2 FROM EMP
3* GROUP BY ROLLUP(DEPTNO,JOB)
4 /
DEPTNO JOB
SUM(SAL)
---------- --------- ---------10 CLERK
1300
10 MANAGER
2450
10 PRESIDENT
5000
10
8750
20 ANALYST
6000
20 CLERK
1900
20 MANAGER
2975
20
10875
30 CLERK
950
30 MANAGER
2850
30 SALESMAN
5600

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
30

157

9400
29025

15 rows selected.

THE ABOVE QUERY IS COMBINATION OF :


GROUP BY DEPTNO,JOB.
GROUP BY DEPTNO.
GROUP BY ().

1 SELECT DEPTNO,JOB,SUM(SAL) FROM


2 EMP
3* GROUP BY DEPTNO,JOB
4 /
DEPTNO JOB
SUM(SAL)
---------- --------- ---------10 CLERK
1300
10 MANAGER
2450
10 PRESIDENT
5000
20 ANALYST
6000
20 CLERK
1900
20 MANAGER
2975
30 CLERK
950
30 MANAGER
2850
30 SALESMAN
5600
9 rows selected.

1 SELECT DEPTNO,SUM(SAL) FROM


2 EMP
3* GROUP BY (DEPTNO)
SQL> /
DEPTNO SUM(SAL)
---------- ---------10
8750

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
20
30

158

10875
9400

1 SELECT SUM(SAL) FROM


2 EMP
3* GROUP BY ()
4 /
SUM(SAL)
---------29025

CUBE:
CUBE RETURNS SAME AS ROLL UP + ALL INDIVIDUAL JOBS SUM SALARIES.
1 SELECT DEPTNO,JOB,SUM(SAL)
2 FROM EMP
3* GROUP BY CUBE(DEPTNO,JOB)
SQL> /
DEPTNO JOB
SUM(SAL)
---------- --------- ---------10 CLERK
1300
10 MANAGER
2450
10 PRESIDENT
5000
10
8750
20 ANALYST
6000
20 CLERK
1900
20 MANAGER
2975
20
10875
30 CLERK
950
30 MANAGER
2850
30 SALESMAN
5600
30
9400
ANALYST
6000
CLERK
4150
MANAGER
8275
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
PRESIDENT
SALESMAN

159

5000
5600

29025
21 rows selected.

THE ABOVE QUERY IS COMBINATION OF :


GROUP BY DEPTNO,JOB.
GROUP BY DEPTNO.
GROUP BY JOB.
GROUP BY ().

1 SELECT DEPTNO,JOB,SUM(SAL) FROM


2 EMP
3* GROUP BY DEPTNO,JOB
4 /
DEPTNO JOB
SUM(SAL)
---------- --------- ---------10 CLERK
1300
10 MANAGER
2450
10 PRESIDENT
5000
20 ANALYST
6000
20 CLERK
1900
20 MANAGER
2975
30 CLERK
950
30 MANAGER
2850
30 SALESMAN
5600
9 rows selected.

1 SELECT DEPTNO,SUM(SAL) FROM


2 EMP
3* GROUP BY (DEPTNO)
SQL> /
DEPTNO SUM(SAL)
---------- ---------I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
10
20
30

160

8750
10875
9400

1 SELECT SUM(SAL) FROM


2 EMP
3* GROUP BY ()
4 /
SUM(SAL)
---------29025
SQL> SELECT JOB,SUM(SAL) FROM EMP
2 GROUP BY JOB;
JOB
SUM(SAL)
--------- ---------ANALYST
6000
CLERK
4150
MANAGER
8275
PRESIDENT
5000
SALESMAN
5600

GROUPING FUNCTION:
1 SELECT DEPTNO,JOB,SUM(SAL),
2 GROUPING(DEPTNO) GR_DEPTNO,
3 GROUPING(JOB) GR_JOB
4 FROM EMP
5* GROUP BY ROLLUP(DEPTNO,JOB)
6 /
DEPTNO JOB
SUM(SAL) GR_DEPTNO
---------- --------- ---------- ---------- ---------10 CLERK
1300
0
10 MANAGER
2450
10 PRESIDENT
5000
10
8750
20 ANALYST
6000

I Soft Solutions ,Bang-54.

GR_JOB
0
0
0
0
0

0
0
1
0

STRUCTURED QUERY LANGUAGE

ORACLE
20 CLERK
20 MANAGER
20
30 CLERK
30 MANAGER
30 SALESMAN
30

1900

161

0
0
0
0
0
0
1
0
0
1

2975
10875
950

0
2850
5600
9400

29025

0
1

0
1
0
0
0
1

15 rows selected.
1 SELECT DEPTNO,JOB,SUM(SAL),
2 GROUPING(DEPTNO) GR_DEPTNO,
3 GROUPING(JOB) GR_JOB
4 FROM EMP
5* GROUP BY CUBE(DEPTNO,JOB)
SQL> /
DEPTNO JOB
SUM(SAL) GR_DEPTNO
---------- --------- ---------- ---------- ---------10 CLERK
1300
0
0
10 MANAGER
2450
0
10 PRESIDENT
5000
0
10
8750
0
20 ANALYST
6000
0
20 CLERK
1900
0
0
20 MANAGER
2975
0
20
10875
0
30 CLERK
950
0
0
30 MANAGER
2850
0
30 SALESMAN
5600
0
30
9400
0
ANALYST
6000
1
0
CLERK
4150
1
MANAGER
8275
1
PRESIDENT
5000
1
SALESMAN
5600
1
0
0
1
1
0
29025
1
1

GR_JOB
0
0
1
0
0
1
0
0
1
0
0
0
0
0

21 rows selected.

GROUPING SETS:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

162

1 SELECT DEPTNO,JOB,MGR MANAGER_NO,AVG(SAL)


2 FROM EMP
3 GROUP BY GROUPING SETS
4* ((DEPTNO,JOB),(JOB,MGR))
SQL> /
DEPTNO JOB
MANAGER_NO
---------- --------- ---------- ---------10 CLERK
10 MANAGER
10 PRESIDENT
20 ANALYST
3000
20 CLERK
950
20 MANAGER
30 CLERK
950
30 MANAGER
30 SALESMAN
ANALYST
CLERK
CLERK
CLERK
CLERK
MANAGER
PRESIDENT
SALESMAN

7566
7698
7782
7788
7902
7839
7698

AVG(SAL)
1300
2450
5000
2975
2850
1400

3000
950
1300
1100
800
2758.33333
5000
1400

19 rows selected.
1 SELECT DEPTNO,JOB,MGR MANAGER_NO,SUM(SAL)
2 FROM EMP
3 GROUP BY GROUPING SETS
4* ((DEPTNO,JOB),(JOB,MGR))
SQL> /
DEPTNO JOB
MANAGER_NO
---------- --------- ---------- ---------10 CLERK
10 MANAGER
10 PRESIDENT
20 ANALYST
6000
20 CLERK
20 MANAGER
30 CLERK
950
30 MANAGER
30 SALESMAN
I Soft Solutions ,Bang-54.

SUM(SAL)
1300
2450
5000
1900
2975
2850
5600
STRUCTURED QUERY LANGUAGE

ORACLE
ANALYST
CLERK
CLERK
CLERK
CLERK
MANAGER
PRESIDENT
SALESMAN

7566
7698
7782
7788
7902
7839

163

6000
950
1300
1100
800
8275
5000

7698

5600

17 rows selected.
THE ABOVE IS COMBINATION OF:
GROUP BY DEPT,JOB.
GROUP BY JOB,MGR.
1 SELECT DEPTNO,JOB,SUM(SAL)
2 FROM EMP
3* GROUP BY(DEPTNO,JOB)
SQL> /
DEPTNO JOB
SUM(SAL)
---------- --------- ---------10 CLERK
1300
10 MANAGER
2450
10 PRESIDENT
5000
20 ANALYST
6000
20 CLERK
1900
20 MANAGER
2975
30 CLERK
950
30 MANAGER
2850
30 SALESMAN
5600
9 rows selected.
1 SELECT JOB,MGR,SUM(SAL)
2 FROM EMP
3* GROUP BY(JOB,MGR)
SQL> /
JOB
MGR SUM(SAL)
--------- ---------- ---------ANALYST
7566
6000
CLERK
7698
950
CLERK
7782
1300
CLERK
7788
1100
CLERK
7902
800

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
MANAGER 7839
PRESIDENT
SALESMAN 7698

164

8275
5000
5600

8 rows selected.
COMPOSITE COLUMNS:
1 SELECT DEPTNO,JOB,MGR MANAGER_NO,SUM(SAL)
2 FROM EMP
3* GROUP BY ROLLUP(DEPTNO,(JOB,MGR))
SQL> /
DEPTNO JOB
MANAGER_NO
---------- --------- ---------- ---------10 CLERK
7782
1300
10 MANAGER 7839
10 PRESIDENT
10
20 ANALYST
7566
20 CLERK
7788
1100
20 CLERK
7902
20 MANAGER 7839
20
10875
30 CLERK
7698
30 MANAGER 7839
30 SALESMAN 7698
30
29025

SUM(SAL)
2450
5000
8750
6000
800
2975
950
2850
5600
9400

14 rows selected.

THE ABOVE IS COMBINATION OF BELOW:


GROUP BY DEPTNO,JOB,MGR.
GROUP BY DEPTNO.
GROUP BY.
THE ABOVE QUERY DISPLAYS THE FOLLOWING:
TOTAL SALARY FOR EVERY DEPARTMENT.
TOTAL SALARY FOR EVERY DEPARTMENT,JOB,MGR.
GRNAD TOTAL.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

165

1 SELECT DEPTNO,JOB,MGR,SUM(SAL)
2 FROM EMP
3* GROUP BY DEPTNO,JOB,MGR
SQL> /
DEPTNO JOB
MGR SUM(SAL)
---------- --------- ---------- ---------10 CLERK
7782
1300
10 MANAGER
7839
2450
10 PRESIDENT
5000
20 ANALYST
7566
6000
20 CLERK
7788
1100
20 CLERK
7902
800
20 MANAGER
7839
2975
30 CLERK
7698
950
30 MANAGER
7839
2850
30 SALESMAN
7698
5600
10 rows selected.
1 SELECT DEPTNO,SUM(SAL)
2 FROM EMP
3* GROUP BY DEPTNO
4 /
DEPTNO SUM(SAL)
---------- ---------10
8750
20 10875
30
9400
1 SELECT SUM(SAL)
2 FROM EMP
3* GROUP BY()
4 /
SUM(SAL)
---------- ---------29025
1 SELECT DEPTNO,JOB,MGR,SUM(SAL)
2 FROM EMP
3* GROUP BY CUBE(DEPTNO,(JOB,MGR))
SQL> /
DEPTNO JOB
MGR SUM(SAL)
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

166

---------- --------- ---------- ---------20 ANALYST


7566
6000
30 CLERK
7698
950
10 CLERK
7782
1300
20 CLERK
7788
1100
20 CLERK
7902
800
10 MANAGER 7839
2450
20 MANAGER 7839
2975
30 MANAGER 7839
2850
10 PRESIDENT
5000
30 SALESMAN 7698
5600
ANALYST
7566
6000
CLERK
7698
950
CLERK
7782
1300
CLERK
7788
1100
CLERK
7902
800
MANAGER
7839
8275
PRESIDENT
5000
SALESMAN
7698
5600
10
8750
20
10875
30
9400
29025
22 rows selected.
CONCATENATED GROUPING:
1 SELECT DEPTNO,JOB,MGR,SUM(SAL)
2 FROM EMP
3* GROUP BY DEPTNO,ROLLUP(JOB),CUBE(MGR)
SQL> /
DEPTNO JOB
MGR SUM(SAL)
---------- --------- ---------- ---------10 CLERK
7782
1300
10 MANAGER
7839
2450
10 PRESIDENT
5000
20 ANALYST
7566
6000
20 CLERK
7788
1100
20 MANAGER
7839
2975
20 CLERK
7902
800
30 CLERK
7698
950
30 SALESMAN
7698
5600
30 MANAGER
7839
2850
10
7782
1300
10
7839
2450
10
5000
20
7566
6000

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
20
20
20
30
30
10 CLERK
10 MANAGER
10 PRESIDENT
10
20 ANALYST
20 CLERK
20 MANAGER
20
30 CLERK
30 MANAGER
30 SALESMAN
30

7788
7839
7902
7698
7839

167

1100
2975
800
6550
2850
1300
2450
5000
8750
6000
1900
2975
10875
950
2850
5600
9400

31 rows selected.

THE ABOVE QUERY IS COMBINATION OF BELOW QUERIES:


GROUP BY DEPTNO,JOB,MGR.
GROUP BY DEPTNO,MGR.
GROUP BY DEPTNO,JOB.
GROUP BY DEPTNO.
THE ABOVE QUERY DISPLAYS THE FOLLOWING:
TOTAL SALARY FOR EVERY DEPARTEMENT NO,JOB,MGR.
TOTAL SALARY FOR EVERY DEPARTEMENT NO,MGR.
TOTAL SALARY FOR EVERY DEPARTEMENT NO,JOB.
TOTAL SALARY FOR EVERY DEPARTEMENT NO.
1 SELECT DEPTNO,JOB,MGR,SUM(SAL)
2 FROM EMP
3* GROUP BY DEPTNO,JOB,MGR
SQL> /

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

168

DEPTNO JOB
MGR SUM(SAL)
---------- --------- ---------- ---------10 CLERK
7782
1300
10 MANAGER
7839
2450
10 PRESIDENT
5000
20 ANALYST
7566
6000
20 CLERK
7788
1100
20 CLERK
7902
800
20 MANAGER
7839
2975
30 CLERK
7698
950
30 MANAGER
7839
2850
30 SALESMAN
7698
5600
10 rows selected.

1 SELECT DEPTNO,MGR,SUM(SAL)
2 FROM EMP
3* GROUP BY DEPTNO,MGR
4 /
DEPTNO
MGR SUM(SAL)
---------- ---------- ---------10
7782
1300
10
7839
2450
10
5000
20
7566
6000
20
7788
1100
20
7839
2975
20
7902
800
30
7698
6550
30
7839
2850
9 rows selected.
1 SELECT DEPTNO,JOB,SUM(SAL)
2 FROM EMP
3* GROUP BY DEPTNO,JOB
SQL> /
DEPTNO JOB
SUM(SAL)
---------- --------- ---------10 CLERK
1300
10 MANAGER
2450
10 PRESIDENT
5000
20 ANALYST
6000
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN

169

1900
2975
950
2850
5600

9 rows selected.

1 SELECT DEPTNO,SUM(SAL)
2 FROM EMP
3* GROUP BY DEPTNO
SQL> /
DEPTNO SUM(SAL)
---------- ---------10
8750
20 10875
30
9400

TOP_N ANALYSIS:
SQL> SELECT ROWNUM AS RANK,ENAME,SAL
2 FROM (SELECT ENAME,SAL FROM EMP ORDER BY SAL DESC)
3 WHERE ROWNUM <=3;
RANK ENAME
SAL
---------- ---------- ---------1 KING
5000
2 SCOTT
3000
3 FORD
3000

RETRIEVE ONLY ROWS X TO Y FROM A TABLE:

1 SELECT * FROM (SELECT ROWNUM RN,ENAME FROM EMP)


2* WHERE RN BETWEEN 4 AND 7
3 /
4
RN ENAME
---------- ---------4 JONES
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

170

5 MARTIN
6 BLAKE
7 CLARK
SQL> SELECT ROWNUM RN,ENAME FROM EMP GROUP BY ROWNUM,ENAME HAVING
ROWNUM BETWEEN 4 AND 7;
RN ENAME
---------- ---------4 JONES
5 MARTIN
6 BLAKE
7 CLARK

RETRIVING EVEN AND ODD

NUMBER OF ROWS:

SQL> SELECT * FROM (SELECT ROWNUM RN,EMPNO,ENAME FROM EMP) E


2 WHERE MOD(E.RN,2)=0;
RN
EMPNO ENAME
---------- ---------- ---------2
7499 ALLEN
4
7566 JONES
6
7698 BLAKE
8
7788 SCOTT
10
7844 TURNER
12
7900 JAMES
14
7934 MILLER
7 rows selected.
SQL> SELECT * FROM (SELECT ROWNUM RN,EMPNO,ENAME FROM EMP) E
2 WHERE MOD(E.RN,2)=1
3 /
RN
EMPNO ENAME
---------- ---------- ---------1
7369 SMITH
3
7521 WARD
5
7654 MARTIN
7
7782 CLARK
9
7839 KING
11
7876 ADAMS
13
7902 FORD
7 rows selected.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

171

AN AUTOMATIC COMMIT OCCURS UNDER THE FOLLOWING


CIRCUMSTANCES:

DDL STATEMENT ISSUED.


DCL STATEMENT ISSUED.
NORMAL EXIT FROM SQL*PLUS WITHOUT EXPLICITLY ISSUING COMMIT OR
ROLLBACK,
AN AUTOMATIC ROLLBACK OCCURS UNDER AN ABNORMAL TERMINATION OF
SQL*PLUS OR
SYSTEM FAILURE.
DROPING COLUMN:

SQL> CREATE TABLE EMP1


2 AS
3 SELECT * FROM EMP;
Table created.
SQL> ALTER TABLE EMP1
2 SET UNUSED COLUMN MGR;
Table altered.

SQL> DESC EMP1


Name
Null? Type
----------------------------------------------------- -------- -----------------------------------EMPNO
NUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NUMBER(2)
SQL> ALTER TABLE EMP1

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

172

2 DROP UNUSED COLUMNS;


Table altered.
SQL> DESC EMP1
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------EMPNO
NUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NUMBER(2)
SOUNDEX:
SQL> CREATE TABLE MYFRIENDS
2 (NAME VARCHAR2(10));
Table created.

SQL> INSERT INTO MYFRIENDS


2 VALUES
3 ('NEETA');
1 row created.
1 INSERT INTO MYFRIENDS
2 VALUES
3* ('MITA')
SQL> /
1 row created.

1 INSERT INTO MYFRIENDS


2 VALUES
3* ('DIPU')
SQL> /
1 row created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

173

1 INSERT INTO MYFRIENDS


2 VALUES
3* ('DEEPU')
SQL> /
1 row created.
1 INSERT INTO MYFRIENDS
2 VALUES
3* ('DIPA')
SQL> /
1 row created.
1 INSERT INTO MYFRIENDS
2 VALUES
3* ('ANIL')
SQL> /
1 row created.
1 INSERT INTO MYFRIENDS
2 VALUES
3* ('SUNIL')
SQL> /
1 row created.
SQL> SELECT * FROM MYFRIENDS;
NAME
---------NEETA
MITA
DIPU
DEEPU
DIPA
ANIL
SUNIL
7 rows selected.
SQL> SELECT * FROM MYFRIENDS
2 WHERE SOUNDEX(NAME) = SOUNDEX('DEEP');
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

174

NAME
---------DIPU
DEEPU
DIPA
SQL> SELECT SOUNDEX(NAME),NAME,SOUNDEX('DEEP') FROM MYFRIENDS;
SOUN
NAME
---- ---------- ---N300
NEETA
M300
MITA
D100
DIPU
D100
DEEPU
D100
DIPA
A540
ANIL
S540
SUNIL

SOUN
D100
D100
D100
D100
D100
D100
D100

7 rows selected.

GENERATING
SEQUENCES:

PRIMARY

KEY

NUMBERS

USING

ROW

NUM

AND

SQL> CREATE TABLE CUSTOMERS1


2 (CUST_NO NUMBER(10),
3 NAME VARCHAR2(10));
Table created.
SQL> INSERT INTO CUSTOMERS1
2 VALUES
3 (0,'PAVAN');
1 row created.
1 INSERT INTO CUSTOMERS1
2 VALUES
3* (0,'KUMAR')
SQL> /
1 row created.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

175

1 INSERT INTO CUSTOMERS1


2 VALUES
3* (0,'GAYATRI')
SQL> /
1 row created.

1 INSERT INTO CUSTOMERS1


2 VALUES
3* (0,'SRISHA')
SQL> /
1 row created.
1 UPDATE CUSTOMERS1
2* SET CUST_NO = ROWNUM
SQL> /
4 rows updated.
SQL> SELECT * FROM CUSTOMERS1;
CUST_NO NAME
---------- ---------1 PAVAN
2 KUMAR
3 GAYATRI
4 SRISHA
SQL> CREATE SEQUENCE CUSTOMERS1_SEQ
2 INCREMENT BY 1
3 START WITH 10;
Sequence created.
SQL> UPDATE CUSTOMERS1
2 SET CUST_NO = CUSTOMERS1_SEQ.NEXTVAL;
4 rows updated.
SQL> SELECT * FROM CUSTOMERS1;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

176

CUST_NO NAME
---------- ---------10 PAVAN
11 KUMAR
12 GAYATRI
13 SRISHA
CONDITIONAL EXPRESSIONS:
PROVIDE THE USE OF IF-THEN-ELSE LOGIC WITHIN A SQL STATEMENT.
CASE EXPRESSION.
DECODE FUNCTION.
CASE:
1 SELECT EMPNO,ENAME,SAL,
2 CASE

JOB

WHEN 'MANAGER' THEN 1.10 *SAL

WHEN 'CLERK' THEN 1.15 *SAL

WHEN 'SALESMAN'THEN 1.20 *SAL

5 ELSE

SAL END "REVISED_SALARY"

6* FROM EMP
SQL> /
EMPNO ENAME
SAL REVISED_SALARY
---------- ---------- ---------- -------------7369 SMITH
800
920
7499 ALLEN
1600
1920
7521 WARD
1250
1500
7566 JONES
2975
3272.5
7654 MARTIN
1250
1500
7698 BLAKE
2850
3135
7782 CLARK
2450
2695
7788 SCOTT
3000
3000
7839 KING
5000
5000
7844 TURNER
1500
1800
7876 ADAMS
1100
1265
7900 JAMES
950
1092.5
7902 FORD
3000
3000
7934 MILLER
1300
1495
14 rows selected.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

177

DECODE:
1 SELECT EMPNO,ENAME,SAL,
2 DECODE (JOB,'MANAGER'

,1.10 *SAL,

'CLERK'

,1.15 *SAL,

'SALESMAN' ,1.20 *SAL,

SAL ) "REVISED_SALARY"

6* FROM EMP
7 /
EMPNO ENAME
SAL REVISED_SALARY
---------- ---------- ---------- -------------7369 SMITH
800
920
7499 ALLEN
1600
1920
7521 WARD
1250
1500
7566 JONES
2975
3272.5
7654 MARTIN
1250
1500
7698 BLAKE
2850
3135
7782 CLARK
2450
2695
7788 SCOTT
3000
3000
7839 KING
5000
5000
7844 TURNER
1500
1800
7876 ADAMS
1100
1265
7900 JAMES
950
1092.5
7902 FORD
3000
3000
7934 MILLER
1300
1495
14 rows selected.
VIEWS:
WHAT IS VIEW?
AVIEW IS A LOGICAL TABLE BASED ON ONE OR MORE TABLES OR ANOTHER VIEW.
A VIEW CONTAINS NO DATA OF ITS OWN BUT IS LIKE A WINDOW THROUGH WHICH
DATA FROM TABLES
CAN BE VIEWED OR CHANGED.
THE TABLES ON WHICH A VIEW IS BASED ARE CALLED BASE TABLES.
THE VIEW IS STORED AS SELECT STATEMENT IN THE DATA DICTIONARY.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

178

WHY USE VIEWS:


TO RESTRICT DATA ACCESS.
TO MAKE COMPLEX QUERIES EASY.
TO PROVIDE DATA INDEPENDENCE.
TO PRESENT DIFFERENT VIEWS OF THE SAME DATA.

ADVANTAGES OF VIEWS:
VIEWS RESTRICT ACCESS TO THE DATA BECAUSE THE VIEW CAN DISPLAY
SELECTIVE COLUMNS FROM THE TABLES.
VIEWS ALLOW USERS TO MAKE SIMPLE QUERIES TO RETRIVE THE RESULTS
FROM COMPLICATED QUERIES. FOR EXAMPLE, VIEW ALLOWS USERS TO
QUERY INFORMATION FROM MULTIPLE TABLES WITHOUT KNOWING HOW TO
WRITE JOIN STATEMENT.
ONE VIEW CAN BE USED TO RETRIEVE DATA FROM SEVERAL TABLES.
VIEWS PROVIDE GROUPS OF USERS ACCESS TO DATA ACCORDING TO THEIR
PARTICULAR CRITERIA.
FEATURE

SIMPLE VIEWS

COMPLEX VIEWS

NUMBER OF TABLES
CONTAINS FUNCTIONS
CONTAINS GROUPS OF DATA
DML THROUGH VIEW

ONE
NO
NO
YES

ONE OR MORE
YES
YES
NOT ALWAYS

CREATION OF THE VIEW:


CREATE [ OR REPLACE [FORCE\NOFORCE] VIEW VIEW_NAME
[(ALIAS[,ALIAS..)]

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

179

AS SUBQUERY
[WITH CHECK OPTION[CONSTRAINT CONSTRAINT_NAME]]
[WITH READ ONLY[CONSTRAINT CONSTRAINT_NAME]]
IN THE SYNTAX:
OR REPLACE

RECREATES THE VIEW IF ALREADY EXISTS.

FORCE
CREATES THE VIEW REGARDLESS OF WHETHER OR NOT THE
BASE TABLES EXIST.
NOFORCE
DEFAULT).

CREATES THE VIEW ONLY OF THE BASE TABLES EXIST.(THIS IS

VIEW

NAME OF THE VIEW.

ALIAS
SHOULD MATCH.

ALIAS NAME FOR COLUMNS SELECTED BY QUERY, THEY

SUBQUERY

SELECT SATETMENT.

WITH CHECK OPTION


SPECIFIES THAT ONLY ROWS ACCESSIBLE TO THE VIEW
CAN BE INSERTED OR UPDATED.
CONSTRAINT
WITH READ ONLY
THIS VIEW.

NAME OF CONSTRAINT.
ENSURES THAT NO DML OPERATIONS CAN BE PERFORMED ON

GUIDELINES FOR CREATING A VIEW:

THE SUBQUERY THAT DEFINES THE VIEW CANNOT CONTAIN AN ORDER BY CLAUSE.
THE ORDER BY
CLAUSE IS SPECIFIED WHEN YOU RETRIVE THE DATA FROM THE VIEW.

SQL> CREATE TABLE EMP_DUP


2 AS
3 SELECT * FROM EMP;
Table created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

180

SQL> CREATE VIEW EMPVU10


2 AS
3 SELECT * FROM EMP_DUP WHERE DEPTNO=10;
View created.
SQL> DESC EMPVU10;
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------EMPNO
NUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NUMBER(2)
SQL> SELECT * FROM EMPVU10;
EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7782 CLARK
MANAGER
7839 09-JUN-81
2450
7839 KING
PRESIDENT
17-NOV-81
5000
7934 MILLER
CLERK
7782 23-JAN-82
1300

COMM

DEPTNO
10
10
10

THIS IS A SIMPLE VIEW.HERE WE CAN DO ALL DML OPERATIONS.


SQL> INSERT INTO EMPVU10
2 VALUES
3 (1,'PAVAN','MANAGER',7369,'01-DEC-91',1000,100,10);
1 row created.
SQL> SELECT * FROM EMPVU10;
EMPNO
ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7782
CLARK
MANAGER 7839 09-JUN-81
2450
7839
KING
PRESIDENT
17-NOV-81
5000
7934
MILLER CLERK
7782 23-JAN-82
1300
1
PAVAN
MANAGER 7369 01-DEC-91
1000

COMM

100

DEPTNO
10
10
10
10

SQL> SELECT * FROM EMP_DUP WHERE DEPTNO=10;


EMPNO
ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------I Soft Solutions ,Bang-54.

COMM

DEPTNO

STRUCTURED QUERY LANGUAGE

ORACLE
7782
7839
7934
1

181

CLARK
MANAGER 7839 09-JUN-81
KING
PRESIDENT
17-NOV-81
MILLER CLERK
7782 23-JAN-82
PAVAN
MANAGER 7369 01-DEC-91

2450
5000
1300
1000

100

10
10
10
10

HERE DATA IS INSERTED INTO EMP_DUP TABLE.


IN THE SIMPLE VIEW WE CAN PERFORM INSERTION ,DELETION,UPDATION.THE BASE
TABLE WILL BE AFFECTED,BECAUSE VIEW DOES NOT CONTAIN ANY DATA.
IF YOU WANT SEE THE VIEWS CREATED IN THE DATABASE:
SQL> DESC USER_VIEWS
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------VIEW_NAME
NOT NULL VARCHAR2(30)
TEXT_LENGTH
NUMBER
TEXT
LONG
TYPE_TEXT_LENGTH
NUMBER
TYPE_TEXT
VARCHAR2(4000)
OID_TEXT_LENGTH
NUMBER
OID_TEXT
VARCHAR2(4000)
VIEW_TYPE_OWNER
VARCHAR2(30)
VIEW_TYPE
VARCHAR2(30)
SUPERVIEW_NAME
VARCHAR2(30)

SQL> SELECT VIEW_NAME,TEXT FROM USER_VIEWS WHERE VIEW_NAME='EMPVU10';


VIEW_NAME
-----------------------------TEXT
-------------------------------------------------------------------------------EMPVU10
SELECT "EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO" FROM
EMP_DUP
ORACLE SERVER
USER_VIEWS.
IT SEES THE SELECT
STATEMENT HERE.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

182

SQL * PLUS:
SELECT * FROM VIEW;

BASE TABLE.
IT EXECUTES QUERY
ON THIS TABLE AND
SENDS OUTPUT TO
SQL*PLUS.
WHEN EVER WE QUERY A VIEW,SQL*PLUS WILL GO TO USER_VIEWS AND PICK THE
SELECT STATEMENT
FROM THE TABLE AND EXECUTE THE QUERY ON THE BASE TABLE AND RESULT OF
BASE TABLE INFO WILL BE DISPLAYED THROUGH VIEW.

SQL> CREATE VIEW EMPVU1_10


2 AS
3 SELECT EMPNO,ENAME FROM EMP_DUP
4 WHERE DEPTNO=10;
View created.
SQL> DESC EMPVU1_10
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------EMPNO
NUMBER(4)
ENAME
VARCHAR2(10)
SQL>
SELECT
VIEW_NAME,TEXT
VIEW_NAME='EMPVU1_10';

FROM

USER_VIEWS

WHERE

VIEW_NAME
-----------------------------TEXT
-------------------------------------------------------------------------------EMPVU1_10
SELECT EMPNO,ENAME FROM EMP_DUP
WHERE DEPTNO=10
SQL> UPDATE EMPVU10
2 SET SAL = 1000;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

183

4 rows updated.
SQL> SELECT * FROM EMP_DUP WHERE DEPTNO=10;
EMPNO
ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7782
CLARK
MANAGER 7839 09-JUN-81
1000
7839
KING
PRESIDENT
17-NOV-81
1000
7934
MILLER
CLERK
7782 23-JAN-82
1000
1
PAVAN
MANAGER 7369 01-DEC-91
1000
100

DEPTNO
10
10
10
10

SQL> SELECT * FROM EMPVU10;


EMPNO
ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7782
CLARK
MANAGER 7839 09-JUN-81
1000
7839
KING
PRESIDENT
17-NOV-81
1000
7934
MILLER
CLERK
7782 23-JAN-82
1000
1
PAVAN
MANAGER 7369 01-DEC-91
1000
100

DEPTNO
10
10
10
10

1 DELETE FROM EMPVU10


2* WHERE JOB='MANAGER'
SQL> /
2 rows deleted.
SQL> SELECT * FROM EMPVU10;
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7839 KING
PRESIDENT
17-NOV-81
1000
10
7934 MILLER CLERK
7782 23-JAN-82
1000
10

DEPTNO

1 SELECT * FROM EMP_DUP


2* WHERE DEPTNO=10
SQL> /
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7839 KING
PRESIDENT
17-NOV-81
1000
10
7934 MILLER CLERK
7782 23-JAN-82
1000
10

DEPTNO

MODIFYING VIEW:
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

184

SQL> CREATE VIEW EMPVU20


2 (EMPLOYEE_NO,EMPLOYEE_NAME)
3 AS
4 SELECT EMPNO,ENAME FROM EMP_DUP
5 WHERE DEPTNO=20;
View created.
SQL> DESC EMPVU20
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------EMPLOYEE_NO
NUMBER(4)
EMPLOYEE_NAME
VARCHAR2(10)
SQL> CREATE VIEW EMPVU20
2 AS
3 SELECT * FROM EMP_DUP
4 WHERE DEPTNO=20;
CREATE VIEW EMPVU20
*
ERROR at line 1:
ORA-00955: name is already used by an existing object
1 CREATE OR REPLACE VIEW EMPVU20
2 AS
3 SELECT * FROM EMP_DUP
4* WHERE DEPTNO=20
SQL> /
View created.
SQL> DESC EMPVU20
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------EMPNO
NUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NUMBER(2)
HERE ORIGINAL DEFINITION OF THE VIEW REPLACED BY THE CURRENT DEFINITION.
SQL> CREATE VIEW EMPVU30
2 AS
3 SELECT EMPNO EMPLOYEE_NO,ENAME EMPLOYEE_NAME FROM EMP_DUP

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

185

4 WHERE DEPTNO=30;
View created.
SQL> DESC EMPVU30
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------EMPLOYEE_NO
NUMBER(4)
EMPLOYEE_NAME
VARCHAR2(10)
THE CREATE OR REPLACE OPTION ALLOWS A VIEW TO BE CREATED EVEN IF ONE
EXISTS WITH THIS NAME ALREADY, THUS REPLACING OLD VERSION OF THE VIEW.
RULES FOR PERFORMING DML ON VIEW:
YOU CAN PERFORM DML OPERATIONS ON SIMPLE VIEWS.

YOU CANNOT REMOVE A ROW IF THE VIEW CONTAINS THE FOLLOWING:

GROUP FUNCTIONS.
A GROUP BY CLAUSE.
THE DISTINCT KEYWORD.
THE PSEUDOCOLUMN ROWNUM KEYWORD.

YOU CANNOT MODIFY DATA IN A VIEW IF IT CONTAINS THE FOLLOWING:


GROUP FUNCTIONS.
A GROUP BY CLAUSE.
THE DISTINCT KEYWORD.
THE PSEUDOCOLUMN ROWNUM KEYWORD.
COLUMNS DEFINED BY EXPRESSIONS.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

186

YOU CANNOT ADD DATA IN A VIEW IF IT CONTAINS THE FOLLOWING:


GROUP FUNCTIONS.
A GROUP BY CLAUSE.
THE DISTINCT KEYWORD.
THE PSEUDOCOLUMN ROWNUM KEYWORD.
COLUMNS DEFINED BY EXPRESSIONS.
NOT NULL COLUMNS IN THE BASE TABLES THAT ARE NOT SELECTED BY THE
VIEW.
USING THE WITH CHECK OPTION CLAUSE:
THE WITH CHECK OPTION CLAUSE SPECIFIES THAT INSERTS AND UPDATES
PERFORMED
THROUGH THE VIEW CANNOT CREATE ROWS WHICH THE VIEW CANNOT SELECT.

SQL> CREATE TABLE EMP_DUP1


2 AS
3 SELECT * FROM EMP;
Table created.
SQL> CREATE VIEW EMP_DUPVU20
2 AS
3 SELECT EMPNO,ENAME,JOB,DEPTNO FROM EMP_DUP1
4 WHERE DEPTNO=20;
View created.
SQL> DESC EMP_DUPVU20
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------EMPNO
NUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
DEPTNO
NUMBER(2)
SQL> SELECT * FROM EMP_DUPVU20;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
EMPNO ENAME
JOB
---------- ---------- --------- ---------7369 SMITH
CLERK
7566 JONES
MANAGER
7788 SCOTT
ANALYST
7876 ADAMS
CLERK
7902 FORD
ANALYST

187

DEPTNO
20
20
20
20
20

SQL> UPDATE EMP_DUPVU20


2 SET DEPTNO=1;
5 rows updated.
SQL> SELECT * FROM EMP_DUPVU20;
no rows selected
HERE IF YOU WANT TO STOP ANY UPDATE OR INSERT ON THIS VIEW.
SQL> DROP TABLE EMP_DUP1;
Table dropped.
SQL> CREATE TABLE EMP_DUP1
2 AS
3 SELECT * FROM EMP;
Table created.
SQL> DROP VIEW EMP_DUPVU20;
View dropped.
SQL> CREATE VIEW EMP_DUPVU20
2 AS
3 SELECT EMPNO,ENAME,JOB,DEPTNO FROM EMP_DUP1
4 WHERE DEPTNO=20
5 WITH CHECK OPTION CONSTRAINT EMP_DUPVU20_VIEWCHECK;
View created.
SQL> UPDATE EMP_DUPVU20
2 SET DEPTNO=1;
UPDATE EMP_DUPVU20
*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

188

SQL> INSERT INTO EMP_DUPVU20


2 VALUES
3 (1,'PAVAN','MANAGER',10);
INSERT INTO EMP_DUPVU20
*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation
SQL> SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM USER_CONSTRAINTS
2 WHERE TABLE_NAME='EMP_DUPVU20';
CONSTRAINT_NAME
------------------------------ EMP_DUPVU20_VIEWCHECK

C
V

NO ROWS ARE UPDATED BECAUSE IF THE DEPARTMENT NUMBER WAS CHANGE TO 1,


THE VIEW WOULD NO LONGER BE ABLE TO SEE THAT EMPLOYEES OF 20.THUS WE
CANNOT CHANGE THE VIEW DEFINITION.
HERE WE CAN UPDATE ANY OTHER COLUMNS WITHOUT AFFECTING VIEW
DEFINITION.

READ ONLY VIEWS:


DENYING DML OPERATIONS ON THE VIEW BY KEEPING READ ONLY CONSTRAINT.
SQL> CREATE VIEW EMP_DUP30VU
2 AS
3 SELECT * FROM EMP_DUP1
4 WITH READ ONLY CONSTRAINT EMP_DUP30VU_READONLY;
View created.
SQL> UPDATE EMP_DUP30VU
2 SET DEPTNO=30;
SET DEPTNO=30
*
ERROR at line 2:
ORA-01733: virtual column not allowed here
SQL> INSERT INTO EMP_DUP30VU
2 VALUES
3 (1,'PAVAN','MANAGER',7369,'01-DEC-92',1000,100,30);
INSERT INTO EMP_DUP30VU
*
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

189

ERROR at line 1:
ORA-01733: virtual column not allowed here
SQL> DELETE FROM EMP_DUP30VU;
DELETE FROM EMP_DUP30VU
*
ERROR at line 1:
ORA-01752: cannot delete from view without exactly one key-preserved table
SQL> SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM USER_CONSTRAINTS
2 WHERE TABLE_NAME='EMP_DUP30VU';
CONSTRAINT_NAME
------------------------------ EMP_DUP30VU_READONLY

C
O

HERE NO DELETION,NO UPDATION ,NO INSERTION ON THE VIEW. ONLY READ. IN THE
USER_CONSTRAINTS TABLE CONSTRAINT_TYPE IS O.
COMPLEX VIEWS:
1 CREATE VIEW DEPT_SUM_VU
2 (NAME,MINSAL,MAXSAL,AVGSAL)
3 AS
4 SELECT D.DNAME,MIN(E.SAL),MAX(E.SAL),AVG(E.SAL)
5 FROM EMP E, DEPT D
6 WHERE E.DEPTNO=D.DEPTNO
7* GROUP BY D.DNAME
8 /
View created.

SQL> SELECT * FROM DEPT_SUM_VU;


NAME
MINSAL MAXSAL AVGSAL
-------------- ---------- ---------- ---------ACCOUNTING
1300
5000 2916.66667
RESEARCH
800
3000
2175
SALES
950
2850 1566.66667
SQL> DESC DEPT_SUM_VU
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------NAME
VARCHAR2(14)

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
MINSAL
MAXSAL
AVGSAL

190

NUMBER
NUMBER
NUMBER

SQL> INSERT INTO DEPT_SUM_VU


2 VALUES
3 ('COMPUTERS',111,111,111);
INSERT INTO DEPT_SUM_VU
*
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view
SQL> UPDATE DEPT_SUM_VU
2 SET NAME='COMPUTERS';
UPDATE DEPT_SUM_VU
*
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view
SQL> DELETE FROM DEPT_SUM_VU;
DELETE FROM DEPT_SUM_VU
*
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view
SQL> CREATE VIEW EQUI_JOINVU
2 AS
3 SELECT EMPNO,ENAME,DEPTNO,DNAME,LOC FROM EMP NATURAL JOIN DEPT;
View created.

SQL> SELECT * FROM EQUI_JOINVU;


EMPNO ENAME
DEPTNO DNAME
LOC
---------- ---------- ---------- -------------- ------------7369 SMITH
20 RESEARCH
DALLAS
7499 ALLEN
30 SALES
CHICAGO
7521 WARD
30 SALES
CHICAGO
7566 JONES
20 RESEARCH
DALLAS
7654 MARTIN
30 SALES
CHICAGO
7698 BLAKE
30 SALES
CHICAGO
7782 CLARK
10 ACCOUNTING
NEW YORK
7788 SCOTT
20 RESEARCH
DALLAS
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER

191

10 ACCOUNTING
NEW YORK
30 SALES
CHICAGO
20 RESEARCH
DALLAS
30 SALES
CHICAGO
20 RESEARCH
DALLAS
10 ACCOUNTING
NEW YORK

14 rows selected.
DROPING VIEW:
SQL> DROP VIEW EMPVU10;
View dropped.
GROUP BY:
SQL> SELECT DEPTNO,JOB,SUM(SAL)
2 FROM EMP
3 GROUP BY DEPTNO,JOB;
DEPTNO JOB
SUM(SAL)
---------- --------- ---------10 CLERK
1300
10 MANAGER
2450
10 PRESIDENT
5000
20 ANALYST
6000
20 CLERK
1900
20 MANAGER
2975
30 CLERK
950
30 MANAGER
2850
30 SALESMAN
5600
10 rows selected.

ROLL UP:
1 SELECT DEPTNO,JOB,SUM(SAL)
2 FROM EMP
3* GROUP BY ROLLUP(DEPTNO,JOB)
4 /
DEPTNO JOB
SUM(SAL)
---------- --------- ----------

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
10 CLERK
10 MANAGER
10 PRESIDENT
10
20 ANALYST
20 CLERK
20 MANAGER
20
30 CLERK
30 MANAGER
30 SALESMAN
30

192

1300
2450
5000
8750
6000
1900
2975
10875
950
2850
5600
9400
29025

15 rows selected.
THE ABOVE QUERY IS COMBINATION OF :
GROUP BY DEPTNO,JOB.
GROUP BY DEPTNO.
GROUP BY ().

1 SELECT DEPTNO,JOB,SUM(SAL) FROM


2 EMP
3* GROUP BY DEPTNO,JOB
4 /
DEPTNO JOB
SUM(SAL)
---------- --------- ---------10 CLERK
1300
10 MANAGER
2450
10 PRESIDENT
5000
20 ANALYST
6000
20 CLERK
1900
20 MANAGER
2975
30 CLERK
950
30 MANAGER
2850
30 SALESMAN
5600
9 rows selected.
1 SELECT DEPTNO,SUM(SAL) FROM
2 EMP
3* GROUP BY (DEPTNO)

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

193

SQL> /
DEPTNO SUM(SAL)
---------- ---------10
8750
20 10875
30
9400
1 SELECT SUM(SAL) FROM
2 EMP
3* GROUP BY ()
4 /
SUM(SAL)
---------29025
CUBE:
CUBE RETURNS SAME AS ROLL UP + ALL INDIVIDUAL JOBS SUM SALARIES.
1 SELECT DEPTNO,JOB,SUM(SAL)
2 FROM EMP
3* GROUP BY CUBE(DEPTNO,JOB)
SQL> /
DEPTNO JOB
SUM(SAL)
---------- --------- ---------10 CLERK
1300
10 MANAGER
2450
10 PRESIDENT
5000
10
8750
20 ANALYST
6000
20 CLERK
1900
20 MANAGER
2975
20
10875
30 CLERK
950
30 MANAGER
2850
30 SALESMAN
5600
30
9400
ANALYST
6000
CLERK
4150
MANAGER
8275
PRESIDENT
5000
SALESMAN
5600

29025

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

194

21 rows selected.
THE ABOVE QUERY IS COMBINATION OF :
GROUP BY DEPTNO,JOB.
GROUP BY DEPTNO.
GROUP BY JOB.
GROUP BY ().

1 SELECT DEPTNO,JOB,SUM(SAL) FROM


2 EMP
3* GROUP BY DEPTNO,JOB
4 /
DEPTNO JOB
SUM(SAL)
---------- --------- ---------10 CLERK
1300
10 MANAGER
2450
10 PRESIDENT
5000
20 ANALYST
6000
20 CLERK
1900
20 MANAGER
2975
30 CLERK
950
30 MANAGER
2850
30 SALESMAN
5600
9 rows selected.

1 SELECT DEPTNO,SUM(SAL) FROM


2 EMP
3* GROUP BY (DEPTNO)
SQL> /
DEPTNO SUM(SAL)
---------- ---------10
8750
20 10875
30
9400
1 SELECT SUM(SAL) FROM
2 EMP
3* GROUP BY ()
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

195

4 /
SUM(SAL)
---------29025
SQL> SELECT JOB,SUM(SAL) FROM EMP
2 GROUP BY JOB;
JOB
SUM(SAL)
--------- ---------ANALYST
6000
CLERK
4150
MANAGER
8275
PRESIDENT
5000
SALESMAN
5600

GROUPING FUNCTION:
1 SELECT DEPTNO,JOB,SUM(SAL),
2 GROUPING(DEPTNO) GR_DEPTNO,
3 GROUPING(JOB) GR_JOB
4 FROM EMP
5* GROUP BY ROLLUP(DEPTNO,JOB)
6 /
DEPTNO JOB
SUM(SAL) GR_DEPTNO
---------- --------- ---------- ---------- ---------10 CLERK
1300
0
10 MANAGER
2450
10 PRESIDENT
5000
10
8750
20 ANALYST
6000
20 CLERK
1900
0
20 MANAGER
2975
20
10875
30 CLERK
950
0
30 MANAGER
2850
30 SALESMAN
5600
30
9400
0
29025

GR_JOB
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1

0
0
1
0
0
1
0
0
0
1

15 rows selected.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

196

1 SELECT DEPTNO,JOB,SUM(SAL),
2 GROUPING(DEPTNO) GR_DEPTNO,
3 GROUPING(JOB) GR_JOB
4 FROM EMP
5* GROUP BY CUBE(DEPTNO,JOB)
SQL> /
DEPTNO JOB
SUM(SAL) GR_DEPTNO
---------- --------- ---------- ---------- ---------10 CLERK
1300
0
0
10 MANAGER
2450
0
10 PRESIDENT
5000
0
10
8750
0
20 ANALYST
6000
0
20 CLERK
1900
0
0
20 MANAGER
2975
0
20
10875
0
30 CLERK
950
0
0
30 MANAGER
2850
0
30 SALESMAN
5600
0
30
9400
0
ANALYST
6000
1
0
CLERK
4150
1
MANAGER
8275
1
PRESIDENT
5000
1
SALESMAN
5600
1
0
0
1
1
0
29025
1
1

GR_JOB
0
0
1
0
0
1
0
0
1
0
0
0
0
0

21 rows selected.
GROUPING SETS:
1 SELECT DEPTNO,JOB,MGR MANAGER_NO,AVG(SAL)
2 FROM EMP
3 GROUP BY GROUPING SETS
4* ((DEPTNO,JOB),(JOB,MGR))
SQL> /
DEPTNO JOB
MANAGER_NO
---------- --------- ---------- ---------10 CLERK
10 MANAGER
10 PRESIDENT
20 ANALYST
3000

I Soft Solutions ,Bang-54.

AVG(SAL)
1300
2450
5000

STRUCTURED QUERY LANGUAGE

ORACLE
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN
ANALYST
CLERK
CLERK
CLERK
CLERK
MANAGER
PRESIDENT
SALESMAN

197

950
2975
950
2850
1400
7566
7698
7782
7788
7902
7839
7698

3000
950
1300
1100
800
2758.33333
5000
1400

19 rows selected.
1 SELECT DEPTNO,JOB,MGR MANAGER_NO,SUM(SAL)
2 FROM EMP
3 GROUP BY GROUPING SETS
4* ((DEPTNO,JOB),(JOB,MGR))
SQL> /
DEPTNO JOB
MANAGER_NO
---------- --------- ---------- ---------10 CLERK
10 MANAGER
10 PRESIDENT
20 ANALYST
6000
20 CLERK
20 MANAGER
30 CLERK
950
30 MANAGER
30 SALESMAN
ANALYST
7566
CLERK
7698
CLERK
7782
CLERK
7788
CLERK
7902
MANAGER
7839
PRESIDENT
5000
SALESMAN
7698

SUM(SAL)
1300
2450
5000
1900
2975
2850
5600
6000
950
1300
1100
800
8275
5600

17 rows selected.
THE ABOVE IS COMBINATION OF:
GROUP BY DEPT,JOB.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

198

GROUP BY JOB,MGR.
1 SELECT DEPTNO,JOB,SUM(SAL)
2 FROM EMP
3* GROUP BY(DEPTNO,JOB)
SQL> /
DEPTNO JOB
SUM(SAL)
---------- --------- ---------10 CLERK
1300
10 MANAGER
2450
10 PRESIDENT
5000
20 ANALYST
6000
20 CLERK
1900
20 MANAGER
2975
30 CLERK
950
30 MANAGER
2850
30 SALESMAN
5600
9 rows selected.
1 SELECT JOB,MGR,SUM(SAL)
2 FROM EMP
3* GROUP BY(JOB,MGR)
SQL> /
JOB
MGR SUM(SAL)
--------- ---------- ---------ANALYST
7566
6000
CLERK
7698
950
CLERK
7782
1300
CLERK
7788
1100
CLERK
7902
800
MANAGER 7839
8275
PRESIDENT
5000
SALESMAN 7698
5600
8 rows selected.

COMPOSITE COLUMNS:
1 SELECT DEPTNO,JOB,MGR MANAGER_NO,SUM(SAL)
2 FROM EMP
3* GROUP BY ROLLUP(DEPTNO,(JOB,MGR))
SQL> /

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
DEPTNO JOB
MANAGER_NO
---------- --------- ---------- ---------10 CLERK
7782
1300
10 MANAGER 7839
10 PRESIDENT
10
20 ANALYST
7566
20 CLERK
7788
1100
20 CLERK
7902
20 MANAGER 7839
20
10875
30 CLERK
7698
30 MANAGER 7839
30 SALESMAN 7698
30
29025

199

SUM(SAL)
2450
5000
8750
6000
800
2975
950
2850
5600
9400

14 rows selected.
THE ABOVE IS COMBINATION OF BELOW:
GROUP BY DEPTNO,JOB,MGR.
GROUP BY DEPTNO.
GROUP BY.
THE ABOVE QUERY DISPLAYS THE FOLLOWING:
TOTAL SALARY FOR EVERY DEPARTMENT.
TOTAL SALARY FOR EVERY DEPARTMENT,JOB,MGR.
GRNAD TOTAL.

1 SELECT DEPTNO,JOB,MGR,SUM(SAL)
2 FROM EMP
3* GROUP BY DEPTNO,JOB,MGR
SQL> /
DEPTNO JOB
MGR SUM(SAL)
---------- --------- ---------- ---------10 CLERK
7782
1300
10 MANAGER
7839
2450
10 PRESIDENT
5000
20 ANALYST
7566
6000
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
20 CLERK
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN

7788
7902
7698

1100
800
7839
950
7839
7698

200

2975
2850
5600

10 rows selected.
1 SELECT DEPTNO,SUM(SAL)
2 FROM EMP
3* GROUP BY DEPTNO
4 /
DEPTNO SUM(SAL)
---------- ---------10
8750
20 10875
30
9400
1 SELECT SUM(SAL)
2 FROM EMP
3* GROUP BY()
4 /
SUM(SAL)
---------- ---------29025

1 SELECT DEPTNO,JOB,MGR,SUM(SAL)
2 FROM EMP
3* GROUP BY CUBE(DEPTNO,(JOB,MGR))
SQL> /
DEPTNO JOB
MGR SUM(SAL)
---------- --------- ---------- ---------20 ANALYST
7566
6000
30 CLERK
7698
950
10 CLERK
7782
1300
20 CLERK
7788
1100
20 CLERK
7902
800
10 MANAGER 7839
2450
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
20 MANAGER
30 MANAGER
10 PRESIDENT
30 SALESMAN
ANALYST
CLERK
CLERK
CLERK
CLERK
MANAGER
PRESIDENT
SALESMAN
10
20
30

7839
7839

201

2975
2850
5000
5600
6000
950
1300
1100
800
8275

7698
7566
7698
7782
7788
7902
7839
5000
7698

5600
8750
10875
9400
29025

22 rows selected.

CONCATENATED GROUPING:
1 SELECT DEPTNO,JOB,MGR,SUM(SAL)
2 FROM EMP
3* GROUP BY DEPTNO,ROLLUP(JOB),CUBE(MGR)
SQL> /
DEPTNO JOB
MGR SUM(SAL)
---------- --------- ---------- ---------10 CLERK
7782
1300
10 MANAGER
7839
2450
10 PRESIDENT
5000
20 ANALYST
7566
6000
20 CLERK
7788
1100
20 MANAGER
7839
2975
20 CLERK
7902
800
30 CLERK
7698
950
30 SALESMAN
7698
5600
30 MANAGER
7839
2850
10
7782
1300
10
7839
2450
10
5000
20
7566
6000
20
7788
1100
20
7839
2975
20
7902
800
30
7698
6550
30
7839
2850

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
10 CLERK
10 MANAGER
10 PRESIDENT
10
20 ANALYST
20 CLERK
20 MANAGER
20
30 CLERK
30 MANAGER
30 SALESMAN
30

202

1300
2450
5000
8750
6000
1900
2975
10875
950
2850
5600
9400

31 rows selected.

THE ABOVE QUERY IS COMBINATION OF BELOW QUERIES:


GROUP BY DEPTNO,JOB,MGR.
GROUP BY DEPTNO,MGR.
GROUP BY DEPTNO,JOB.
GROUP BY DEPTNO.
THE ABOVE QUERY DISPLAYS THE FOLLOWING:
TOTAL SALARY FOR EVERY DEPARTEMENT NO,JOB,MGR.
TOTAL SALARY FOR EVERY DEPARTEMENT NO,MGR.
TOTAL SALARY FOR EVERY DEPARTEMENT NO,JOB.
TOTAL SALARY FOR EVERY DEPARTEMENT NO.
1 SELECT DEPTNO,JOB,MGR,SUM(SAL)
2 FROM EMP
3* GROUP BY DEPTNO,JOB,MGR
SQL> /
DEPTNO JOB
MGR SUM(SAL)
---------- --------- ---------- ---------10 CLERK
7782
1300
10 MANAGER
7839
2450
10 PRESIDENT
5000
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
20 ANALYST
20 CLERK
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN

7788
7902
7698

7566
1100
800
7839
950
7839
7698

203

6000
2975
2850
5600

10 rows selected.
1 SELECT DEPTNO,MGR,SUM(SAL)
2 FROM EMP
3* GROUP BY DEPTNO,MGR
4 /
DEPTNO
MGR SUM(SAL)
---------- ---------- ---------10
7782
1300
10
7839
2450
10
5000
20
7566
6000
20
7788
1100
20
7839
2975
20
7902
800
30
7698
6550
30
7839
2850
9 rows selected.
1 SELECT DEPTNO,JOB,SUM(SAL)
2 FROM EMP
3* GROUP BY DEPTNO,JOB
SQL> /
DEPTNO JOB
SUM(SAL)
---------- --------- ---------10 CLERK
1300
10 MANAGER
2450
10 PRESIDENT
5000
20 ANALYST
6000
20 CLERK
1900
20 MANAGER
2975
30 CLERK
950
30 MANAGER
2850
30 SALESMAN
5600
9 rows selected.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

204

1 SELECT DEPTNO,SUM(SAL)
2 FROM EMP
3* GROUP BY DEPTNO
SQL> /
DEPTNO SUM(SAL)
---------- ---------10
8750
20 10875
30
9400
TYPES OF MULTIPLE INSERT STATEMENTS:
UNCONDITIONAL INSERT.
CONDITIONAL ALL INSERT.
CONDITIONAL FIRST.
PIVOTING INSERT.
UNCONDITIONAL INSERT ALL:
SQL> CREATE TABLE SAL_HISTORY
2 (EMPNO NUMBER(10),
3 HIREDATE DATE,
4 SAL NUMBER(10,2));
Table created.
1 CREATE TABLE MGR_HISTORY
2 (EMPNO NUMBER(10),
3 MGR NUMBER(10),
4* SAL NUMBER(10,2))
5 /
Table created.
SQL> INSERT ALL
2 INTO SAL_HISTORY VALUES(EMPNO,HIREDATE,SAL)
3 INTO MGR_HISTORY VALUES(EMPNO,MGR,SAL)
4 SELECT EMPNO,HIREDATE,SAL,MGR FROM EMP;
28 rows created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

205

SQL> SELECT * FROM SAL_HISTORY;


EMPNO HIREDATE
SAL
---------- --------- ---------7369 17-DEC-80
800
7499 20-FEB-81
1600
7521 22-FEB-81
1250
7566 02-APR-81
2975
7654 28-SEP-81
1250
7698 01-MAY-81
2850
7782 09-JUN-81
2450
7788 19-APR-87
3000
7839 17-NOV-81
5000
7844 08-SEP-81
1500
7876 23-MAY-87
1100
7900 03-DEC-81
950
7902 03-DEC-81
3000
7934 23-JAN-82
1300
14 rows selected.

1* SELECT * FROM MGR_HISTORY


SQL> /
EMPNO
MGR
SAL
---------- ---------- ---------7369
7902
800
7499
7698
1600
7521
7698
1250
7566
7839
2975
7654
7698
1250
7698
7839
2850
7782
7839
2450
7788
7566
3000
7839
5000
7844
7698
1500
7876
7788
1100
7900
7698
950
7902
7566
3000
7934
7782
1300
14 rows selected.
SQL> DELETE FROM SAL_HISTORY;
14 rows deleted.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

206

SQL>DELETE FROM MGR_HISTORY;


14 rows deleted.
SQL> INSERT ALL
2 INTO SAL_HISTORY VALUES(EMPNO,HIREDATE,SAL)
3 INTO MGR_HISTORY VALUES(EMPNO,MGR,SAL)
4 SELECT EMPNO,HIREDATE,SAL,MGR FROM EMP
5 WHERE DEPTNO=20;
10 rows created.
SQL> SELECT * FROM SAL_HISTORY;
EMPNO HIREDATE
SAL
---------- --------- ---------7369 17-DEC-80
800
7566 02-APR-81
2975
7788 19-APR-87
3000
7876 23-MAY-87
1100
7902 03-DEC-81
3000
1* SELECT * FROM MGR_HISTORY
SQL> /
EMPNO
MGR
SAL
---------- ---------- ---------7369
7902
800
7566
7839
2975
7788
7566
3000
7876
7788
1100
7902
7566
3000
SQL> DELETE FROM SAL_HISTORY;
5 rows deleted.
1* DELETE FROM MGR_HISTORY
SQL> /
5 rows deleted.
CONDITIONAL INSERT ALL:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

207

1 INSERT ALL
2 WHEN SAL > 2000 THEN
3 INTO SAL_HISTORY VALUES(EMPNO,HIREDATE,SAL)
4 WHEN DEPTNO > 10 THEN
5 INTO MGR_HISTORY VALUES(EMPNO,MGR,SAL)
6* SELECT EMPNO,HIREDATE,SAL,MGR,DEPTNO FROM EMP
7 /
17 rows created.
SQL> SELECT * FROM SAL_HISTORY;
EMPNO HIREDATE
SAL
---------- --------- ---------7566 02-APR-81
2975
7698 01-MAY-81
2850
7782 09-JUN-81
2450
7788 19-APR-87
3000
7839 17-NOV-81
5000
7902 03-DEC-81
3000
6 rows selected.
1* SELECT * FROM MGR_HISTORY
SQL> /
EMPNO
MGR
SAL
---------- ---------- ---------7369
7902
800
7499
7698
1600
7521
7698
1250
7566
7839
2975
7654
7698
1250
7698
7839
2850
7788
7566
3000
7844
7698
1500
7876
7788
1100
7900
7698
950
7902
7566
3000
11 rows selected.

SQL> DELETE FROM SAL_HISTORY;


6 rows deleted.
SQL> DELETE FROM MGR_HISTORY;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

208

11 rows deleted.
SQL> INSERT FIRST
2 WHEN SAL = 5000 THEN
3 INTO SAL_HISTORY VALUES(EMPNO,HIREDATE,SAL)
4 WHEN DEPTNO > 10 THEN
5 INTO MGR_HISTORY VALUES(EMPNO,MGR,SAL)
6 WHEN DEPTNO > 20 THEN
7 INTO MGR_HISTORY VALUES(EMPNO,MGR,SAL)
8 ELSE
9 INTO MGR_HISTORY VALUES(EMPNO,MGR,SAL)
10 SELECT EMPNO,HIREDATE,SAL,MGR,DEPTNO FROM EMP;
14 rows created.

SQL> SELECT * FROM SAL_HISTORY;


EMPNO HIREDATE
SAL
---------- --------- ---------7839 17-NOV-81
5000
SQL> SELECT * FROM MGR_HISTORY;
EMPNO
MGR
SAL
---------- ---------- ---------7369
7902
800
7499
7698
1600
7521
7698
1250
7566
7839
2975
7654
7698
1250
7698
7839
2850
7788
7566
3000
7844
7698
1500
7876
7788
1100
7900
7698
950
7902
7566
3000
7782
7839
2450
7934
7782
1300
13 rows selected.
CONDITIONAL FIRST INSERT:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

209

SQL> CREATE TABLE SPECIAL_SAL


2 (DEPTNO NUMBER(10),
3 SAL NUMBER(10));
Table created.
SQL> CREATE TABLE HIREDATE_HIS_81
2 (DEPTNO NUMBER(10),
3 HIREDATE DATE);
Table created.
1 CREATE TABLE HIREDATE_HIS_87
2 (DEPTNO NUMBER(10),
3* HIREDATE DATE)
4 /
Table created.
1 CREATE TABLE HIREDATE_HIS
2 (DEPTNO NUMBER(10),
3* HIREDATE DATE)
4 /
Table created.
1 INSERT FIRST
2 WHEN SAL > 2000 THEN
3 INTO SPECIAL_SAL VALUES(DEPTNO,SAL)
4 WHEN HIREDATE LIKE ('%81%') THEN
5 INTO HIREDATE_HIS_81 VALUES (DEPTNO,HIREDATE)
6 WHEN HIREDATE LIKE ('%87%') THEN
7 INTO HIREDATE_HIS_87 VALUES (DEPTNO,HIREDATE)
8 ELSE
9 INTO HIREDATE_HIS VALUES (DEPTNO,HIREDATE)
10* SELECT DEPTNO,SAL,HIREDATE FROM EMP
SQL> /
14 rows created.
SQL> SELECT * FROM SPECIAL_SAL;
DEPTNOSAL
---------- ---------20
2975
30
2850
10
2450
20
3000
10
5000
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
20

210

3000

6 rows selected.
SQL> SELECT * FROM HIREDATE_HIS_81;
DEPTNO HIREDATE
---------- --------30 20-FEB-81
30 22-FEB-81
30 28-SEP-81
30 08-SEP-81
30 03-DEC-81
SQL> SELECT * FROM HIREDATE_HIS_87;
DEPTNO HIREDATE
---------- --------20 23-MAY-87
SQL> SELECT * FROM HIREDATE_HIS;
DEPTNO HIREDATE
---------- --------20 17-DEC-80
10 23-JAN-82

1 CREATE TABLE SPECIAL_SAL1


2 (DEPTNO NUMBER(10),
3 SAL NUMBER(10),
4* HIREDATE DATE)
SQL> /
Table created.
1 CREATE TABLE HIREDATE_HIS_81_1
2 (DEPTNO NUMBER(10),
3 HIREDATE DATE,
4* SAL NUMBER)
SQL> /
Table created.
1 CREATE TABLE HIREDATE_HIS_87_1
2 (DEPTNO NUMBER(10),
3 HIREDATE DATE,
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

211

4* SAL NUMBER)
5 /
Table created.
1 CREATE TABLE HIREDATE_HIS_1
2 (DEPTNO NUMBER(10),
3 HIREDATE DATE,
4* SAL NUMBER)
5 /
Table created.
1 INSERT FIRST
2 WHEN SAL > 2000 THEN
3 INTO SPECIAL_SAL1 VALUES(DEPTNO,SAL,HIREDATE)
4 WHEN HIREDATE LIKE ('%81%') THEN
5 INTO HIREDATE_HIS_81_1 VALUES (DEPTNO,HIREDATE,SAL)
6 WHEN HIREDATE LIKE ('%87%') THEN
7 INTO HIREDATE_HIS_87_1 VALUES (DEPTNO,HIREDATE,SAL)
8 ELSE
9 INTO HIREDATE_HIS_1 VALUES (DEPTNO,HIREDATE,SAL)
10* SELECT DEPTNO,SAL,HIREDATE FROM EMP
SQL> /
14 rows created.

SQL> SELECT * FROM SPECIAL_SAL1;


DEPTNO
SAL HIREDATE
---------- ---------- --------20
2975 02-APR-81
30
2850 01-MAY-81
10
2450 09-JUN-81
20
3000 19-APR-87
10
5000 17-NOV-81
20
3000 03-DEC-81
6 rows selected.
SQL> SELECT * FROM HIREDATE_HIS_1;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

212

DEPTNO HIREDATE
SAL
---------- --------- ---------20 17-DEC-80
800
10 23-JAN-82
1300
1* SELECT * FROM HIREDATE_HIS_81_1
SQL> /
DEPTNO HIREDATE
SAL
---------- --------- ---------30 20-FEB-81
1600
30 22-FEB-81
1250
30 28-SEP-81
1250
30 08-SEP-81
1500
30 03-DEC-81
950
1* SELECT * FROM HIREDATE_HIS_87_1
SQL> /
DEPTNO HIREDATE
SAL
---------- --------- ---------20 23-MAY-87
1100
SQL> DELETE FROM SPECIAL_SAL1;
6 rows deleted.
SQL> DELETE FROM HIREDATE_HIS_1;
2 rows deleted.

1* DELETE FROM HIREDATE_HIS_81_1


SQL> /
5 rows deleted.
1* DELETE FROM HIREDATE_HIS_87_1
SQL> /
1 row deleted.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

213

1 INSERT FIRST
2 WHEN SAL > 5000 THEN
3 INTO SPECIAL_SAL1 VALUES(DEPTNO,SAL,HIREDATE)
4 WHEN HIREDATE LIKE ('%81%') THEN
5 INTO HIREDATE_HIS_81_1 VALUES (DEPTNO,HIREDATE,SAL)
6 WHEN HIREDATE LIKE ('%87%') THEN
7 INTO HIREDATE_HIS_87_1 VALUES (DEPTNO,HIREDATE,SAL)
8 ELSE
9 INTO HIREDATE_HIS_1 VALUES (DEPTNO,HIREDATE,SAL)
10* SELECT DEPTNO,SAL,HIREDATE FROM EMP
11 /
14 rows created.
SQL> SELECT * FROM SPECIAL_SAL1;
no rows selected

SQL> SELECT * FROM HIREDATE_HIS_81_1;


DEPTNO HIREDATE
SAL
---------- --------- ---------30 20-FEB-81
1600
30 22-FEB-81
1250
20 02-APR-81
2975
30 28-SEP-81
1250
30 01-MAY-81
2850
10 09-JUN-81
2450
10 17-NOV-81
5000
30 08-SEP-81
1500
30 03-DEC-81
950
20 03-DEC-81
3000
10 rows selected.

SQL> SELECT * FROM HIREDATE_HIS_87_1;


DEPTNO HIREDATE
SAL
---------- --------- ---------20 19-APR-87
3000
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
20 23-MAY-87

214

1100

SQL> SELECT * FROM HIREDATE_HIS;


DEPTNO HIREDATE
---------- --------20 17-DEC-80
10 23-JAN-82
PIVOTING INSERT:
SQL> CREATE TABLE SALES_SOURCE_DATA
2 (EMPLOYEE_ID NUMBER(10),
3 WEEK_ID NUMBER(2),
4 SALES_MON NUMBER(10),
5 SALES_TUE NUMBER(10),
6 SALES_WED NUMBER(10),
7 SALES_THUR NUMBER(10),
8 SALES_FRI NUMBER(10));
Table created.
SQL> INSERT INTO SALES_SOURCE_DATA
2 VALUES
3 (1,6,2000,3000,4000,5000,6000);
1 row created.
SQL> CREATE TABLE SALES_INFO
2 (EMPLOYEE_ID NUMBER(10),
3 WEEK
NUMBER(10),
4 SALES
NUMBER(10));
Table created.
1 INSERT ALL
2 INTO SALES_INFO VALUES(EMPLOYEE_ID,WEEK_ID,SALES_MON)
3 INTO SALES_INFO VALUES(EMPLOYEE_ID,WEEK_ID,SALES_TUE)
4 INTO SALES_INFO VALUES(EMPLOYEE_ID,WEEK_ID,SALES_WED)
5 INTO SALES_INFO VALUES(EMPLOYEE_ID,WEEK_ID,SALES_THUR)
6 INTO SALES_INFO VALUES(EMPLOYEE_ID,WEEK_ID,SALES_FRI)
7 SELECT EMPLOYEE_ID,WEEK_ID,SALES_MON,SALES_TUE,SALES_WED,
8* SALES_THUR,SALES_FRI FROM SALES_SOURCE_DATA
SQL> /
5 rows created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

215

SQL> SELECT * FROM SALES_INFO;


EMPLOYEE_ID
WEEK
----------- ---------- ---------1
6
2000
1
6
3000
1
6
4000
1
6
5000
1
6
6000

SALES

SCALAR SUBQUERIES:
A SCALAR THAT RETURNS EXACTLY ONE COLUMN VALUE FROM ONE ROW
IS REFERED AS A SCALAR SUB QUERY.
SCALAR SUBQUERIES IN CASE:

1 SELECT EMPNO,ENAME,DEPTNO,
2 (CASE
3 WHEN DEPTNO = (SELECT DEPTNO FROM DEPT
4 WHERE LOC = 'NEW YORK')
5 THEN 'CANADA' ELSE 'USA' END) LOCATION
6* FROM EMP
SQL> /
EMPNO ENAME
DEPTNO LOCATI
---------- ---------- ---------- -----7369 SMITH
20 USA
7499 ALLEN
30 USA
7521 WARD
30 USA
7566 JONES
20 USA
7654 MARTIN
30 USA
7698 BLAKE
30 USA
7782 CLARK
10 CANADA
7788 SCOTT
20 USA
7839 KING
10 CANADA
7844 TURNER
30 USA
7876 ADAMS
20 USA
7900 JAMES
30 USA
7902 FORD
20 USA
7934 MILLER
10 CANADA
14 rows selected.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

216

SQL> SELECT * FROM DEPT;


DEPTNO DNAME
LOC
---------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS
BOSTON
SQL> SELECT EMPNO,ENAME
2 FROM EMP E
3 ORDER BY (SELECT
4 DNAME FROM DEPT D
5 WHERE E.DEPTNO=D.DEPTNO);
EMPNO ENAME
---------- ---------7782 CLARK
7839 KING
7934 MILLER
7369 SMITH
7876 ADAMS
7902 FORD
7788 SCOTT
7566 JONES
7499 ALLEN
7698 BLAKE
7654 MARTIN
7900 JAMES
7844 TURNER
7521 WARD
14 rows selected.
CORRELATED SUBQUERY:
FINDING EMPLOYEES WHOSE SAL IS GREATER THAN AVG(SAL) OF THEIR
DEPARTMENT.
SQL> SELECT ENAME,SAL,DEPTNO FROM EMP E
2 WHERE SAL > (SELECT AVG(SAL) FROM EMP
3 WHERE DEPTNO=E.DEPTNO);
ENAME

SAL

DEPTNO

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

217

---------- ---------- ---------ALLEN


1600
30
JONES
2975
20
BLAKE
2850
30
SCOTT
KING
FORD

3000
5000
3000

20
10
20

6 rows selected.
FINDING EMPLOYEES WHOSE SAL IS GREATER THAN MIN(SAL) OF THEIR
DEPARTMENT.
1 SELECT ENAME,SAL,DEPTNO FROM EMP E
2 WHERE SAL > (SELECT MIN(SAL) FROM EMP
3* WHERE DEPTNO=E.DEPTNO)
SQL> /
ENAME
SAL DEPTNO
---------- ---------- ---------ALLEN
1600
30
WARD
1250
30
JONES
2975
20
MARTIN
1250
30
BLAKE
2850
30
CLARK
2450
10
SCOTT
3000
20
KING
5000
10
TURNER
1500
30
ADAMS
1100
20
FORD
3000
20
11 rows selected.
EXISTS:
FIND EMPLOYEES WHO HAVE ATLEAT ONE PERSON REPORTING TO
THEM.
1 SELECT EMPNO,ENAME,JOB,DEPTNO FROM EMP E
2 WHERE EXISTS
3* (SELECT 'X' FROM EMP WHERE MGR=E.EMPNO)
SQL> /
EMPNO ENAME
JOB
DEPTNO
---------- ---------- --------- ---------7566 JONES
MANAGER
20
7698 BLAKE
MANAGER
30
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
7782 CLARK
MANAGER
7788 SCOTT ANALYST
7839 KING
PRESIDENT
7902 FORD
ANALYST

218

10
20
10
20

6 rows selected.
THE SAME QUERY WITH IN:
1 SELECT EMPNO,ENAME,JOB,DEPTNO
2 FROM EMP
3 WHERE EMPNO IN (SELECT MGR FROM EMP
4* WHERE MGR IS NOT NULL)
SQL> /
EMPNO ENAME
JOB
DEPTNO
---------- ---------- --------- ---------7566 JONES
MANAGER
20
7698 BLAKE
MANAGER
30
7782 CLARK
MANAGER
10
7788 SCOTT ANALYST
20
7839 KING
PRESIDENT
10
7902 FORD
ANALYST
20
6 rows selected.

NOT EXISTS:
FIND ALL THE DEPARTMENTS THAT DO NOT HAVE ANY EMPLOYEES:
SQL> SELECT DEPTNO,DNAME
2 FROM DEPT D
3 WHERE NOT EXISTS
4 (SELECT 'X' FROM EMP
5 WHERE DEPTNO=D.DEPTNO);
DEPTNO DNAME
---------- -------------40 OPERATIONS
SAME QUERY WITH NOT IN:
SQL> SELECT DEPTNO,DNAME FROM DEPT
2 WHERE DEPTNO NOT IN
3 (SELECT DEPTNO FROM EMP);

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

219

DEPTNO DNAME
---------- -------------40 OPERATIONS
INSERT WITH SUBQUERY:
1 INSERT INTO
2 (SELECT EMPNO,ENAME,JOB,DEPTNO FROM EMP)
3 VALUES
4* (100,'PAVAN','MANAGER',10)
SQL> /
1 row created.

INSERT WITH SUBQUERY WITH CHECK OPTION:


1 INSERT INTO
2 (SELECT EMPNO,ENAME,JOB,DEPTNO
3 FROM EMP WHERE DEPTNO=30 WITH CHECK OPTION)
4 VALUES
5* (100,'PAVAN','MANAGER',10)
SQL> /
INSERT INTO
*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation
1 INSERT INTO
2 (SELECT EMPNO,ENAME,JOB
3 FROM EMP WHERE DEPTNO=30 WITH CHECK OPTION)
4 VALUES
5* (100,'PAVAN','MANAGER')
SQL> /
INSERT INTO
*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

220

1 INSERT INTO
2 (SELECT EMPNO,ENAME,JOB,DEPTNO
3 FROM EMP WHERE DEPTNO=30 WITH CHECK OPTION)
4 VALUES
5* (101,'PAVAN','MANAGER',30)
SQL> /
1 row created.
DEFAULT:
SQL> CREATE TABLE SAMPLE
2 (EMPNO NUMBER(10),
3 ENAME VARCHAR2(10),
4 SAL NUMBER(10) DEFAULT 1000);
Table created.
SQL> INSERT INTO SAMPLE
2 VALUES
3 (1,'PAVAN',100);
1 row created.
1 INSERT INTO SAMPLE
2 VALUES
3* (1,'PAVAN',DEFAULT)
SQL> /
1 row created.
SQL> UPDATE SAMPLE
2 SET SAL = DEFAULT
3 WHERE EMPNO=1;
2 rows updated.
SQL> SELECT * FROM SAMPLE;
EMPNO ENAME
SAL
---------- ---------- ---------1 PAVAN
1000
1 PAVAN
1000

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

221

INTRODUCTION TO PL/SQL:
TILL NOW WE USED SQL TO QUERY DATABASE FOR DATA.SQL IS A FOUTH
GENERATION LANGUAGE.THIS MEANS THAT THE LANGUAGE DESCRIBES WHAT
SHOULD BE DONE, BUT NOT HOW TO DO IT.
FOR EXAMPLE :
DELETE FROM EMP WHERE JOB=CLERK;
HERE WE DONT KNOW HOW THE DATABASE ACTUALLY DETERMINES WHICH
EMPLOYEES ARE CLERKS. PROBABLY THE SERVER WILL LOOP THROUGH ALL THE
RECORDS IN SOME ORDERTO DETERMINE THE PROPER ENTRIES TO DELETE.BUT THE
DETAILS ARE HIDEN FROM US.
THIRD GENERATION LANGUAGES SUCH AS C OR COBOL, ARE MORE PROCEDURAL IN
NATURE. A PROGRAM IN A THIRD GENERATION LANGUAGE IMPLEMENTS STEP BY

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

222

STEP ALGORITHM TO SLOVE THE PROBLEM.FOR EXAMPLE WE ACCOMPLISH ABOVE


DELETE OPERATION LIKE THIS IN THIS 3 GL.
LOOP OVER EACH STUDENT RECORD
IF THIS RECORD HAS JOB = CLERK THEN
DELETE THIS RECORD;
END IF;
END LOOP;
OBJECT ORIENTED LANGUAGES SUCH AS C++ OR JAVA ARE ALSO THIRD GENERATION
LANGUAGES DO THE SAME AS C.
FOURTH GENERATION LANGUAGES SUCH AS SQL ARE FAIRLY SIMPLE COMPARED TO
THE 3RD GENARATION LANGUAGES AND HAVE FEWER COMMANDS.
HOW EVER IN SOME CASES PROCEDURAL CONSTRUCTS SUCH AS VARIABLES,
CONTROL STRUCTURES SUCH AS IF THEN ELSE STATEMENTS AND LOOPS AND
PROCEDURES AND FUCTIONS ETC ARE MORE USEFUL FOR DESIRED PROGRAM.
THIS IS WHERE PL/SQL COMES IN TO THE PICTURE. PL/SQL IS COMBINATION OF
POWER AND THE FLEXIBILITY OF SQL WITH THE PROCEDURAL CONSTRUCTS OF 3 RD
GENERATION LANGUAGES.
THE BASIC UNIT IN ANY PL/SQL PROGRAM IS A BLOCK.
THERE ARE TWO DIFFERENT KINDS OF BLOCKS:
ANONYMOUS BLOCK
NAMED BLOCK.
ANONYMOUS BLOCKS ARE GENERALLY CONSTRUCTED ONCE AND EXCECUTED
ONLY ONCE.THIS TYPE OF BLOCK IS OFTEN ISSUED FROM A CLIENT PROGRAM TO
CALL A SUBPROGRAM STORED IN THE DATABASE.
NAMED BLOCKS ARE BLOCKS THAT HAVE NAME ASSOCIATED WITH THEM.NAMED
BLOCKS FURTHER CLASSIFIED IN TO 3 TYPES
LABELED BLOCKS.
SUBPROGRAMS(STOREDPROCEDURE AND FUNCTION).
TRIGGERS.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

223

LABELED BLOCKS ARE ANONYMOUS BLOCKS ARE GENERALLY CONSTRUCTED ONCE


AND EXCECUTED ONLY ONCE.ARE USED SAME AS ANONYMOUS BLOCKS.
SUBPROGRAMS CONSISTS OF PROCEDURES AND FUNCTIONS. THEY CAN BE STORED
IN THE DATABASE AS STANDALONE OBJECTS.THEY GENERALLY DONT CHANGE
ONCE CONSTRUCTED.THEYCAN EXECUTED MANY TIMES.SUBPROGRAMS EXECUTED
EXPLICITLY VIA CALL TO PROCEDURE OR FUNCTION.
TRIGGERS CONSIST OF PL/SQL BLOCK.THEY ARE GENERALLY DONT CHANGE ONCE
THEY CONSTRUCTED AND EXECUTED MANY TIMES.TRIGGERS EXECUTED IMPLICTLY
WHENEVER TRIGGERING EVENT OCCURS.THE TRIGGERING EVENT MAY BE DML
STATEMENT OR DDL STATEMENT(CREATE OR DROP) OR DATABASE EVENT SUCH AS
START UP OR SHUTDOWN.
BASIC PL/SQL BLOCK:
DECLARE
DECLARATIVE SECTION IS HERE.WE DECLARE ALL VARIABLES ETC.
BEGIN
EXECUTABLE SECTION
CONSTRUCTS.

IS HERE.ALL SQL STATEMENTS AND PROCEDURAL

EXCEPTION
EXCEPTION SECTION HERE.ERRORS HANDLING STATEMENTS GOES HERE.
END;
DECLARE AND EXCEPTION IS OPTIONAL.THAT IS EVERY PL/SQL BLOCK SHOULD
HAVE BEGIN AND END.

DECLARING PL/SQL VARIABLES:


DECLARE
V_HIREDATE

DATE;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

224

V_DEPTNO

NUMBER(10) NOT NULL := 10;

V_LOC

VARCHAR2(10) := NEW YORK;

V_COMM

CONSTANT

V_SAL

NUMBER(10) DEFAULT 1000;

NUMBER :=1400;

ASSIGNING VALUES TO VARIABLES:


V_DEPTNO

NUMBER(10) NOT NULL := 10;

V_LOC

VARCHAR2(10) := NEW YORK;

BASE SCALAR DATATYPES:


VARCHAR2(MAX_LEN)
NUMBER(P,S);
DATE
CHAR(MAX_LEN)
LONG
LONG RAW
BOOLEAN
BINARY_INTEGER
PLS_INTEGER
DECLARE
V_JOB

VARCHAR2(10);

V_COUNT

NUMBER(2) :=0;

V_VALID

BOOLEAN NOT NULL := TRUE;

DECLARING VARIABLES WITH %TYPE ATTRIBUTES:


I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
V_ENAME

VARCHAR2(10);

V_JOB

EMP.JOB%TYPE;

225

THE ADVANTAGE OF DECLARING THIS TYPE IS FOR US NO NEED WORRY ABOUT THE
LENGH OF THE VARIABLES.V_JOB WILL BE DECLARED AS SAME SIZE OF EMP TABLE
JOB COLUMN.
ONLY THEVALUES TRUE,FALSE,NULL CAN BE ASSIGNED TO THE BOOLEAN VARIABLE.
DBMS_OUTPUT.PUT_LINE IS USED TO PRINT OUTPUT.
IN SQL*PLUS WE HAVE TO TYPE SET SERVEROUTPUT ON.
: THE BELOW PL/SQL BLOCK IS ANONYMOUS BLOCK
SQL> DECLARE
2 V_DEPTNO NUMBER(10);
3 V_LOC

VARCHAR2(10);

4 BEGIN
5 SELECT DEPTNO,LOC
6 INTO
7 V_DEPTNO,V_LOC
8 FROM DEPT
9 WHERE DNAME='SALES';
10 END;
11 /
PL/SQL procedure successfully completed.
SQL>1 DECLARE
2 V_DEPTNO NUMBER(10);
3 V_LOC

VARCHAR2(10);

4 BEGIN

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

226

5 SELECT DEPTNO,LOC
6 INTO
7 V_DEPTNO,V_LOC
8 FROM DEPT
9 WHERE DNAME='SALES';
10 DBMS_OUTPUT.PUT_LINE(V_DEPTNO || '

' || V_LOC);

11* END;
SQL> /
PL/SQL procedure successfully completed.
SQL> SET SERVEROUTPUT ON

SQL> /
30

CHICAGO

PL/SQL procedure successfully completed.


THE BELOW PL/SQL BLOCK IS LABELLED BLOCK:
<<LABELLED BLOCK>>
SQL> 1 DECLARE
2 V_DEPTNO DEPT.DEPTNO%TYPE;
3 V_LOC

DEPT.LOC%TYPE;

4 BEGIN
5 SELECT DEPTNO,LOC
6 INTO
7 V_DEPTNO,V_LOC
8 FROM DEPT
9 WHERE DNAME='SALES';

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
10 DBMS_OUTPUT.PUT_LINE(V_DEPTNO || '

227

' || V_LOC);

11* END;<<LABELLED BLOCK>>


SQL> /
30
CHICAGO
PL/SQL procedure successfully completed.

SQL> 1 DECLARE
2 V_DEPTNO EMP.DEPTNO%TYPE:=10;
3 V_SUM_SAL

EMP.SAL%TYPE;

4 BEGIN
5 SELECT SUM(SAL)
6 INTO
7 V_SUM_SAL
8 FROM EMP
9 WHERE DEPTNO=V_DEPTNO;
10 DBMS_OUTPUT.PUT_LINE(V_SUM_SAL);
11* END;
SQL> /
8750
PL/SQL procedure successfully completed.
INSERTING DATA:
BEGIN
INSERT INTO DEPT VALUES(50,COMPUTERS,MIAMI);
END;
UPDATING DATA:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

228

BEGIN
V_SAL_INCREASE

EMP.SAL%TYPE:=2000;

BEGIN
UPDATE EMP
SET SAL = SAL+V_SAL_INCREASE
WHERE JOB = ANALYST
END;

DELETING DATA:
DECLARE
V_DEPTNO

EMP.DEPTNO%TYPE :=10;

BEGIN
DELETE FROM EMP
WHERE DEPTNO=V_DEPTNO;
END;
CONTROLLING PL/SQL FLOW EXECUTION:
CONDITIONAL IF STATEMENTS:
IF BOOLEAN_EXPRESSION1 THEN
SEQUENCE_STATEMENTS;
ELSIF BOOLEAN_EXPRESSION1 THEN
SEQUENCE_STATEMENTS;
ELSE
SEQUENCE_STATEMENTS;
END IF;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

229

WHERE BOOLEAN_EXPRESSION IS ANY EXPRESSION THAT EVALUATES TO A


BOOLEAN VALUE.
THE ELSIF AND ELSE CLAUSES ARE OPTIONAL AND THERE CAN BE AS MANY ELSIF
CLAUSES ARE DESIRED.
EXAMPLE:
1 DECLARE
2 V_JOB EMP.JOB%TYPE;
3 BEGIN
4 SELECT JOB INTO V_JOB FROM EMP
5 WHERE EMPNO = & EMPLOYEE_NUMBER;
6 IF V_JOB = 'CLERK' THEN
7 DBMS_OUTPUT.PUT_LINE(V_JOB);
8 DBMS_OUTPUT.PUT_LINE('HIS SALARY INCREASES 10%');
9 ELSIF V_JOB = 'MANAGER' THEN
10 DBMS_OUTPUT.PUT_LINE(V_JOB);
11 DBMS_OUTPUT.PUT_LINE('HIS SALARY INCREASES 30%');
12 ELSIF V_JOB = 'SALESMAN' THEN
13 DBMS_OUTPUT.PUT_LINE(V_JOB);
14 DBMS_OUTPUT.PUT_LINE ('HIS SALARY INCREASES 20%');
15 ELSE
16 DBMS_OUTPUT.PUT_LINE (V_JOB);
17 DBMS_OUTPUT.PUT_LINE ('HIS SALARY INCREASES 0%');
18 END IF;
19* END;
20 /
Enter value for employee_number: 7369
CLERK

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

230

HIS SALARY INCREASES 10%


PL/SQL procedure successfully completed.
SQL> /
Enter value for employee_number: 7499
SALESMAN
HIS SALARY INCREASES 20%
PL/SQL procedure successfully completed.
SQL> /
Enter value for employee_number: 7566
MANAGER
HIS SALARY INCREASES 30%
PL/SQL procedure successfully completed.
SQL> /
Enter value for employee_number: 7788
ANALYST
HIS SALARY INCREASES 0%
PL/SQL procedure successfully completed.

CASE STATEMENT:
1

DECLARE

V_JOB EMP.JOB%TYPE;

BEGIN

SELECT JOB INTO V_JOB FROM EMP

5 WHERE EMPNO = & EMPLOYEE_NUMBER;


6 CASE V_JOB
7 WHEN 'CLERK' THEN
8 DBMS_OUTPUT.PUT_LINE(V_JOB);
9 DBMS_OUTPUT.PUT_LINE('HIS SALARY INCREASES 10%');

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

231

10 WHEN 'MANAGER' THEN


11 DBMS_OUTPUT.PUT_LINE(V_JOB);
12 DBMS_OUTPUT.PUT_LINE('HIS SALARY INCREASES 30%');
13 WHEN 'SALESMAN' THEN
14 DBMS_OUTPUT.PUT_LINE(V_JOB);
15 DBMS_OUTPUT.PUT_LINE('HIS SALARY INCREASES 20%');
16 ELSE
17 DBMS_OUTPUT.PUT_LINE(V_JOB);
18 DBMS_OUTPUT.PUT_LINE('HIS SALARY INCREASES 0%');
19 END CASE;
20* END;
SQL> /
Enter value for employee_number: 7369
CLERK
HIS SALARY INCREASES 10%
PL/SQL procedure successfully completed.
SQL> /
Enter value for employee_number: 7466
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 4
SQL> /
Enter value for employee_number: 7499
SALESMAN
HIS SALARY INCREASES 20%
PL/SQL procedure successfully completed.
SQL> /
Enter value for employee_number: 7566
MANAGER
HIS SALARY INCREASES 30%
PL/SQL procedure successfully completed.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

232

SQL> /
Enter value for employee_number: 7788
ANALYST
HIS SALARY INCREASES 0%
PL/SQL procedure successfully completed.
CASE STATEMENT WITH NO ELSE STATEMENT:
1 DECLARE
2 V_JOB EMP.JOB%TYPE;
3 BEGIN
4 SELECT JOB INTO V_JOB FROM EMP
5 WHERE EMPNO = & EMPLOYEE_NUMBER;
6 CASE V_JOB
7 WHEN 'CLERK' THEN
8 DBMS_OUTPUT.PUT_LINE(V_JOB);
9 DBMS_OUTPUT.PUT_LINE('HIS SALARY INCREASES 10%');
10 WHEN 'MANAGER' THEN
11 DBMS_OUTPUT.PUT_LINE(V_JOB);
12 DBMS_OUTPUT.PUT_LINE('HIS SALARY INCREASES 30%');
13 WHEN 'SALESMAN' THEN
14 DBMS_OUTPUT.PUT_LINE(V_JOB);
15 DBMS_OUTPUT.PUT_LINE('HIS
STATEMENT).

SALARY

INCREASES

20%');(HERE

NO

ELSE

16 END CASE;
17* END;
SQL> /
Enter value for employee_number: 7788
DECLARE
*
ERROR at line 1:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

233

ORA-06592: CASE not found while executing CASE statement


ORA-06512: at line 6
SQL> /
Enter value for employee_number: 7369
CLERK
HIS SALARY INCREASES 10%
PL/SQL procedure successfully completed.
CASE STATEMENT WITH LABEL:
1 DECLARE
2 V_JOB EMP.JOB%TYPE;
3 BEGIN
4 SELECT JOB INTO V_JOB FROM EMP
5 WHERE EMPNO = & EMPLOYEE_NUMBER;
6 <<MYCASE>>
7 CASE V_JOB
8 WHEN 'CLERK' THEN
9 DBMS_OUTPUT.PUT_LINE(V_JOB);
10 DBMS_OUTPUT.PUT_LINE('HIS SALARY INCREASES 10%');
11 WHEN 'MANAGER' THEN
12 DBMS_OUTPUT.PUT_LINE(V_JOB);
13 DBMS_OUTPUT.PUT_LINE('HIS SALARY INCREASES 30%');
14 WHEN 'SALESMAN' THEN
15 DBMS_OUTPUT.PUT_LINE(V_JOB);
16 DBMS_OUTPUT.PUT_LINE('HIS SALARY INCREASES 20%');
17 END CASE MYCASE;
18* END;
SQL> /
Enter value for employee_number: 7369
CLERK
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

234

HIS SALARY INCREASES 10%


PL/SQL procedure successfully completed.
CASESTATEMENT WITH NO TEST EXPRESSION:
1 DECLARE
2 V_JOB EMP.JOB%TYPE;
3 BEGIN
4 SELECT JOB INTO V_JOB FROM EMP
5 WHERE EMPNO = & EMPLOYEE_NUMBER;
6 CASE
7 WHEN V_JOB='CLERK' THEN
8 DBMS_OUTPUT.PUT_LINE(V_JOB);
9 DBMS_OUTPUT.PUT_LINE('HIS SALARY INCREASES 10%');
10 WHEN V_JOB='MANAGER' THEN
11 DBMS_OUTPUT.PUT_LINE(V_JOB);
12 DBMS_OUTPUT.PUT_LINE('HIS SALARY INCREASES 30%');
13 WHEN V_JOB='SALESMAN' THEN
14 DBMS_OUTPUT.PUT_LINE(V_JOB);
15 DBMS_OUTPUT.PUT_LINE('HIS SALARY INCREASES 20%');
16 ELSE
17 DBMS_OUTPUT.PUT_LINE(V_JOB);
18 DBMS_OUTPUT.PUT_LINE('HIS SALARY INCREASES 0%');
19 END CASE ;
20* END;
21 /
Enter value for employee_number: 7369
CLERK
HIS SALARY INCREASES 10%
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

235

PL/SQL procedure successfully completed.


SQL> /
Enter value for employee_number: 7788
ANALYST
HIS SALARY INCREASES 0%
PL/SQL procedure successfully completed.
LOGIC TABLES:
AND:
AND
TRUE
FALSE
NULL

TRUE
TRUE
FALSE
NULL

FALSE
FALSE
FALSE
FALSE

NULL
NULL
FALSE
NULL

OR:
OR
TRUE
FALSE
NULL

TRUE
TRUE
TRUE
TRUE

FALSE
TRUE
FALSE
NULL

NULL
TRUE
NULL
NULL

NOT:
NOT
TRUE
FALSE
NULL

FALSE
TRUE
NULL

ITERATIVECONTROL:

LOOP STATEMENTS
LOOPS REPEAT A STATEMENT OR SEQUENCE OF STATEMENTS MULTIPLE
TIMES.
THERE ARE THREE LOOPS TYPES:
BASIC LOOP
FOR LOOP
WHILE LOOP

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

236

BASIC LOOP:
1 DECLARE
2 V_COUNTER NUMBER(10):=0;
3 BEGIN
4 LOOP
5 DBMS_OUTPUT.PUT_LINE(V_COUNTER);
6 V_COUNTER := V_COUNTER+1;
7 IF V_COUNTER > 10 THEN
8

EXIT;

END IF;

10 END LOOP;
11* END;
SQL> /
0
1
2
3
4
5
6
7
8
9
10
PL/SQL procedure successfully completed.
1 DECLARE
2 V_COUNTER NUMBER(10):=0;
3 BEGIN
4 LOOP

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

237

5 DBMS_OUTPUT.PUT_LINE(V_COUNTER);
6 V_COUNTER := V_COUNTER+1;
7 EXIT WHEN V_COUNTER > 10;
8 END LOOP;
9* END;
SQL> /
0
1
2
3
4
5
6
7
8
9
10
PL/SQL procedure successfully completed.
FOR LOOP:
1 BEGIN
2 FOR I IN 1 .. 10 LOOP
3 DBMS_OUTPUT.PUT_LINE(I);
4 END LOOP;
5* END;
SQL> /
1
2
3
4
5
6
7
8
9
10

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

238

PL/SQL procedure successfully completed.


SQL>
1 BEGIN
2 FOR I IN REVERSE 1 .. 10 LOOP
3 DBMS_OUTPUT.PUT_LINE(I);
4 END LOOP;
5* END;
SQL> /
10
9
8
7
6
5
4
3
2
1
PL/SQL procedure successfully completed.
WHILE LOOP:
1 DECLARE
2 V_COUNTER NUMBER(10):=0;
3 V_NUM NUMBER(10):=10;
4 BEGIN
5 WHILE V_COUNTER < V_NUM LOOP
6 DBMS_OUTPUT.PUT_LINE(V_COUNTER);
7 V_COUNTER := V_COUNTER+1;
8 END LOOP;
9* END;
SQL> /

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

239

0
1
2
3
4
5
6
7

CURSORS:
IN ORDER TO PROCESS A SQL STATEMENT ORACLE WILL ALLOCATE AN AREA OF
MEMORY KNOWN AS THE CONTEXT AREA.
A CURSOR IS A HANDLE OR POINTER TO THE CONTEXT AREA.
THERE ARE TWO TYPES OF CURSORS.
IMPLICIT CURSORS.
EXPLICIT CURSORS.
THE ORACLE SERVER USES IMPLICIT CIRSORS TO PARSE AND EXECUTE YOUR SQL
STATEMENTS.
EXPLICIT CURSORS ARE EXPLICITLY DECLARED BY THE PROGRAMMER.
IMPLICIT CURSOR ATTRIBUTES:
USING IMPLICIT CURSOR ATTRIBUTES,YOU CAN TEST THE OUTCOME OF YOUR SQL
STATEMENTS.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
SQL %ISOPEN

SQL%FOUND

SQL%NOTFOUND

SQL%ROWCOUNT

240

THE
ORACLE
ENGINE
AUTOMATICALLY OPENS AND CLOSES
THE SQL CURSOR AFTER EXECUTING
ITS
ASSOCIATED
SELECT,INSERT,UPDATE OR DELETE
SQL
STATEMENT
HAS
BEEN
PROCESSED IN CASE OF IMPLICIT
CURSORS. THUS THE SQL%IS OPEN
ATTRIBUTE OF AN IMPLICIT CURSOR
CANNOT BE REFERENCES OUTSIDE OF
ITS SQL STATEMENT. AS A RESULT,SQL
%ISOPEN ALWAYS EVALUATES TO
FALSE.
BOOLEAN
ATTRIBUTE
THAT
EVALUATES
TO
TRUE,
IF
AN
INSERT,UPDATE OR DELETE AFFECTED
ONE OR MORE ROWS OR SELECT
STATEMENT RETURNS ONE OR MORE
ROWS.OTHERWISE IT EVALUATES TO
FALSE.
THE SYNTAX FOR ACCESSING THIS
ATTRIBUTE IS SQL%FOUND.
BOOLEAN
ATTRIBUTE
THAT
EVALUATES TO FALSE, IF AN
INSERT,UPDATE OR DELETE AFFECTED
ONE OR MORE ROWS OR SELECT
STATEMENT RETURNS ONE OR MORE
ROWS.OTHERWISE IT EVALUATES TO
TRUE.
THE SYNTAX FOR ACCESSING THIS
ATTRIBUTE IS SQL%NOTFOUND.
RETURNS THE NUMBER OF ROWS
AFFECTED BY AN INSERT,UPDATE OR
DELETE
OR
SELECT
INTO
STATEMENT.THE
SYNTAX
FOR
ACCESSING THIS ATTRIBUTE IS SQL
%ROWCOUNT.

SQL> VARIABLE ROW_DELETED VARCHAR2(30)


SQL> DECLARE
2 V_DEPTNO EMP.DEPTNO%TYPE :=10;
3 BEGIN
4 DELETE FROM EMP

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

241

5 WHERE DEPTNO=V_DEPTNO;
6 :ROW_DELETED :=(SQL%ROWCOUNT || 'ROWS DELETED');
7 END;
8 /
PL/SQL procedure successfully completed.
SQL> PRINT ROW_DELETED
ROW_DELETED
-------------------------------3ROWS DELETED
SQL> BEGIN
2 DELETE FROM DEPT1
3 WHERE DEPTNO=10;
4 IF SQL%FOUND THEN
5 DBMS_OUTPUT.PUT_LINE('DEPARTMENT SUCCESSFULLY DELTED');
6 END IF;
7 IF SQL%NOTFOUND THEN
8 DBMS_OUTPUT.PUT_LINE('DEPARTMENT NO DOES NOT EXSITS');
9 END IF;
10 END;
11 /
DEPARTMENT SUCCESSFULLY DELTED
PL/SQL procedure successfully completed.
1 BEGIN
2 DELETE FROM DEPT1
3 WHERE DEPTNO=10;
4 IF SQL%FOUND THEN

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

242

5 DBMS_OUTPUT.PUT_LINE('DEPARTMENT SUCCESSFULLY DELETED');


6 END IF;
7 IF SQL%NOTFOUND THEN
8 DBMS_OUTPUT.PUT_LINE('DEPARTMENT NO DOES NOT EXSITS');
9 END IF;
10* END;
11 /
DEPARTMENT NO DOES NOT EXSITS
PL/SQL procedure successfully completed.
SQL %ROWCOUNT:
1 DECLARE
2 ROWS_DELETED NUMBER(10);
3 BEGIN
4 DELETE FROM EMP1
5 WHERE DEPTNO=10;
6 ROWS_DELETED:=SQL%ROWCOUNT;
7 DBMS_OUTPUT.PUT_LINE('NO OF ROWS DELETED: ' ||ROWS_DELETED);
8* END;
SQL> /
NO OF ROWS DELETED: 3
PL/SQL procedure successfully completed.
PROCESSING THE EXPLICIT CURSORS:
THE FOUR PL/SQL STEPS NECESSARY FOR EXPLICIT CURSOR PROCESSING ARE AS
FOLLOWS:
DECLARE THE CURSOR.
OPEN THE CURSOR FOR QUERY.
FETCH THE RESULTS INTO PL/SQL VARIBALES.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

243

CLOSE THE CURSOR.


EXPLICIT CURSOR ATTRIBUTES:
%ROWCOUNT

%FOUND

%NOTFOUND

%IS OPEN

RETURNS THE NUMBER OF ROWS


FETCHED FROM THE ACTIVE SET. IT IS
SET TO ZERO WHEN THE CURSOR IS
OPENED.THE SYNTAX FOR ACCESSING
THIS
ATTRIBUTEIS
CURSORNAME
%FOUND.
BOOLEAN ATTRIBUTE THAT EVALUATES
TO TRUE IF THE LAST FETCH
SUCCEEDED BECAUSE A ROW WAS
AVALIABLE; OR TO FALSE IF THE LAST
FETCH FAILED BECAUSE NO MORE
ROWS WERE AVALIABLE.
THE SYNTAX FOR ACCESSING THIS
ATTRIBUTEIS CURSORNAME%FOUND.
BOOLEAN ATTRIBUTE THAT EVALUATES
TO FALSE IF THE LAST FETCH
SUCCEEDED BECAUSE A ROW WAS
AVALIABLE; OR TO TRUE IF THE LAST
FETCH FAILED BECAUSE NO MORE
ROWS WERE AVALIABLE.
THE SYNTAX FOR ACCESSING THIS
ATTRIBUTE
IS
CURSORNAME
%NOTFOUND.
EVALUATES TO TRUE,IF AN EXPLICIT
CURSOR IS OPEN. OR TO FALSE, IF IT IS
CLOSED.THE SYNTAX FOR ACCESSING
THIS ATTRIBUTE IS CURSORNAME
%ISOPEN.

IN THE BELOW PL/SQL BLOCK ONLY ONE ROW RETURNS FROM SELECT
STATEMENT.
1 DECLARE
2 V_ENAME EMP.ENAME%TYPE;
3 V_JOB EMP.JOB%TYPE;
4 V_SAL EMP.SAL%TYPE;
5 BEGIN
6 SELECT ENAME,JOB,SAL INTO V_ENAME,V_JOB,V_SAL FROM EMP

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

244

7 WHERE EMPNO=&EMPLOYEE_NO;
8 DBMS_OUTPUT.PUT_LINE(V_ENAME||' '||V_JOB||' '||V_SAL);
9* END;
SQL> /
Enter value for employee_no: 7369
SMITH CLERK 800
PL/SQL procedure successfully completed.
THE BELOW PL/SQL BLOCK RETURNS MORE THAN ONE ROW.
1 DECLARE
2 V_ENAME EMP.ENAME%TYPE;
3 V_JOB EMP.JOB%TYPE;
4 V_SAL EMP.SAL%TYPE;
5 BEGIN
6 SELECT ENAME,JOB,SAL INTO V_ENAME,V_JOB,V_SAL FROM EMP
7 WHERE DEPTNO=&DEPARTMENT_NO;
8 DBMS_OUTPUT.PUT_LINE(V_ENAME||' '||V_JOB||' '||V_SAL);
9* END;
SQL> /
Enter value for department_no: 10
DECLARE
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 6
SLOVING THE ABOVE PROBLEM WITH CURSORS:
1 DECLARE
2 CURSOR C IS SELECT ENAME,JOB,SAL FROM EMP
3 WHERE DEPTNO=&DEPARTMENT_NO;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

245

4 V_ENAME EMP.ENAME%TYPE;
5 V_JOB EMP.JOB%TYPE;
6 V_SAL EMP.SAL%TYPE;
7 BEGIN
8 OPEN C;
9 LOOP
10 FETCH C INTO V_ENAME,V_JOB,V_SAL;
11 EXIT WHEN C%NOTFOUND;
12 DBMS_OUTPUT.PUT_LINE(V_ENAME||' '||V_JOB||' '||V_SAL);
13 END LOOP;
14* END;
SQL> /
Enter value for department_no: 10
CLARK MANAGER 2450
KING PRESIDENT 5000
MILLER CLERK 1300
PL/SQL procedure successfully completed.

1 SELECT EMPNO,ENAME,SAL FROM EMP1


2* WHERE DEPTNO=10
SQL> /
EMPNO
ENAME
--------- ---------- --------7782
CLARK
7839
KING
7934
MILLER

SAL
2450
5000
1300

1 DECLARE
2 V_EMPNO

EMP.EMPNO%TYPE;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
3 V_ENAME
4 V_SAL

246

EMP.ENAME%TYPE;
EMP.SAL%TYPE;

5 V_DEPTNO EMP.DEPTNO%TYPE:=10;
6 V_NO_ROWS NUMBER(5);
7
CURSOR EMP_CURSOR IS SELECT EMPNO,ENAME,SAL FROM EMP1 WHERE
DEPTNO=V_DEPTNO;
8 BEGIN
9 OPEN EMP_CURSOR;
10 LOOP
11 FETCH EMP_CURSOR INTO V_EMPNO,V_ENAME,V_SAL;
12 EXIT WHEN EMP_CURSOR%NOTFOUND;
13 DBMS_OUTPUT.PUT_LINE(V_EMPNO || '

' || V_ENAME || '

'||V_SAL);

14 END LOOP;
15 V_NO_ROWS := EMP_CURSOR%ROWCOUNT;
16 DBMS_OUTPUT.PUT_LINE('NO OF ROWS AFFECTED' || '

' || V_NO_ROWS);

17 CLOSE EMP_CURSOR;
18* END;
SQL> /
7782
CLARK
2450
7839
KING
5000
7934
MILLER
1300
NO OF ROWS AFFECTED
3
PL/SQL procedure successfully completed.
WORKINGWITH %ISOPEN CURSOR ATTRIBUTE:
1 DECLARE
2 V_EMPNO

EMP.EMPNO%TYPE;

3 V_ENAME

EMP.ENAME%TYPE;

4 V_SAL

EMP.SAL%TYPE;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

247

5 V_DEPTNO EMP.DEPTNO%TYPE:=10;
6 V_NO_ROWS NUMBER(5);
7
CURSOR EMP_CURSOR IS SELECT EMPNO,ENAME,SAL FROM EMP1 WHERE
DEPTNO=V_DEPTNO;
8 BEGIN
9 OPEN EMP_CURSOR;
10 IF EMP_CURSOR%ISOPEN THEN
11 LOOP
12 FETCH EMP_CURSOR INTO V_EMPNO,V_ENAME,V_SAL;
13 EXIT WHEN EMP_CURSOR%NOTFOUND;
14 DBMS_OUTPUT.PUT_LINE(V_EMPNO || '

' || V_ENAME || '

'||V_SAL);

15 END LOOP;
16 V_NO_ROWS := EMP_CURSOR%ROWCOUNT;
17 DBMS_OUTPUT.PUT_LINE('NO OF ROWS AFFECTED' || '

' || V_NO_ROWS);

18 END IF;
19 CLOSE EMP_CURSOR;
20* END;
SQL> /
7782
CLARK
2450
7839
KING
5000
7934
MILLER
1300
NO OF ROWS AFFECTED

PL/SQL procedure successfully completed.

WORKING WITH %FOUND CURSOR ATTRIBUTE:


SQL>

DECLARE

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
2

V_EMPNO

EMP.EMPNO%TYPE;

V_ENAME

EMP.ENAME%TYPE;

V_SAL

V_DEPTNO EMP.DEPTNO%TYPE:=10;

V_NO_ROWS NUMBER(5);

248

EMP.SAL%TYPE;

7
CURSOR EMP_CURSOR IS SELECT EMPNO,ENAME,SAL FROM EMP1 WHERE
DEPTNO=V_DEPTNO;
8 BEGIN
9

OPEN EMP_CURSOR;

10 IF EMP_CURSOR%ISOPEN THEN
11

LOOP

12

FETCH EMP_CURSOR INTO V_EMPNO,V_ENAME,V_SAL;

13 IF EMP_CURSOR%FOUND THEN
14

DBMS_OUTPUT.PUT_LINE(V_EMPNO || '

' || V_ENAME || '

'||V_SAL);

15 ELSE
16 EXIT;
17 END IF;
18 END LOOP;
19

V_NO_ROWS := EMP_CURSOR%ROWCOUNT;

20

DBMS_OUTPUT.PUT_LINE('NO OF ROWS AFFECTED' || '

21

END IF;

22

CLOSE EMP_CURSOR;

23

END;

' || V_NO_ROWS);

24 /
7782
7839

CLARK
KING

2450
5000

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
7934
MILLER
1300
NO OF ROWS AFFECTED

249

PL/SQL procedure successfully completed.

WORKINGWITH%NOTFOUNDCURSOR ATTRIBUTE:
SQL>

DECLARE

V_EMPNO

EMP.EMPNO%TYPE;

V_ENAME

EMP.ENAME%TYPE;

V_SAL

V_DEPTNO EMP.DEPTNO%TYPE:=10;

V_NO_ROWS NUMBER(5);

EMP.SAL%TYPE;

7
CURSOR EMP_CURSOR IS SELECT EMPNO,ENAME,SAL FROM EMP1 WHERE
DEPTNO=V_DEPTNO;
8

BEGIN
9

OPEN EMP_CURSOR;

10 IF EMP_CURSOR%ISOPEN THEN
11

LOOP

12

FETCH EMP_CURSOR INTO V_EMPNO,V_ENAME,V_SAL;

13 IF EMP_CURSOR%NOTFOUND THEN
14 EXIT;
15 ELSE
16 DBMS_OUTPUT.PUT_LINE(V_EMPNO || '

' || V_ENAME || '

'||V_SAL);

17 END IF;
18 END LOOP;
19

V_NO_ROWS := EMP_CURSOR%ROWCOUNT;

20

DBMS_OUTPUT.PUT_LINE('NO OF ROWS AFFECTED' || '

I Soft Solutions ,Bang-54.

' || V_NO_ROWS);

STRUCTURED QUERY LANGUAGE

ORACLE
21

END IF;

22

CLOSE EMP_CURSOR;

23

END;

250

24 /
7782
7839
7934

CLARK
2450
KING
5000
MILLER
1300

NO OF ROWS AFFECTED

PL/SQL procedure successfully completed.


WORKING WITH WHILE LOOP IN CURSORS:

DECLARE

V_EMPNO

EMP.EMPNO%TYPE;

V_ENAME

EMP.ENAME%TYPE;

V_SAL

V_DEPTNO EMP.DEPTNO%TYPE:=10;

V_NO_ROWS NUMBER(5);

EMP.SAL%TYPE;

7
CURSOR EMP_CURSOR IS SELECT EMPNO,ENAME,SAL FROM EMP1 WHERE
DEPTNO=V_DEPTNO;
8

BEGIN
9

OPEN EMP_CURSOR;

10 IF EMP_CURSOR%ISOPEN THEN
11

FETCH EMP_CURSOR INTO V_EMPNO,V_ENAME,V_SAL;

12 WHILE EMP_CURSOR%FOUND LOOP


13 DBMS_OUTPUT.PUT_LINE(V_EMPNO || '

' || V_ENAME || '

'||V_SAL);

14 FETCH EMP_CURSOR INTO V_EMPNO,V_ENAME,V_SAL;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

251

15 END LOOP;
16

V_NO_ROWS := EMP_CURSOR%ROWCOUNT;

17

DBMS_OUTPUT.PUT_LINE('NO OF ROWS AFFECTED' || '

18

END IF;

19

CLOSE EMP_CURSOR;

' || V_NO_ROWS);

20* END;
21 /
7782
7839
7934

CLARK
2450
KING
5000
MILLER
1300

NO OF ROWS AFFECTED

PL/SQL procedure successfully completed.


WORKING WITH FOR LOOP IN CURSORS:
1

DECLARE

V_EMPNO

EMP.EMPNO%TYPE;

V_ENAME

EMP.ENAME%TYPE;

V_SAL

V_DEPTNO EMP.DEPTNO%TYPE:=10;

V_NO_ROWS NUMBER(5);

EMP.SAL%TYPE;

7
CURSOR EMP_CURSOR IS SELECT EMPNO,ENAME,SAL FROM EMP1 WHERE
DEPTNO=V_DEPTNO;
8

BEGIN

9 FOR V_S IN EMP_CURSOR LOOP


10 DBMS_OUTPUT.PUT_LINE(V_S.EMPNO || '

' || V_S.ENAME || '

'||V_S.SAL);

11 V_NO_ROWS :=EMP_CURSOR%ROWCOUNT;
12 END LOOP;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

252

13 DBMS_OUTPUT.PUT_LINE('NO OF ROWS AFFECTED' || '

' || V_NO_ROWS);

14* END;
15 /
7782
7839
7934

CLARK
2450
KING
5000
MILLER
1300

NO OF ROWS AFFECTED

PL/SQL procedure successfully completed.

8
9
PL/SQL procedure successfully completed.

EXCEPTION HANDLING:
1

DECLARE

V_EMPNO NUMBER(10);

V_ENAME VARCHAR2(10);

4 V_SAL NUMBER(10);
5

V_DEPTNO NUMBER(10);

BEGIN

V_DEPTNO := &DEPARTMENT_NO;

SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL


FROM EMP WHERE

DEPTNO=V_DEPTNO;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

253

9 DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME||V_SAL);
10* END;
SQL> /
Enter value for department_no: 10/
DECLARE
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 8

HANDLING EXCEPTION WITH


EXCEPTION HANDLER:
1 DECLARE
2 V_EMPNO NUMBER(10);
3 V_ENAME VARCHAR2(10);
4 V_SAL NUMBER(10);
5 V_DEPTNO NUMBER(10);
6 BEGIN
7 V_DEPTNO := &DEPARTMENT_NO;
9

SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL


FROM EMP WHERE DEPTNO=V_DEPTNO;

10 DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME||V_SAL);
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

254

11 EXCEPTION
11 WHEN NO_DATA_FOUND THEN
12 DBMS_OUTPUT.PUT_LINE('DEPRTMENT NO:'||V_DEPTNO||
'IS NOT PRESENT IN THE EMPTABLE');
13 WHEN TOO_MANY_ROWS THEN
14 DBMS_OUTPUT.PUT_LINE('DEPRTMENT NO:'||V_DEPTNO||
'IS RETRIVING MORE THAN ONE ROW');
15* END;
/
16 /
Enter value for department_no: 10
DEPRTMENT NO:10IS RETRIVING MORE THAN ONE ROW
PL/SQL procedure successfully completed.
1 DECLARE
2 V_EMPNO NUMBER(10);
3 V_ENAME VARCHAR2(10);
4 V_SAL NUMBER(10);
5 V_DEPTNO NUMBER(10);
6 BEGIN
7 V_DEPTNO := &DEPARTMENT_NO;
8
9

SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL


FROM EMP WHERE DEPTNO=V_DEPTNO;

9 DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME||V_SAL);
10 EXCEPTION
11 WHEN TOO_MANY_ROWS THEN
12 DBMS_OUTPUT.PUT_LINE('DEPRTMENT NO:'||V_DEPTNO||
13 'IS RETRIVING MORE THAN ONE ROW');
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

255

13* END;
SQL> /
Enter value for department_no: 1
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 8
1 DECLARE
2 V_EMPNO NUMBER(10);
3 V_ENAME VARCHAR2(10);
4 V_SAL NUMBER(10);
5 V_DEPTNO NUMBER(10);
6 BEGIN
7 V_DEPTNO := &DEPARTMENT_NO;
8
9

SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL


FROM EMP WHERE DEPTNO=V_DEPTNO;

9 DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME||V_SAL);
10 EXCEPTION
11 WHEN NO_DATA_FOUND THEN
12 DBMS_OUTPUT.PUT_LINE('DEPRTMENT NO:'||V_DEPTNO||
13 'IS NOT PRESENT IN THE EMPTABLE');
13 WHEN TOO_MANY_ROWS THEN
14 DBMS_OUTPUT.PUT_LINE('DEPRTMENT NO:'||V_DEPTNO||
15 'IS RETRIVING MORE THAN ONE ROW');
15* END;
SQL> /
Enter value for department_no: 1
DEPRTMENT NO:1 IS NOT PRESENT IN THE EMPTABLE
PL/SQL procedure successfully completed.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

256

SQL> CREATE TABLE DEPARTMENT


2 AS
3 SELECT * FROM DEPT;
Table created.
SQL> SELECT * FROM DEPARTMENT;
DEPTNO
DNAME
LOC
---------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS
BOSTON
SQL> ALTER TABLE DEPARTMENT
2 ADD CONSTRAINT DEPT_PK PRIMARY KEY(DEPTNO);
Table altered.

DECLARE

V_DEPTNO NUMBER(10);

V_DNAME VARCHAR2(10);

V_LOC VARCHAR2(10);

BEGIN

V_DEPTNO := &DEPARTMENT_NO;

V_DNAME

:='&DEPARTMENT_NAME';

V_LOC

:='&LOC';

9 INSERT INTO DEPARTMENT VALUES (V_DEPTNO,V_DNAME,V_LOC);


10* END;
SQL> /
Enter value for department_no: 10
Enter value for department_name: COMPUTERS
Enter value for loc: MIAMI
DECLARE
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.DEPT_PK) violated
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

257

ORA-06512: at line 9
1

DECLARE

V_DEPTNO NUMBER(10);

V_DNAME VARCHAR2(10);

V_LOC VARCHAR2(10);

BEGIN

V_DEPTNO := &DEPARTMENT_NO;

V_DNAME

:='&DEPARTMENT_NAME';

V_LOC

:='&LOC';

9 INSERT INTO DEPARTMENT VALUES (V_DEPTNO,V_DNAME,V_LOC);


10 EXCEPTION
11 WHEN DUP_VAL_ON_INDEX THEN
12 DBMS_OUTPUT.PUT_LINE('DEPARTMENT NO:'||' '||V_DEPTNO|| 'IS ALREADY
ENTERED IN THE DEPARTMENT TABLE');
13* END;
SQL> /
Enter value for department_no: 10
Enter value for department_name: COMPUTERS
Enter value for loc: MIAMI
DEPARTMENT NO: 10 IS ALREADY ENTERED IN THE DEPARTMENT TABLE
PL/SQL procedure successfully completed.
1

DECLARE

V_DEPTNO NUMBER(10);

V_DNAME VARCHAR2(10);

V_LOC VARCHAR2(10);

BEGIN

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
6
7

V_DEPTNO := &DEPARTMENT_NO;
V_DNAME :='&DEPARTMENT_NAME';

V_LOC

258

:='&LOC';

9 INSERT INTO DEPARTMENT VALUES (V_DEPTNO,V_DNAME,V_LOC);


10 EXCEPTION
11 WHEN DUP_VAL_ON_INDEX THEN
12 DBMS_OUTPUT.PUT_LINE('DEPARTMENT NO:'||' '||V_DEPTNO|| 'IS ALREADY
ENTERED IN THE DEPARTMENT TABLE');
13* END;
14 /
Enter value for department_no: 10
Enter value for department_name: COMPUTERS & TECHNOLOGY
Enter value for loc: MIAMI
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 7

DECLARE

V_DEPTNO NUMBER(10);

V_DNAME VARCHAR2(10);

V_LOC VARCHAR2(10);

BEGIN

V_DEPTNO := &DEPARTMENT_NO;

V_DNAME

:='&DEPARTMENT_NAME';

V_LOC

:='&LOC';

9 INSERT INTO DEPARTMENT VALUES (V_DEPTNO,V_DNAME,V_LOC);


10 EXCEPTION
11 WHEN DUP_VAL_ON_INDEX THEN

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

259

12 DBMS_OUTPUT.PUT_LINE('DEPARTMENT NO:'||' '||V_DEPTNO|| 'IS ALREADY


ENTERED IN THE DEPARTMENT TABLE');

13 WHEN VALUE_ERROR THEN


14 DBMS_OUTPUT.PUT_LINE('DATA TYPE OR DATA SIZE INVALID');
15* END;
16 /
Enter value for department_no: 10
Enter value for department_name: COMPUTERS & TECHNOLOGY
Enter value for loc: MIAMI
DATA TYPE OR DATA SIZE INVALID
PL/SQL procedure successfully completed.
RAISE STATEMENT:
SQL> CREATE TABLE BANK_TRANS
2 (ACC_NO NUMBER(10),
3 CURRBAL NUMBER(10))
4 /
Table created.
SQL> INSERT INTO BANK_TRANS
2 VALUES
3 (1,1000)
4 /
1 row created.
SQL> ED
Wrote file afiedt.buf
1 INSERT INTO BANK_TRANS
2 VALUES
3* (2,2000)
SQL> /

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

260

1 row created.
SQL> ED
Wrote file afiedt.buf
1 INSERT INTO BANK_TRANS
2 VALUES
3* (3,3000)
SQL> /
1 row created.
SQL> ED
Wrote file afiedt.buf
1 DECLARE
2 V_ACCNO NUMBER(10);
3 V_CURRBAL NUMBER(10);
4 V_WITHDRAWAMT NUMBER(10);
5 MORE_THAN_BAL EXCEPTION;
6 BEGIN
7 V_ACCNO := &ACCOUNT_NO;
8
9

SELECT ACC_NO,CURRBAL INTO V_ACCNO,V_CURRBAL


FROM BANK_TRANS;

9 WHERE ACC_NO=V_ACCNO;
10 V_WITHDRAWAMT := &WITHDRAWAMT;
11 IF V_WITHDRAWAMT > V_CURRBAL THEN
12 RAISE MORE_THAN_BAL;
13 ELSE
14 DBMS_OUTPUT.PUT_LINE('YOU SUCCESSFULLY WITHDRAWN AMOUNT');
15 END IF;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

261

16 EXCEPTION
17 WHEN MORE_THAN_BAL THEN
18
19
20
21

DBMS_OUTPUT.PUT_LINE('ATTEMPTED TO WITH
DRAW MORE THAN THE CURRENT BALANCE'
|| ' '|| V_CURRBAL ||' ' || ' FROM THE ACCOUNT NUMBER' || '
' || V_ACCNO);

20* END;
21 /
Enter value for account_no: 1
Enter value for withdrawamt: 500
YOU SUCCESSFULLY WITHDRAWN AMOUNT
PL/SQL procedure successfully completed.
SQL> /
Enter value for account_no: 2
Enter value for withdrawamt: 3000
ATTEMPTED TO WITH DRAW MORE THAN THE CURRENT
BALANCE 2000 FROM THE ACCOUNT NUMBER 2
PL/SQL procedure successfully completed.
PRAGMA EXCEPTION_INIT:
1 DECLARE
2 V_EMPNO NUMBER(10);
3 V_ENAME VARCHAR2(10);
4 V_SAL NUMBER(10);
5 V_DEPTNO NUMBER(10);

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

262

6 BEGIN
7 V_DEPTNO := &DEPARTMENT_NO;
8
9

SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL


FROM EMP WHERE DEPTNO=V_DEPTNO;

9 DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME||V_SAL);
10* END;
11 /
Enter value for department_no: 10
DECLARE
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 8
1 DECLARE
2 V_EMPNO NUMBER(10);
3 V_ENAME VARCHAR2(10);
4 V_SAL NUMBER(10);
5 V_DEPTNO NUMBER(10);
6 E_TOOOOMANYROWS EXCEPTION;
7 PRAGMA EXCEPTION_INIT(E_TOOOOMANYROWS,-1422);
8 BEGIN
9 V_DEPTNO := &DEPARTMENT_NO;
10 SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL
11 FROM EMP WHERE DEPTNO=V_DEPTNO;
11 DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME||V_SAL);
12 EXCEPTION
13 WHEN E_TOOOOMANYROWS THEN
13 DBMS_OUTPUT.PUT_LINE('THE DEPTNO '||V_DEPTNO ||'
14 ' || 'FETCHING MORE THAN ONE ROW');

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

263

15* END;
SQL> /
Enter value for department_no: 10
THE DEPTNO 10 FETCHING MORE THAN ONE ROW
PL/SQL procedure successfully completed.

1 DECLARE
2 V_EMPNO NUMBER(10);
3 V_ENAME VARCHAR2(10);
4 V_SAL NUMBER(10);
5 V_DEPTNO NUMBER(10);
6 E_TOOOOMANYROWS EXCEPTION;
7 PRAGMA EXCEPTION_INIT(E_TOOOOMANYROWS,-1421);
8 BEGIN
9 V_DEPTNO := &DEPARTMENT_NO;
10 SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL
11 FROM EMP WHERE DEPTNO=V_DEPTNO;
11 DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME||V_SAL);
12 EXCEPTION
13 WHEN E_TOOOOMANYROWS THEN
15 DBMS_OUTPUT.PUT_LINE('THE DEPTNO '||V_DEPTNO ||'
16 ' || 'FETCHING MORE THAN ONE ROW');
15* END;
SQL> /
Enter value for department_no: 10

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

264

DECLARE
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 10

1 DECLARE
2 V_EMPNO NUMBER(10);
3 V_ENAME VARCHAR2(10);
4 V_SAL NUMBER(10);
5 V_DEPTNO NUMBER(10);
6 BEGIN
7 V_DEPTNO := &DEPARTMENT_NO;
8
9

SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL


FROM EMP WHERE DEPTNO=V_DEPTNO;

9 DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME||V_SAL);
10 EXCEPTION
11 WHEN TOO_MANY_ROWS THEN
12 DBMS_OUTPUT.PUT_LINE('THE DEPTNO
13 '||V_DEPTNO ||' ' || 'FETCHING MORE THAN ONE ROW');
13* END;
14 /
Enter value for department_no: 10
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

265

THE DEPTNO 10 FETCHING MORE THAN ONE ROW


PL/SQL procedure successfully completed.
WHEN OTHERS:
1 DECLARE
2 V_EMPNO NUMBER(10);
3 V_ENAME VARCHAR2(10);
4 V_SAL NUMBER(10);
5 V_DEPTNO NUMBER(10);
6 BEGIN
7 V_DEPTNO := &DEPARTMENT_NO;
8
9

SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL


FROM EMP WHERE DEPTNO=V_DEPTNO;

9 DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME||V_SAL);
10 EXCEPTION
11 WHEN TOO_MANY_ROWS THEN
12 DBMS_OUTPUT.PUT_LINE('THE DEPTNO '||V_DEPTNO ||'
13 ' || 'FETCHING MORE THAN ONE ROW');
13 WHEN OTHERS THEN
14 DBMS_OUTPUT.PUT_LINE('THE DEPTNO '||V_DEPTNO ||' '
15 || 'IS NOT PRESENT IN THE TABLE');
15* END;
SQL> /
Enter value for department_no: 10
THE DEPTNO 10 FETCHING MORE THAN ONE ROW
PL/SQL procedure successfully completed.
SQL> /

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

266

Enter value for department_no: 1


THE DEPTNO 1 IS NOT PRESENT IN THE TABLE
PL/SQL procedure successfully completed.

SQL CODE & SQLERRM:


SQL> DECLARE
2 V_EMPNO NUMBER(10);
3 V_ENAME VARCHAR2(10);
4 V_SAL NUMBER(10);
5 V_DEPTNO NUMBER(10);
6 V_ERRORCODE NUMBER(10);
7 V_ERRORTEXT VARCHAR2(255);
10 BEGIN
9 V_DEPTNO := &DEPARTMENT_NO;
11 SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL
12 FROM EMP WHERE DEPTNO=V_DEPTNO;
11 DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME||V_SAL);
12 EXCEPTION
13 WHEN TOO_MANY_ROWS THEN
13 DBMS_OUTPUT.PUT_LINE('THE DEPTNO '||V_DEPTNO ||' '
14 || 'FETCHING MORE THAN ONE ROW');
15 WHEN OTHERS THEN
16 V_ERRORCODE:=SQLCODE;
17 V_ERRORTEXT:=SQLERRM;
18 DBMS_OUTPUT.PUT_LINE(V_ERRORCODE || V_ERRORTEXT);

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

267

19 END;
20 /
Enter value for department_no: 10
THE DEPTNO 10 FETCHING MORE THAN ONE ROW
PL/SQL procedure successfully completed.
1 DECLARE
2 V_EMPNO NUMBER(10);
3 V_ENAME VARCHAR2(10);
4 V_SAL NUMBER(10);
5 V_DEPTNO NUMBER(10);
6 V_ERRORCODE NUMBER(10);
7 V_ERRORTEXT VARCHAR2(255);
8 BEGIN
9

V_DEPTNO := &DEPARTMENT_NO;

10 SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL


11 FROM EMP WHERE DEPTNO=V_DEPTNO;
11 DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME||V_SAL);
12 EXCEPTION
13 WHEN TOO_MANY_ROWS THEN
15 DBMS_OUTPUT.PUT_LINE('THE DEPTNO '||V_DEPTNO ||' '
16 || 'FETCHING MORE THAN ONE ROW');
15 WHEN OTHERS THEN
16 V_ERRORCODE:=SQLCODE;
17 V_ERRORTEXT:=SQLERRM;
18 DBMS_OUTPUT.PUT_LINE(V_ERRORCODE || V_ERRORTEXT);
19* END;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

268

SQL> /
Enter value for department_no: 1
100ORA-01403: no data found
PL/SQL procedure successfully completed.
1 DECLARE
2 V_EMPNO NUMBER(10);
3 V_ENAME VARCHAR2(10);
4 V_SAL NUMBER(10);
5 V_DEPTNO NUMBER(10);
6 V_ERRORCODE NUMBER(10);
7 V_ERRORTEXT VARCHAR2(255);
8 BEGIN
9 V_DEPTNO := &DEPARTMENT_NO;
10 SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL
11 FROM EMP WHERE DEPTNO=V_DEPTNO;
11 DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME||V_SAL);
12 EXCEPTION
13 WHEN TOO_MANY_ROWS THEN
14 DBMS_OUTPUT.PUT_LINE('THE DEPTNO '||V_DEPTNO ||'
15 ' || 'FETCHING MORE THAN ONE ROW');
15 WHEN OTHERS THEN
16 V_ERRORCODE:=SQLCODE;
17 V_ERRORTEXT:=SQLERRM;
18 DBMS_OUTPUT.PUT_LINE(V_ERRORCODE);
19 DBMS_OUTPUT.PUT_LINE(V_ERRORTEXT);

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

269

20* END;
21 /
Enter value for department_no: 1
100
ORA-01403: no data found
PL/SQL procedure successfully completed.
1 DECLARE
2 V_EMPNO NUMBER(10);
3 V_ENAME VARCHAR2(10);
4 V_SAL NUMBER(10);
5 V_DEPTNO NUMBER(10);
6 V_ERRORCODE NUMBER(10);
7 V_ERRORTEXT VARCHAR2(255);
8 BEGIN
9 V_DEPTNO := &DEPARTMENT_NO;
10 SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL
11 FROM EMP WHERE DEPTNO=V_DEPTNO;
11 DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME||V_SAL);
12 EXCEPTION
13 WHEN OTHERS THEN
14 V_ERRORCODE:=SQLCODE;
15 V_ERRORTEXT:=SQLERRM;
16 DBMS_OUTPUT.PUT_LINE(V_ERRORCODE);
17 DBMS_OUTPUT.PUT_LINE(V_ERRORTEXT);
18* END;
19 /
Enter value for department_no: 10

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

270

-1422
ORA-01422: exact fetch returns more than requested number of rows
PL/SQL procedure successfully completed.
SQL> DECLARE
2 V_EMPNO NUMBER(10);
3 V_ENAME NUMBER(10);
4 V_SAL NUMBER(10);
5 V_DEPTNO NUMBER(10);
6 V_ERRORCODE NUMBER(10);
7 V_ERRORTEXT VARCHAR2(255);
8 BEGIN
9 V_EMPNO := &EMPLOYEE_NO;
10 SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL
11 FROM EMP WHERE EMPNO=V_EMPNO;
11 DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME||V_SAL);
12 EXCEPTION
13 WHEN OTHERS THEN
14 V_ERRORCODE:=SQLCODE;
15 V_ERRORTEXT:=SQLERRM;
16 DBMS_OUTPUT.PUT_LINE(V_ERRORCODE);
17 DBMS_OUTPUT.PUT_LINE(V_ERRORTEXT);
18 END;
19 /
Enter value for employee_no: 7369
-6502
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
PL/SQL procedure successfully completed.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
SQL>

271

DECLARE

V_ACCNO NUMBER(10);

V_CURRBAL NUMBER(10);

V_WITHDRAWAMT NUMBER(10);

5 V_ERRORCODE NUMBER(10);
6 V_ERRORTEXT VARCHAR2(255);
7 MORE_THAN_BAL EXCEPTION;
8

BEGIN

V_ACCNO := &ACCOUNT_NO;

10 SELECT ACC_NO,CURRBAL INTO V_ACCNO,V_CURRBAL


11 FROM BANK_TRANS;
11

WHERE ACC_NO=V_ACCNO;

12

V_WITHDRAWAMT := &WITHDRAWAMT;

13

IF V_WITHDRAWAMT > V_CURRBAL THEN

14

RAISE MORE_THAN_BAL;

15

ELSE

16

DBMS_OUTPUT.PUT_LINE('YOU SUCCESSFULLY WITHDRAWN AMOUNT');

17

END IF;

18

EXCEPTION

19

WHEN OTHERS THEN

20 V_ERRORCODE:=SQLCODE;
21 V_ERRORTEXT:=SQLERRM;
22 DBMS_OUTPUT.PUT_LINE(V_ERRORCODE);
23 DBMS_OUTPUT.PUT_LINE(V_ERRORTEXT);
24 END;
25 /
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

272

Enter value for account_no: 1


Enter value for withdrawamt: 2000
1
User-Defined Exception
PL/SQL procedure successfully completed.
RAISE_APPLICATION_ERROR:
USE CAN USE THE BUILT- IN FUNCTION RAISE_APPLICATION_ERROR
TO CREATE YOUR OWN ERROR MESSAGES, WHICH CAN BE MORE DESCRIPTIVE THAN
NAMED EXCEPTIONS.
RAISE_APPLICATION_ERROR(ERROR_NUMBER, ERROR_MESSAGE).
WHERE ERROR_NUMBER IS A VALUE BETWEEN 20,000 AND 20,999.
ERROR MESSAGE IS THE TEXT ASSOCIATED WITH THIS ERROR.
1 DECLARE
2 V_SAL NUMBER(10);
3 V_EMPNO NUMBER(10);
4 BEGIN
5 V_EMPNO:=&EMPLOYEE_NO;
6 SELECT SAL INTO V_SAL FROM EMP
7 WHERE EMPNO=V_EMPNO;
8 IF LENGTH(V_EMPNO) > 4 THEN
9 RAISE_APPLICATION_ERROR(-20000,'YOU CANNOT ENTER EMPNO
WITH MORE THAN 4 NUMBERS');
10 END IF;
11 DBMS_OUTPUT.PUT_LINE(V_SAL);
12 EXCEPTION
13 WHEN NO_DATA_FOUND THEN
14 RAISE_APPLICATION_ERROR(-20001,'THERE IS NO DATA FOR THE
EMPNO YOU ENTERED');

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

273

15* END;
SQL> /
Enter value for employee_no: 7369
PL/SQL procedure successfully completed.
SQL> SET SERVEROUTPUT ON
SQL> /
Enter value for employee_no: 7369
800
PL/SQL procedure successfully completed.
SQL> /
Enter value for employee_no: 99999
DECLARE
*
ERROR at line 1:
ORA-20001: THERE IS NO DATA FOR THE EMPNO YOU ENTERED
ORA-06512: at line 14
1 DECLARE
2 V_SAL NUMBER(10);
3 V_EMPNO NUMBER(10);
4 BEGIN
5 V_EMPNO:=&EMPLOYEE_NO;
6 IF LENGTH(V_EMPNO) > 4 THEN
7 RAISE_APPLICATION_ERROR(-20000,'YOU CANNOT ENTER EMPNO WITH MORE
THAN 4 NUMBERS');
8 END IF;
9 SELECT SAL INTO V_SAL FROM EMP
10 WHERE EMPNO=V_EMPNO;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

274

11 DBMS_OUTPUT.PUT_LINE(V_SAL);
12 EXCEPTION
13 WHEN NO_DATA_FOUND THEN
14 RAISE_APPLICATION_ERROR(-20001,'THERE IS NO DATA FOR THE EMPNO YOU
ENTERED');
15* END;
SQL> /
Enter value for employee_no: 7369
800
PL/SQL procedure successfully completed.
SQL> /
Enter value for employee_no: 9999
DECLARE
*
ERROR at line 1:
ORA-20001: THERE IS NO DATA FOR THE EMPNO YOU ENTERED
ORA-06512: at line 14
SQL> /
Enter value for employee_no: 99999
DECLARE
*
ERROR at line 1:
ORA-20000: YOU CANNOT ENTER EMPNO WITH MORE THAN 4 NUMBERS
ORA-06512: at line 7
PARAMETERISED CURSORS:
1 DECLARE
2 CURSOR C (V_DEPTNO NUMBER) IS SELECT EMPNO,ENAME
FROM EMP WHERE DEPTNO=V_DEPTNO;
3 V_EMPNO EMP.EMPNO%TYPE;
4 V_ENAME EMP.ENAME%TYPE;
5 BEGIN
6 OPEN C(10);

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

275

7 LOOP
8 FETCH C INTO V_EMPNO,V_ENAME;
9 EXIT WHEN C%NOTFOUND;
10 DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME);
11 END LOOP;
12* END;
SQL> /
7782CLARK
7839KING
7934MILLER
PL/SQL procedure successfully completed.
1 DECLARE
2 CURSOR C (V_DEPTNO NUMBER) IS SELECT EMPNO,ENAME
FROM EMP WHERE DEPTNO=V_DEPTNO;
3 V_EMPNO EMP.EMPNO%TYPE;
4 V_ENAME EMP.ENAME%TYPE;
5 BEGIN
6 OPEN C(&DEPTNO);
7 LOOP
8 FETCH C INTO V_EMPNO,V_ENAME;
9 EXIT WHEN C%NOTFOUND;
10 DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME);
11 END LOOP;
12* END;
SQL> /
Enter value for deptno: 10
7782CLARK
7839KING
7934MILLER
PL/SQL procedure successfully completed.
SQL> /
Enter value for deptno: 20
7369SMITH
7566JONES
7788SCOTT
7876ADAMS
7902FORD
PL/SQL procedure successfully completed.
SQL> /
Enter value for deptno: 30
7499ALLEN
7521WARD
7654MARTIN
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

276

7698BLAKE
7844TURNER
7900JAMES
PL/SQL procedure successfully completed.
1 DECLARE
2 CURSOR C (V_DEPTNO NUMBER) IS SELECT EMPNO,ENAME
FROM EMP WHERE DEPTNO=V_DEPTNO;
3 V_EMPNO EMP.EMPNO%TYPE;
4 V_ENAME EMP.ENAME%TYPE;
5 BEGIN
6 FOR V_FOR IN C(&DEPTNO) LOOP
7 DBMS_OUTPUT.PUT_LINE(V_FOR.EMPNO||V_FOR.ENAME);
8 END LOOP;
9* END;
10 /
Enter value for deptno: 10
7782CLARK
7839KING
7934MILLER
PL/SQL procedure successfully completed.
PARAMETERISED CURSORS WITH FOR LOOP:
1 DECLARE
2 CURSOR C (V_DEPTNO NUMBER) IS SELECT EMPNO,ENAME FROM EMP WHERE
DEPTNO=V_DEPTNO;
3 BEGIN
4 FOR V_FOR IN C(&DEPTNO) LOOP
5 DBMS_OUTPUT.PUT_LINE(V_FOR.EMPNO||V_FOR.ENAME);
6 END LOOP;
7* END;
SQL> /
Enter value for deptno: 10
7782CLARK
7839KING
7934MILLER
PL/SQL procedure successfully completed.
SQL> /
Enter value for deptno: 20
7369SMITH
7566JONES
7788SCOTT
7876ADAMS
7902FORD

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

277

PL/SQL procedure successfully completed.


SQL> /
Enter value for deptno: 30
7499ALLEN
7521WARD
7654MARTIN
7698BLAKE
7844TURNER
7900JAMES
PL/SQL procedure successfully completed.

PL/SQL RECORDS:
1 DECLARE
2 V_DEPTNO DEPT.DEPTNO%TYPE;
3 V_DNAME DEPT.DNAME%TYPE;
4 V_LOC

DEPT.LOC%TYPE;

5 BEGIN
6 SELECT DEPTNO,DNAME,LOC INTO V_DEPTNO,V_DNAME,V_LOC
7 FROM DEPT WHERE DEPTNO=&DEPTNO;
8 DBMS_OUTPUT.PUT_LINE(V_DEPTNO||V_DNAME||V_LOC);
9* END;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

278

10 /
Enter value for deptno: 10
PL/SQL procedure successfully completed.
SQL> SET SERVEROUTPUT ON
Enter value for deptno: 10
10ACCOUNTINGNEW YORK
PL/SQL procedure successfully completed.
SQL> /
Enter value for deptno: 20
20RESEARCHDALLAS
PL/SQL procedure successfully completed.
SQL> /
Enter value for deptno: 30
30SALESCHICAGO
PL/SQL procedure successfully completed.
SQL> /
Enter value for deptno: 40
40OPERATIONSBOSTON
PL/SQL procedure successfully completed.

DECLARING A RECORD TYPE:


1 DECLARE
2
3
4
5
6

TYPE DEPT_RECORD IS RECORD


(
V_DEPTNO DEPT.DEPTNO%TYPE,
V_DNAME DEPT.DNAME%TYPE,
V_LOC DEPT.LOC%TYPE);

7 DEPT_REC DEPT_RECORD;
8 BEGIN
9 SELECT DEPTNO,DNAME,LOC INTO DEPT_REC
10 FROM DEPT WHERE DEPTNO=&DEPTNO;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

279

11 DBMS_OUTPUT.PUT_LINE(DEPT_REC.V_DEPTNO||DEPT_REC.V_DNAME||
DEPT_REC.V_LOC);
12* END;
13 /
Enter value for deptno: 10
10ACCOUNTINGNEW YORK
PL/SQL procedure successfully completed.
SQL> /
Enter value for deptno: 20
20RESEARCHDALLAS
PL/SQL procedure successfully completed.
SQL> /
Enter value for deptno: 30
30SALESCHICAGO
PL/SQL procedure successfully completed.
SQL> /
Enter value for deptno: 40
40OPERATIONSBOSTON
PL/SQL procedure successfully completed.

1
2
3
4
5
6
7
8
9

DECLARE
TYPE DEPT_RECORD IS RECORD
(
V_DEPTNO DEPT.DEPTNO%TYPE,
V_DNAME DEPT.DNAME%TYPE,
V_LOC DEPT.LOC%TYPE);
DEPT_REC DEPT_RECORD;
BEGIN
SELECT DEPTNO,DNAME,LOC INTO DEPT_REC FROM DEPT;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

280

10 DBMS_OUTPUT.PUT_LINE(DEPT_REC.V_DEPTNO||DEPT_REC.V_DNAME||
DEPT_REC.V_LOC);
11* END;
SQL> /
DECLARE
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 9
USING CURSOR TO SLOVE THE ERROR:
1 DECLARE
2 CURSOR C IS SELECT DEPTNO,DNAME,LOC FROM DEPT;
3 TYPE DEPT_RECORD IS RECORD
4 (
5 V_DEPTNO DEPT.DEPTNO%TYPE,
6 V_DNAME DEPT.DNAME%TYPE,
7 V_LOC DEPT.LOC%TYPE);
8 DEPT_REC DEPT_RECORD;
9 BEGIN
10 OPEN C;
11 LOOP
12 FETCH C INTO DEPT_REC;
13 EXIT WHEN C%NOTFOUND;
14 DBMS_OUTPUT.PUT_LINE(DEPT_REC.V_DEPTNO||DEPT_REC.V_DNAME||
DEPT_REC.V_LOC);
15 END LOOP;
16 CLOSE C;
17* END;
18 /
10ACCOUNTINGNEW YORK
20RESEARCHDALLAS
30SALESCHICAGO
40OPERATIONSBOSTON
PL/SQL procedure successfully completed.

USING %ROWTYPE:
1 DECLARE

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

281

2 CURSOR C IS SELECT DEPTNO,DNAME,LOC FROM DEPT;


3 DEPT_REC DEPT%ROWTYPE;
4 BEGIN
5 OPEN C;
6 LOOP
7 FETCH C INTO DEPT_REC;
8 EXIT WHEN C%NOTFOUND;
9 DBMS_OUTPUT.PUT_LINE(DEPT_REC.DEPTNO||DEPT_REC.DNAME||DEPT_REC.LOC);
10 END LOOP;
11 CLOSE C;
12* END;
SQL> /
10ACCOUNTINGNEW YORK
20RESEARCHDALLAS
30SALESCHICAGO
40OPERATIONSBOSTON
PL/SQL procedure successfully completed.
1 DECLARE
2 CURSOR C IS SELECT * FROM DEPT;
3 DEPT_REC DEPT%ROWTYPE;
4 BEGIN
5 OPEN C;
6 LOOP
7 FETCH C INTO DEPT_REC;
8 EXIT WHEN C%NOTFOUND;
9 DBMS_OUTPUT.PUT_LINE(DEPT_REC.DEPTNO||DEPT_REC.DNAME||DEPT_REC.LOC);
10 END LOOP;
11 CLOSE C;
12* END;
SQL> /
10ACCOUNTINGNEW YORK
20RESEARCHDALLAS
30SALESCHICAGO
40OPERATIONSBOSTON
PL/SQL procedure successfully completed.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

282

1 DECLARE
2 CURSOR C IS SELECT * FROM EMP;
3 EMP_REC EMP%ROWTYPE;
4 BEGIN
5 OPEN C;
6 LOOP
7 FETCH C INTO EMP_REC;
8 EXIT WHEN C%NOTFOUND;
9 DBMS_OUTPUT.PUT_LINE(EMP_REC.EMPNO||EMP_REC.ENAME||EMP_REC.JOB||
10 EMP_REC.MGR||EMP_REC.HIREDATE||EMP_REC.SAL||
11 EMP_REC.COMM||EMP_REC.DEPTNO);
12 END LOOP;
13 CLOSE C;
14* END;
15 /
7369SMITHCLERK790217-DEC-8080020
7499ALLENSALESMAN769820-FEB-81160030030
7521WARDSALESMAN769822-FEB-81125050030
7566JONESMANAGER783902-APR-81297520
7654MARTINSALESMAN769828-SEP-811250140030
7698BLAKEMANAGER783901-MAY-81285030
7782CLARKMANAGER783909-JUN-81245010
7788SCOTTANALYST756619-APR-87300020
7839KINGPRESIDENT17-NOV-81500010
7844TURNERSALESMAN769808-SEP-811500030
7876ADAMSCLERK778823-MAY-87110020
7900JAMESCLERK769803-DEC-8195030
7902FORDANALYST756603-DEC-81300020
7934MILLERCLERK778223-JAN-82130010
PL/SQL procedure successfully completed.

PL/SQL TABLES:
1 DECLARE
2 TYPE NUMBERTAB IS TABLE OF NUMBER
3 INDEX BY BINARY_INTEGER;
4 V_NUMBERS NUMBERTAB;
5 BEGIN
FOR ASSIGNING VALUES:
6 FOR V_COUNT IN 1..10 LOOP
7 V_NUMBERS(V_COUNT) := V_COUNT*10;
8 END LOOP;
FOR RETRIVING VALUES FROM TABLE:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

283

9 FOR V_COUNT IN 1..10 LOOP


10 DBMS_OUTPUT.PUT_LINE(V_NUMBERS(V_COUNT));
11 END LOOP;
12* END;
13 /
10
20
30
40
50
60
70
80
90
100
PL/SQL procedure successfully completed.

1 DECLARE
2 TYPE NUMBERTAB IS TABLE OF NUMBER
3 INDEX BY BINARY_INTEGER;
4 V_NUMBERS NUMBERTAB;
5 BEGIN
6 FOR V_COUNT IN 1..10 LOOP
7 V_NUMBERS(V_COUNT) := V_COUNT*10;
8 END LOOP;
9 FOR V_COUNT IN 1..10 LOOP
10 DBMS_OUTPUT.PUT_LINE('V_NUMBERS('|| V_COUNT ||'):');
11 DBMS_OUTPUT.PUT_LINE(V_NUMBERS(V_COUNT));
12 END LOOP;
13* END;
14 /
V_NUMBERS(1):
10
V_NUMBERS(2):
20
V_NUMBERS(3):
30
V_NUMBERS(4):
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

284

40
V_NUMBERS(5):
50
V_NUMBERS(6):
60
V_NUMBERS(7):
70
V_NUMBERS(8):
80
V_NUMBERS(9):
90
V_NUMBERS(10):
100
PL/SQL procedure successfully completed.
SQL> ED
Wrote file afiedt.buf
1
2
3
4

DECLARE
TYPE NUMBERTAB IS TABLE OF NUMBER
INDEX BY BINARY_INTEGER;
V_NUMBERS NUMBERTAB;

5 BEGIN
6 FOR V_COUNT IN 1..10 LOOP
7 V_NUMBERS(V_COUNT) := V_COUNT*10;
8 END LOOP;
9 FOR V_COUNT IN 1..10 LOOP
10 DBMS_OUTPUT.PUT_LINE('V_NUMBERS('|| V_COUNT ||'):'||V_NUMBERS(V_COUNT));
11 END LOOP;
12* END;
13 /
V_NUMBERS(1):10
V_NUMBERS(2):20
V_NUMBERS(3):30
V_NUMBERS(4):40
V_NUMBERS(5):50
V_NUMBERS(6):60
V_NUMBERS(7):70
V_NUMBERS(8):80
V_NUMBERS(9):90
V_NUMBERS(10):100
PL/SQL procedure successfully completed.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

285

1 DECLARE
2 TYPE NUMBERTAB IS TABLE OF NUMBER
3 INDEX BY BINARY_INTEGER;
4 V_NUMBERS NUMBERTAB;
5 BEGIN
6 FOR V_COUNT IN 1..10 LOOP
7 V_NUMBERS(V_COUNT) := V_COUNT*10;
8 END LOOP;
9 FOR V_COUNT IN 1..10 LOOP
10 DBMS_OUTPUT.PUT_LINE('V_NUMBERS('|| V_COUNT ||'):'||V_NUMBERS(V_COUNT));
11 END LOOP;
12 DBMS_OUTPUT.PUT_LINE(V_NUMBERS.COUNT);
13 DBMS_OUTPUT.PUT_LINE(V_NUMBERS.FIRST);
14 DBMS_OUTPUT.PUT_LINE(V_NUMBERS.LAST);
15* END;
16 /
V_NUMBERS(1):10
V_NUMBERS(2):20
V_NUMBERS(3):30
V_NUMBERS(4):40
V_NUMBERS(5):50
V_NUMBERS(6):60
V_NUMBERS(7):70
V_NUMBERS(8):80
V_NUMBERS(9):90
V_NUMBERS(10):100
10
1
10
PL/SQL procedure successfully completed.
1 DECLARE
2 TYPE NUMBERTAB IS TABLE OF NUMBER
3 INDEX BY BINARY_INTEGER;
4 V_NUMBERS NUMBERTAB;
5 BEGIN
6 FOR V_COUNT IN 1..10 LOOP
7 V_NUMBERS(V_COUNT) := V_COUNT*10;
8 END LOOP;
9 FOR V_COUNT IN 1..10 LOOP
10 DBMS_OUTPUT.PUT_LINE('V_NUMBERS('|| V_COUNT ||'):'||V_NUMBERS(V_COUNT));
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

286

11 END LOOP;
12 DBMS_OUTPUT.PUT_LINE('NUMBER OF ELEMENTS IN TABLE: '||
V_NUMBERS.COUNT);
13 DBMS_OUTPUT.PUT_LINE('FIRST ELEMENT IN TABLE : ' ||V_NUMBERS.FIRST);
14 DBMS_OUTPUT.PUT_LINE('THE LAST ELEMENT IN TABLE : '||V_NUMBERS.LAST);
15* END;
SQL> /
V_NUMBERS(1):10
V_NUMBERS(2):20
V_NUMBERS(3):30
V_NUMBERS(4):40
V_NUMBERS(5):50
V_NUMBERS(6):60
V_NUMBERS(7):70
V_NUMBERS(8):80
V_NUMBERS(9):90
V_NUMBERS(10):100
NUMBER OF ELEMENTS IN TABLE: 10
FIRST ELEMENT IN TABLE : 1
THE LAST ELEMENT IN TABLE : 10
PL/SQL procedure successfully completed.
1 DECLARE
2 TYPE NUMBERTAB IS TABLE OF NUMBER
3 INDEX BY BINARY_INTEGER;
4 V_NUMBERS NUMBERTAB;
5 BEGIN
6 FOR V_COUNT IN 1..10 LOOP
7 V_NUMBERS(V_COUNT) := V_COUNT*10;
8 END LOOP;
9 FOR V_COUNT IN 1..10 LOOP
10 DBMS_OUTPUT.PUT_LINE('V_NUMBERS('|| V_COUNT ||'):'||V_NUMBERS(V_COUNT));
11 END LOOP;
12 DBMS_OUTPUT.PUT_LINE('NUMBER OF ELEMENTS IN TABLE: '||
V_NUMBERS.COUNT);
13 DBMS_OUTPUT.PUT_LINE('FIRST ELEMENT IN TABLE : ' ||V_NUMBERS.FIRST);
14 DBMS_OUTPUT.PUT_LINE('THE LAST ELEMENT IN TABLE : '||V_NUMBERS.LAST);
15 DBMS_OUTPUT.PUT_LINE('NUMBER OF ELEMENTS IN TABLE: '||
V_NUMBERS.COUNT);
16 DBMS_OUTPUT.PUT_LINE('VALUE OF THE FIRST ELEMENT IN TABLE : ' ||
V_NUMBERS(V_NUMBERS.FIRST));
17 DBMS_OUTPUT.PUT_LINE('VALUE OF THE LAST ELEMENT THE LAST ELEMENT IN
TABLE : '||V_NUMBERS(V_NUMBERS.LAST));
18* END;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

287

19 /
V_NUMBERS(1):10
V_NUMBERS(2):20
V_NUMBERS(3):30
V_NUMBERS(4):40
V_NUMBERS(5):50
V_NUMBERS(6):60
V_NUMBERS(7):70
V_NUMBERS(8):80
V_NUMBERS(9):90
V_NUMBERS(10):100
NUMBER OF ELEMENTS IN TABLE: 10
FIRST ELEMENT IN TABLE : 1
THE LAST ELEMENT IN TABLE : 10
NUMBER OF ELEMENTS IN TABLE: 10
VALUE OF THE FIRST ELEMENT IN TABLE : 10
VALUE OF THE LAST ELEMENT THE LAST ELEMENT IN TABLE : 100
PL/SQL procedure successfully completed.

1 DECLARE
2 TYPE NUMBERTAB IS TABLE OF NUMBER
3 INDEX BY BINARY_INTEGER;
4 V_NUMBERS NUMBERTAB;
5 BEGIN
6 FOR V_COUNT IN 1..10 LOOP
7 V_NUMBERS(V_COUNT) := V_COUNT*10;
8 END LOOP;
9 FOR V_COUNT IN 1..10 LOOP
10 DBMS_OUTPUT.PUT_LINE('V_NUMBERS('|| V_COUNT ||'):'||V_NUMBERS(V_COUNT));
11 END LOOP;
12 DBMS_OUTPUT.PUT_LINE(V_NUMBERS.PRIOR(3));
13* END;
14 /
V_NUMBERS(1):10
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

288

V_NUMBERS(2):20
V_NUMBERS(3):30
V_NUMBERS(4):40
V_NUMBERS(5):50
V_NUMBERS(6):60
V_NUMBERS(7):70
V_NUMBERS(8):80
V_NUMBERS(9):90
V_NUMBERS(10):100
2
PL/SQL procedure successfully completed.
1 DECLARE
2 TYPE NUMBERTAB IS TABLE OF NUMBER
3 INDEX BY BINARY_INTEGER;
4 V_NUMBERS NUMBERTAB;
5 BEGIN
6 FOR V_COUNT IN 1..10 LOOP
7 V_NUMBERS(V_COUNT) := V_COUNT*10;
8 END LOOP;
9 FOR V_COUNT IN 1..10 LOOP
10 DBMS_OUTPUT.PUT_LINE('V_NUMBERS('|| V_COUNT ||'):'||V_NUMBERS(V_COUNT));
11 END LOOP;
12 DBMS_OUTPUT.PUT_LINE('THE VALUE OF PRIOR: '||
V_NUMBERS(V_NUMBERS.PRIOR(3)));
13* END;
SQL> /
V_NUMBERS(1):10
V_NUMBERS(2):20
V_NUMBERS(3):30
V_NUMBERS(4):40
V_NUMBERS(5):50
V_NUMBERS(6):60
V_NUMBERS(7):70
V_NUMBERS(8):80
V_NUMBERS(9):90
V_NUMBERS(10):100
THE VALUE OF PRIOR: 20
PL/SQL procedure successfully completed.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

289

1 DECLARE
2 TYPE NUMBERTAB IS TABLE OF NUMBER
3 INDEX BY BINARY_INTEGER;
4 V_NUMBERS NUMBERTAB;
5 BEGIN
6 FOR V_COUNT IN 1..10 LOOP
7 V_NUMBERS(V_COUNT) := V_COUNT*10;
8 END LOOP;
9 FOR V_COUNT IN 1..10 LOOP
10 DBMS_OUTPUT.PUT_LINE('V_NUMBERS('|| V_COUNT ||'):'||V_NUMBERS(V_COUNT));
11 END LOOP;
12 DBMS_OUTPUT.PUT_LINE('THE VALUE OF PRIOR: '||
V_NUMBERS(V_NUMBERS.NEXT(3)));
13* END;
SQL> /
V_NUMBERS(1):10
V_NUMBERS(2):20
V_NUMBERS(3):30
V_NUMBERS(4):40
V_NUMBERS(5):50
V_NUMBERS(6):60
V_NUMBERS(7):70
V_NUMBERS(8):80
V_NUMBERS(9):90
V_NUMBERS(10):100
THE VALUE OF PRIOR: 40
PL/SQL procedure successfully completed.

1 DECLARE
2 TYPE NUMBERTAB IS TABLE OF NUMBER
3 INDEX BY BINARY_INTEGER;
4 V_NUMBERS NUMBERTAB;
5 BEGIN

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

290

6 FOR V_COUNT IN 1..10 LOOP


7 V_NUMBERS(V_COUNT) := V_COUNT*10;
8 END LOOP;
9 V_NUMBERS.DELETE;
10 FOR V_COUNT IN 1..10 LOOP
11 DBMS_OUTPUT.PUT_LINE('V_NUMBERS('|| V_COUNT ||'):'||V_NUMBERS(V_COUNT));
12 END LOOP;
13* END;
14 /
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 11
1 DECLARE
2 TYPE NUMBERTAB IS TABLE OF NUMBER
3 INDEX BY BINARY_INTEGER;
4 V_NUMBERS NUMBERTAB;
5 BEGIN
6 FOR V_COUNT IN 1..10 LOOP
7 V_NUMBERS(V_COUNT) := V_COUNT*10;
8 END LOOP;
9 V_NUMBERS.DELETE(8);
10 FOR V_COUNT IN 1..10 LOOP
11 DBMS_OUTPUT.PUT_LINE('V_NUMBERS('|| V_COUNT ||'):'||V_NUMBERS(V_COUNT));
12 END LOOP;
13* END;
SQL> /
V_NUMBERS(1):10
V_NUMBERS(2):20
V_NUMBERS(3):30
V_NUMBERS(4):40
V_NUMBERS(5):50
V_NUMBERS(6):60
V_NUMBERS(7):70
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

291

ORA-06512: at line 11
1 DECLARE
2 TYPE NUMBERTAB IS TABLE OF NUMBER
3 INDEX BY BINARY_INTEGER;
4 V_NUMBERS NUMBERTAB;
5 BEGIN
6 FOR V_COUNT IN 1..10 LOOP
7 V_NUMBERS(V_COUNT) := V_COUNT*10;
8 END LOOP;
9 V_NUMBERS.DELETE(4,6);
10 FOR V_COUNT IN 1..10 LOOP
11 DBMS_OUTPUT.PUT_LINE('V_NUMBERS('|| V_COUNT ||'):'||V_NUMBERS(V_COUNT));
12 END LOOP;
13* END;
SQL> /
V_NUMBERS(1):10
V_NUMBERS(2):20
V_NUMBERS(3):30
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 11
1 DECLARE
2 TYPE NUMBERTAB IS TABLE OF NUMBER
3 INDEX BY BINARY_INTEGER;
4 V_NUMBERS NUMBERTAB;
5 BEGIN
6 FOR V_COUNT IN 1..10 LOOP
7 V_NUMBERS(V_COUNT) := V_COUNT*10;
8 END LOOP;
9 V_NUMBERS.DELETE(4,6);
10 FOR V_COUNT IN 1..10 LOOP
11 DBMS_OUTPUT.PUT_LINE('V_NUMBERS('|| V_COUNT ||'):'||V_NUMBERS(V_COUNT));
12 END LOOP;
13 EXCEPTION
14 WHEN NO_DATA_FOUND THEN
15 FOR V_COUNT IN 7..10 LOOP
16 DBMS_OUTPUT.PUT_LINE('V_NUMBERS('|| V_COUNT ||'):'||V_NUMBERS(V_COUNT));
17 END LOOP;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

292

18* END;
SQL> /
V_NUMBERS(1):10
V_NUMBERS(2):20
V_NUMBERS(3):30
V_NUMBERS(7):70
V_NUMBERS(8):80
V_NUMBERS(9):90
V_NUMBERS(10):100
PL/SQL procedure successfully completed.
1 DECLARE
2 TYPE NUMBERTAB IS TABLE OF NUMBER
3 INDEX BY BINARY_INTEGER;
4 V_NUMBERS NUMBERTAB;
5 V_BOOL BOOLEAN;
6 BEGIN
7 FOR V_COUNT IN 1..10 LOOP
8 V_NUMBERS(V_COUNT) := V_COUNT*10;
9 END LOOP;
10 FOR V_COUNT IN 1..10 LOOP
11 DBMS_OUTPUT.PUT_LINE('V_NUMBERS('|| V_COUNT ||'):'||V_NUMBERS(V_COUNT));
12 END LOOP;
13 V_BOOL := V_NUMBERS.EXISTS(3);
14 IF V_BOOL THEN
15 DBMS_OUTPUT.PUT_LINE('THE ELEMENT EXISITS');
16 ELSE
17 DBMS_OUTPUT.PUT_LINE('THE ELEMENT NOT EXISITS');
18 END IF;
19* END;
SQL> /
V_NUMBERS(1):10
V_NUMBERS(2):20
V_NUMBERS(3):30
V_NUMBERS(4):40
V_NUMBERS(5):50
V_NUMBERS(6):60
V_NUMBERS(7):70
V_NUMBERS(8):80
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

293

V_NUMBERS(9):90
V_NUMBERS(10):100
THE ELEMENT EXISITS
PL/SQL procedure successfully completed.
1 DECLARE
2 TYPE NUMBERTAB IS TABLE OF NUMBER
3 INDEX BY BINARY_INTEGER;
4 V_NUMBERS NUMBERTAB;
5 V_BOOL BOOLEAN;
6 BEGIN
7 FOR V_COUNT IN 1..10 LOOP
8 V_NUMBERS(V_COUNT) := V_COUNT*10;
9 END LOOP;
10 FOR V_COUNT IN 1..10 LOOP
11 DBMS_OUTPUT.PUT_LINE('V_NUMBERS('|| V_COUNT ||'):'||V_NUMBERS(V_COUNT));
12 END LOOP;
13 V_BOOL := V_NUMBERS.EXISTS(&NUMBER);
14 IF V_BOOL THEN
15 DBMS_OUTPUT.PUT_LINE('THE ELEMENT EXISITS');
16 ELSE
17 DBMS_OUTPUT.PUT_LINE('THE ELEMENT NOT EXISITS');
18 END IF;
19* END;
SQL> /
Enter value for number: 1
V_NUMBERS(1):10
V_NUMBERS(2):20
V_NUMBERS(3):30
V_NUMBERS(4):40
V_NUMBERS(5):50
V_NUMBERS(6):60
V_NUMBERS(7):70
V_NUMBERS(8):80
V_NUMBERS(9):90
V_NUMBERS(10):100
THE ELEMENT EXISITS
PL/SQL procedure successfully completed.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

294

SQL> /
Enter value for number: 11
V_NUMBERS(1):10
V_NUMBERS(2):20
V_NUMBERS(3):30
V_NUMBERS(4):40
V_NUMBERS(5):50
V_NUMBERS(6):60
V_NUMBERS(7):70
V_NUMBERS(8):80
V_NUMBERS(9):90
V_NUMBERS(10):100
THE ELEMENT NOT EXISITS
PL/SQL procedure successfully completed.
1 DECLARE
2 TYPE CHARTAB IS TABLE OF VARCHAR2(10)
3 INDEX BY BINARY_INTEGER;
4 V_CHAR CHARTAB;
5 BEGIN
6 V_CHAR(1):='PAVAN';
7 V_CHAR(-2):='KUMAR';
8 V_CHAR(0) := 'GAYATRI';
9 DBMS_OUTPUT.PUT_LINE(V_CHAR(1));
10 DBMS_OUTPUT.PUT_LINE(V_CHAR(-2));
11 DBMS_OUTPUT.PUT_LINE(V_CHAR(0));
12* END;
13 /
PAVAN
KUMAR
GAYATRI
PL/SQL procedure successfully completed.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

295

1 DECLARE
2 TYPE DATETAB IS TABLE OF DATE
3 INDEX BY BINARY_INTEGER;
4 V_DATE DATETAB;
5 BEGIN
6 V_DATE(1):='01-DEC-05';
7 V_DATE(-2):='11-MAR-02';
8 V_DATE(0) :='01-DEC-09';
9 DBMS_OUTPUT.PUT_LINE(V_DATE(1));
10 DBMS_OUTPUT.PUT_LINE(V_DATE(-2));
11 DBMS_OUTPUT.PUT_LINE(V_DATE(0));
12* END;
SQL> /
01-DEC-05
11-MAR-02
01-DEC-09
PL/SQL procedure successfully completed.

PL/SQL TABLES WITH %ROWTYPE:


1 DECLARE
2 CURSOR C IS SELECT * FROM DEPT;
3 TYPE DEPT_TABLE_TYPE IS TABLE OF DEPT%ROWTYPE
4 INDEX BY BINARY_INTEGER;
5 DEPT_TABLE DEPT_TABLE_TYPE;
6 V_COUN NUMBER(10):=0;
7 BEGIN
8 OPEN C;
9 LOOP
10 V_COUN := V_COUN+1;
11 FETCH C INTO DEPT_TABLE(V_COUN);
12 EXIT WHEN C%NOTFOUND;
13 END LOOP;
14 CLOSE C;
15* END;
SQL> /

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

296

PL/SQL procedure successfully completed.


1 DECLARE
2 CURSOR C IS SELECT * FROM DEPT;
3 TYPE DEPT_TABLE_TYPE IS TABLE OF DEPT%ROWTYPE
4 INDEX BY BINARY_INTEGER;
5 DEPT_TABLE DEPT_TABLE_TYPE;
6 V_DEPTREC DEPT%ROWTYPE;
7 V_COUN NUMBER(10):=0;
8 BEGIN
9 OPEN C;
10
11
12
13
14
15

LOOP
V_COUN := V_COUN+1;
FETCH C INTO DEPT_TABLE(V_COUN);
EXIT WHEN C%NOTFOUND;
END LOOP;
CLOSE C;

16 V_DEPTREC :=DEPT_TABLE(1);
17 DBMS_OUTPUT.PUT_LINE(V_DEPTREC.DEPTNO||V_DEPTREC.DNAME||
18 V_DEPTREC.LOC);
19* END;
20 /
10ACCOUNTINGNEW YORK
PL/SQL procedure successfully completed.
1 DECLARE
2 CURSOR C IS SELECT * FROM DEPT;
3 TYPE DEPT_TABLE_TYPE IS TABLE OF DEPT%ROWTYPE
4 INDEX BY BINARY_INTEGER;
5 DEPT_TABLE DEPT_TABLE_TYPE;
6 V_DEPTREC DEPT%ROWTYPE;
7 V_COUN NUMBER(10):=0;
8 BEGIN
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

297

9 OPEN C;
10 LOOP
11 V_COUN := V_COUN+1;
12 FETCH C INTO DEPT_TABLE(V_COUN);
13 EXIT WHEN C%NOTFOUND;
14 END LOOP;
15 CLOSE C;
16 V_DEPTREC :=DEPT_TABLE(1);
17 DBMS_OUTPUT.PUT_LINE(V_DEPTREC.DEPTNO||V_DEPTREC.DNAME||
18 V_DEPTREC.LOC);
19 V_DEPTREC :=DEPT_TABLE(2);
20 DBMS_OUTPUT.PUT_LINE(V_DEPTREC.DEPTNO||V_DEPTREC.DNAME||
21 V_DEPTREC.LOC);
22 V_DEPTREC :=DEPT_TABLE(3);
23 DBMS_OUTPUT.PUT_LINE(V_DEPTREC.DEPTNO||V_DEPTREC.DNAME||
24 V_DEPTREC.LOC);
25 V_DEPTREC :=DEPT_TABLE(4);
26 DBMS_OUTPUT.PUT_LINE(V_DEPTREC.DEPTNO||V_DEPTREC.DNAME||
27 V_DEPTREC.LOC);
28* END;
29 /
10ACCOUNTINGNEW YORK
20RESEARCHDALLAS
30SALESCHICAGO
40OPERATIONSBOSTON
PL/SQL procedure successfully completed.
STORED PROCEDURES:
SQL> CREATE TABLE EMP_DUP
2 AS
3 SELECT * FROM EMP;
Table created.
SQL> SELECT * FROM EMP_DUP;
EMPNO ENAME
JOB
MGR HIREDATE SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
7521 WARD
SALESMAN
7698 22-FEB-81
1250
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN
SALESMAN
7698 28-SEP-81
1250

I Soft Solutions ,Bang-54.

COMM
300
500
1400

DEPTNO
20
30
30
20
30

STRUCTURED QUERY LANGUAGE

ORACLE
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER

MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK

298

7839 01-MAY-81
7839 09-JUN-81
7566 19-APR-87
17-NOV-81
7698 08-SEP-81
7788 23-MAY-87
7698 03-DEC-81
7566 03-DEC-81
7782 23-JAN-82

2850
2450
3000
5000
1500
1100
950
3000
1300

30
10
20
10
30
20
30
20
10

14 rows selected.
PROCEDURE WITH IN PARAMETER:
1 CREATE OR REPLACE PROCEDURE BALAJI
2 (V_EMPNO IN EMP_DUP.EMPNO%TYPE)
3 IS
4 BEGIN
5 UPDATE EMP_DUP
6 SET SAL = SAL + 1000
7 WHERE EMPNO = V_EMPNO;
8* END;
SQL> /
Procedure created.
SQL> EXECUTE BALAJI(7369);
PL/SQL procedure successfully completed.
SQL> SELECT * FROM EMP_DUP;
EMPNO ENAME
JOB
MGR HIREDATE
DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
1800
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
7521 WARD
SALESMAN
7698 22-FEB-81
1250
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN
SALESMAN
7698 28-SEP-81
1250
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450

I Soft Solutions ,Bang-54.

SAL

COMM
20

300
500
1400

30
30
20
30
30
10

STRUCTURED QUERY LANGUAGE

ORACLE
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER

ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK

299

7566 19-APR-87
3000
17-NOV-81
5000
7698 08-SEP-81
1500
7788 23-MAY-87
1100
7698 03-DEC-81
950
7566 03-DEC-81
3000
7782 23-JAN-82
1300

20
10
30
20
30
20
10

14 rows selected.
PROCEDURE WITH OUT PARAMETER:
1 CREATE OR REPLACE PROCEDURE BALAJI1
2 (V_EMPNO IN EMP.EMPNO%TYPE,
3 V_ENAME OUT EMP.ENAME%TYPE,
4 V_SAL OUT EMP.SAL%TYPE,
5 V_DEPTNO OUT EMP.DEPTNO%TYPE)
6
7 IS
8 BEGIN
9 SELECT ENAME,SAL,DEPTNO INTO V_ENAME,V_SAL,V_DEPTNO
10 FROM EMP WHERE EMPNO=V_EMPNO;
11* END;
SQL> /
Procedure created.
1 DECLARE
2 P_ENAME EMP.ENAME%TYPE;
3 P_SAL EMP.SAL%TYPE;
4 P_DEPTNO EMP.DEPTNO%TYPE;
5 P_EMPNO EMP.EMPNO%TYPE:=7369;
6 BEGIN

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

300

7 BALAJI1(P_EMPNO,P_ENAME,P_SAL,P_DEPTNO);
8 DBMS_OUTPUT.PUT_LINE(P_ENAME||P_SAL||P_DEPTNO);
9* END;
SQL> /
PL/SQL procedure successfully completed.
SQL> SET SERVEROUTPUT ON
SQL> /
SMITH80020
PL/SQL procedure successfully completed.
SQL> VARIABLE G_ENAME VARCHAR2(10)
SQL> VARIABLE G_SAL NUMBER
SQL> VARIABLE G_DEPTNO NUMBER
SQL> EXECUTE BALAJI1(7369,:G_ENAME,:G_SAL,:G_DEPTNO);
PL/SQL procedure successfully completed.
SQL> PRINT G_ENAME
G_ENAME
-------------------------------SMITH
SQL> PRINT G_SAL
G_SAL
---------800
SQL> PRINT G_DEPTNO
G_DEPTNO
---------20
PROCEDURE WITH IN OUT PARAMETER:
1 CREATE OR REPLACE PROCEDURE BALAJI2

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

301

2 (V_EMPNO_SAL IN OUT NUMBER)


3 IS
4 BEGIN
5 SELECT SAL INTO V_EMPNO_SAL
6 FROM EMP WHERE EMPNO=V_EMPNO_SAL;
7* END;
8 /
Procedure created.
1 DECLARE
2 P_EMPNO_SAL NUMBER:=7369;
3 BEGIN
4 BALAJI2(P_EMPNO_SAL);
5 DBMS_OUTPUT.PUT_LINE(P_EMPNO_SAL);
6* END;
7 /
800
PL/SQL procedure successfully completed.
SQL> VARIABLE G_EMPNO_SAL NUMBER
1 BEGIN
2 :G_EMPNO_SAL:=7369;
3* END;
SQL> /
PL/SQL procedure successfully completed.
SQL> EXECUTE BALAJI2(:G_EMPNO_SAL);
PL/SQL procedure successfully completed.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

302

SQL> PRINT G_EMPNO_SAL


G_EMPNO_SAL
----------800
USING DEFAULT IN PROCEDURES:
SQL> CREATE TABLE DEPT1
2 AS
3 SELECT * FROM DEPT;
Table created.
SQL> DELETE FROM DEPT1;
4 rows deleted.
SQL> COMMIT;
Commit complete.
SQL> CREATE SEQUENCE ADD_DEPT_SEQ
2 INCREMENT BY 1
3 START WITH 100
4 MAXVALUE 120
5 NOCACHE;
Sequence created.
1 CREATE OR REPLACE PROCEDURE ADD_DEPT
2 (V_DNAME IN DEPT1.DNAME%TYPE DEFAULT 'PAVAN',
3 V_LOC IN DEPT1.LOC%TYPE DEFAULT 'GAYATRI')
4 IS
5 BEGIN
6 INSERT INTO DEPT1
7 VALUES
8 (ADD_DEPT_SEQ.NEXTVAL,V_DNAME,V_LOC);
9* END;
SQL> /

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

303

Procedure created.
1 BEGIN
2 ADD_DEPT;
3 ADD_DEPT('SALES','NEWYORK');
4 ADD_DEPT(V_LOC => 'DALLAS',V_DNAME => 'EDUCATION');
5 ADD_DEPT(V_LOC => 'BOSTON');
6* END;
SQL> /
PL/SQL procedure successfully completed.
SQL> SELECT * FROM DEPT1;
DEPTNO DNAME
LOC
---------- -------------- ------------100 PAVAN
GAYATRI
101 SALES
NEWYORK
102 EDUCATION
DALLAS
103 PAVAN
BOSTON
SQL> CREATE TABLE LOG_TABLE
2 (USERID VARCHAR2(10),
3 LOG_DATE DATE);
Table created.

DECLARING SUBPROGRAMS:
SQL> CREATE OR REPLACE PROCEDURE LEAVE_EMP2
2 (V_EMPNO IN EMP.EMPNO%TYPE)
3 IS
4 PROCEDURE LOG_EXEC
5 IS

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

304

6 BEGIN
7 INSERT INTO LOG_TABLE(USERID,LOG_DATE)
8 VALUES (USER,SYSDATE);
9 END LOG_EXEC;
10 BEGIN
11 DELETE FROM EMP_DUP
12 WHERE EMPNO=V_EMPNO;
13 LOG_EXEC;
14 END;
15 /
Procedure created.
SQL> SELECT * FROM LOG_TABLE;
no rows selected
SQL> SELECT * FROM EMP_DUP;
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
7499 ALLEN
SALESMAN 7698 20-FEB-81
1600
300
7521 WARD
SALESMAN 7698 22-FEB-81
1250
500
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN
SALESMAN 7698 28-SEP-81
1250
1400
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT
ANALYST
7566 19-APR-87
3000
7839 KING
PRESIDENT
17-NOV-81
5000
7844 TURNER
SALESMAN
7698 08-SEP-81
1500
0
7876 ADAMS
CLERK
7788 23-MAY-87
1100
7900 JAMES
CLERK
7698 03-DEC-81
950
7902 FORD
ANALYST
7566 03-DEC-81
3000
7934 MILLER
CLERK
7782 23-JAN-82
1300

20
30
30
20
30
30
10
20
10
30
20
30
20
10

14 rows selected.
SQL> BEGIN
2 LEAVE_EMP2(7369);
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

305

3 END;
4 /
PL/SQL procedure successfully completed.

SQL> SELECT * FROM LOG_TABLE;


USERID LOG_DATE
---------- --------SCOTT 09-JUN-05
SQL> SELECT * FROM EMP_DUP;
EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
7521 WARD
SALESMAN
7698 22-FEB-81
1250
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN
SALESMAN
7698 28-SEP-81
1250
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT
ANALYST
7566 19-APR-87
3000
7839 KING
PRESIDENT
17-NOV-81
5000
7844 TURNER
SALESMAN
7698 08-SEP-81
1500
7876 ADAMS
CLERK
7788 23-MAY-87
1100
7900 JAMES
CLERK
7698 03-DEC-81
950
7902 FORD
ANALYST
7566 03-DEC-81
3000
7934 MILLER
CLERK
7782 23-JAN-82
1300

COMM

DEPTNO

300
500

30
30

1400

30

20
30
10
20
10
0

30
20
30
20
10

13 rows selected.

SQL> CREATE OR REPLACE PROCEDURE RAISE_SALARY


2 (V_EMPNO IN EMP.EMPNO%TYPE)
3 IS
4 BEGIN
5 UPDATE EMP_DUP
6 SET SAL = SAL* 1.10
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

306

7 WHERE EMPNO=V_EMPNO;
8 END;
9 /
Procedure created.

SQL> SELECT * FROM EMP_DUP;


EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
7499 ALLEN
SALESMAN 7698 20-FEB-81
1600
7521 WARD
SALESMAN 7698 22-FEB-81
1250
7566 JONES
MANAGER 7839 02-APR-81
2975
7654 MARTIN
SALESMAN 7698 28-SEP-81
1250
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
7782 CLARK
MANAGER
7839 09-JUN-81
2450
7788 SCOTT
ANALYST
7566 19-APR-87
3000
7839 KING
PRESIDENT
17-NOV-81
5000
7844 TURNER
SALESMAN 7698 08-SEP-81
1500
7876 ADAMS
CLERK
7788 23-MAY-87
1100
7900 JAMES
CLERK
7698 03-DEC-81
950
7902 FORD
ANALYST
7566 03-DEC-81
3000
7934 MILLER
CLERK
7782 23-JAN-82
1300

COMM
300
500
1400

DEPTNO
20
30
30
20
30
30
10
20
10
30
20
30
20
10

14 rows selected.
INVOKING A PROCEDURE FROM A STORED PROCEDURE:
1 CREATE OR REPLACE PROCEDURE GAYATRI
2 IS
3 CURSOR C IS SELECT EMPNO FROM EMP_DUP;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

307

4 BEGIN
5 FOR E IN C
6 LOOP
7 RAISE_SALARY(E.EMPNO);
8 END LOOP;
9 COMMIT;
10* END;
SQL> /
Procedure created.

SQL> EXECUTE GAYATRI;


PL/SQL procedure successfully completed.
SQL> SELECT * FROM EMP_DUP;
EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
880
7499 ALLEN
SALESMAN 7698 20-FEB-81
1760
7521 WARD
SALESMAN 7698 22-FEB-81
1375
7566 JONES
MANAGER 7839 02-APR-81 3272.5
7654 MARTIN
SALESMAN 7698 28-SEP-81
1375
7698 BLAKE
MANAGER 7839 01-MAY-81
3135
7782 CLARK
MANAGER 7839 09-JUN-81
2695
7788 SCOTT
ANALYST
7566 19-APR-87
3300
7839 KING
PRESIDENT
17-NOV-81
5500
7844 TURNER
SALESMAN 7698 08-SEP-81
1650
7876 ADAMS
CLERK
7788 23-MAY-87
1210
7900 JAMES
CLERK
7698 03-DEC-81
1045
7902 FORD
ANALYST
7566 03-DEC-81
3300
7934 MILLER
CLERK
7782 23-JAN-82
1430

COMM
300
500
1400

DEPTNO
20
30
30
20
30
30
10
20
10
30
20
30
20
10

14 rows selected.
DROPING A STORED PROCEDURE:
SQL> DROP PROCEDURE GAYATRI;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

308

Procedure dropped.
QUERING STORED PROCEDURES STORED IN DATABASE:
SQL> SELECT OBJECT_NAME,OBJECT_TYPE
2 FROM USER_OBJECTS
3 WHERE OBJECT_TYPE = 'PROCEDURE';
OBJECT_NAME
------------------------------------------------------------------------------------------------------------------------------OBJECT_TYPE
-----------------ADD_DEPT
PROCEDURE
BALAJI
PROCEDURE
BALAJI1
PROCEDURE
BALAJI2
PROCEDURE
LEAVE_EMP2
PROCEDURE
RAISE_SALARY
PROCEDURE
6 rows selected.

QUERING STORED PROCEDURES TEXT STORED IN DATABASE:


SQL> DESC USER_SOURCE
Name
Null? Type
----------------------------------------------------------------------- ------------------------------------------------------NAME
VARCHAR2(30)
TYPE
VARCHAR2(12)
LINE
NUMBER
TEXT
VARCHAR2(4000)
SQL> SELECT TEXT FROM USER_SOURCE
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

309

2 WHERE NAME='BALAJI'
3 ORDER BY LINE;
TEXT
--------------------------------------------------------------------------------------------------------------------------------PROCEDURE BALAJI
(V_EMPNO IN EMP.EMPNO%TYPE)
IS
BEGIN
UPDATE EMP_DUP
SET SAL = SAL + 1000
WHERE EMPNO = V_EMPNO;
END;
8 rows selected.
1 SELECT TEXT FROM USER_SOURCE
2 WHERE NAME='BALAJI1'
3* ORDER BY LINE
SQL> /
TEXT
--------------------------------------------------------------------------------------------------------------------------------PROCEDURE BALAJI1
(V_EMPNO IN EMP.EMPNO%TYPE,
V_ENAME OUT EMP.ENAME%TYPE,
V_SAL OUT EMP.SAL%TYPE,
V_DEPTNO OUT EMP.DEPTNO%TYPE
)
IS
BEGIN
SELECT ENAME,SAL,DEPTNO INTO V_ENAME,V_SAL,V_DEPTNO
FROM EMP WHERE EMPNO=V_EMPNO;
END;
11 rows selected.
1 SELECT TEXT FROM USER_SOURCE
2 WHERE NAME='BALAJI2'
3* ORDER BY LINE
SQL> /
TEXT
--------------------------------------------------------------------------------------------------------------------------------PROCEDURE BALAJI2
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

310

(V_EMPNO_SAL IN OUT NUMBER)


IS
BEGIN
SELECT SAL INTO V_EMPNO_SAL
FROM EMP WHERE EMPNO=V_EMPNO_SAL;
END;
7 rows selected.
SQL> CREATE OR REPLACE PROCEDURE LOG_EXECUTION
2 IS
3 BEGIN
4 INPUT INTO LOG_TABLE
5 VALUES
6 (USER,SYSDATE);
7 END;
8 /
Warning: Procedure created with compilation errors.
QUERING ERRORS IN STORED PROCEDURES STORED IN DATABASE:
SQL> DESC USER_ERRORS
Name
Null? Type
----------------------------------------------------------------------- ------------------------------------------------------NAME
NOT NULL VARCHAR2(30)
TYPE
VARCHAR2(12)
SEQUENCE
NOT NULL NUMBER
LINE
NOT NULL NUMBER
POSITION
NOT NULL NUMBER
TEXT
NOT NULL VARCHAR2(4000)
SQL> SELECT LINE||'/'|| POSITION POS,TEXT FROM
2 USER_ERRORS
3 WHERE NAME='LOG_EXECUTION'
4 ORDER BY LINE;
POS
--------------------------------------------------------------------------------TEXT
--------------------------------------------------------------------------------------------------------------------------------4/7
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

311

PLS-00103: Encountered the symbol "INTO" when expecting one of the following:
:= . ( @ % ;
7/1
PLS-00103: Encountered the symbol "END"
SQL> SHOW ERRORS PROCEDURE LOG_EXECUTION
Errors for PROCEDURE LOG_EXECUTION:
LINE/COL ERROR
-------- ----------------------------------------------------------------4/7 PLS-00103: Encountered the symbol "INTO" when expecting one of
the following:
:= . ( @ % ;
7/1

PLS-00103: Encountered the symbol "END"

STORED FUNCTIONS:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

312

SQL> CREATE OR REPLACE FUNCTION GET_SAL


2 (V_EMPNO IN EMP.EMPNO%TYPE)
3 RETURN NUMBER
4 IS
5 V_SAL EMP.SAL%TYPE;
6 BEGIN
7 SELECT SAL INTO V_SAL FROM EMP
8 WHERE EMPNO=V_EMPNO;
9 RETURN V_SAL;
10 END;
11 /
Function created.
CALLING FUNTION:
SQL> VARIABLE G_SALARY NUMBER
SQL> EXECUTE :G_SALARY :=GET_SAL(7369)
PL/SQL procedure successfully completed.
SQL> PRINT G_SALARY
G_SALARY
---------800
1 DECLARE
2 V_SALARY NUMBER(10);
3 BEGIN
4 V_SALARY:=GET_SAL(7369);
5 DBMS_OUTPUT.PUT_LINE(V_SALARY);
6* END;
SQL> /
800
PL/SQL procedure successfully completed.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

313

CALLING FUNCTION IN VARIOUS PLACES:


SQL> CREATE OR REPLACE FUNCTION TAX
2 (V_VALUE IN NUMBER)
3 RETURN NUMBER
4 IS
5 BEGIN
6 RETURN (V_VALUE*0.08);
7 END;
8 /
Function created.
SQL> SELECT EMPNO,ENAME,SAL,TAX(SAL) FROM EMP;
EMPNO ENAME
SAL TAX(SAL)
---------- ---------- ---------- ---------7369 SMITH
800
64
7499 ALLEN
1600
7521 WARD
1250
100
7566 JONES
2975
238
7654 MARTIN
1250
100
7698 BLAKE
2850
7782 CLARK
2450
196
7788 SCOTT
3000
240
7839 KING
5000
400
7844 TURNER
1500
120
7876 ADAMS
1100
88
7900 JAMES
950
76
7902 FORD
3000
240
7934 MILLER
1300
104

128

228

14 rows selected.

1 SELECT EMPNO FROM EMP


2 WHERE TAX(SAL) > (SELECT MAX(TAX(SAL)) FROM EMP
3* WHERE DEPTNO=30) ORDER BY TAX(SAL) DESC
4 /
EMPNO
---------7839
7788

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

314

7902
7566
1 SELECT * FROM EMP
2 WHERE TAX(SAL) > (SELECT MAX(TAX(SAL)) FROM EMP
3* WHERE DEPTNO=30) ORDER BY TAX(SAL) DESC
SQL> /
EMPNO ENAME
JOB
MGR
HIREDATE
DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7839 KING
PRESIDENT
17-NOV-81
7788 SCOTT
ANALYST
7566 19-APR-87
7902 FORD
ANALYST
7566 03-DEC-81
7566 JONES
MANAGER
7839 02-APR-81

SAL
5000
3000
3000
2975

COMM
10
20
20
20

SQL> SELECT SAL,TAX(SAL) FROM EMP


2 WHERE TAX(SAL) > (SELECT MAX(TAX(SAL)) FROM EMP
3 WHERE DEPTNO=30) ORDER BY TAX(SAL) DESC;
SAL TAX(SAL)
---------- ---------5000
400
3000
240
3000
240
2975
238
DROPING A FUNCTION:
SQL> DROP FUNCTION TAX;
Function dropped.
SELECTING FUNCTION FROM DATABASE:
SQL> SELECT OBJECT_NAME,OBJECT_TYPE
2 FROM USER_OBJECTS
3 WHERE OBJECT_TYPE='FUNCTION';
OBJECT_NAME
------------------------------------------------------------------------------------------------------------------------------OBJECT_TYPE
-----------------GET_SAL
FUNCTION

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

315

SOURCE CODE OF FUNCTION:


1 SELECT TEXT FROM USER_SOURCE
2* WHERE NAME='GET_SAL'
3 /
TEXT
--------------------------------------------------------------------------------------------------------------------------------FUNCTION GET_SAL
(V_EMPNO IN EMP.EMPNO%TYPE)
RETURN NUMBER
IS
V_SAL EMP.SAL%TYPE;
BEGIN
SELECT SAL INTO V_SAL FROM EMP
WHERE EMPNO=V_EMPNO;
RETURN V_SAL;
END;
10 rows selected.
DESCRIBING FUNCTION IN SQL*PLUS:
SQL> DESC GET_SAL
FUNCTION GET_SAL RETURNS NUMBER
Argument Name
Type
In/Out Default?
------------------------------ ----------------------- ------ -------V_EMPNO
NUMBER(4)
IN
DESCRIBING PROCEDURE IN SQL*PLUS:

SQL> DESC PROCEDURE_NAME;


YOU WILL GET ALL PARAMETER INFORMATION OF THE PROCEDURE.
LIKE ABOVE OUTPUT FOR FUNCTION.

LOCATIONS TO CALL USER-DEFINED FUNCTIONS:


SELECT LIST OF A SELECT COMMAND.
CONDITION OF WHERE AND HAVING CLAUSES.
CONNECT BY ,START WITH ,ORDER BY AND GROUP BY CLAUSES.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

316

VALUES CLAUSES OF INSERT COMMAND.


SET CLAUSE OF THE UPDATE COMMAND.
COMPARING PROCEDURES AND FUNCTIONS:
PROCEDURE

FUNCTION

EXECUTE AS A PL/SQL STATEMENT.

INVOKE AS PART OF A N EXPRESSION.

NO RETURN DATA TYPE.

MUST CONTAIN A RETURN DATA TYPE.

CAN RETURN NONE,ONE OR MANY


VALUES

MUST RETURN A SINGLE VALUE.

BENEFITS OF STORED PROCEDURES AND STORED FUNCTIONS:

IMPROVED PERFORMANCE.
IMPROVED MAINTENANCE.
IMPROVED DATA SECURITY AND INTEGRITY.

TRIGGERS:
A TRIGGER IS A PL/SQL BLOCK THAT EXECUTES IMPLICITLY WHENEVER A
PARTICULAR EVENT TAKES PLACE.
CREATING TRIGGERS:
TRIGGER TIMING:
-FOR TABLE : BEFORE,AFTER
-FOR VIEW : INSTEAD OF.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

317

TRIGGERING EVENT: INSERT,UPDATE OR DELETE.


TABLE NAME: ON TABLE OR VIEW.
TRIGGER TYPE : ROW OR STATEMENT.
WHEN CLAUSE : RESTRICTING CONDITION
TRIGGER BODY : PL/SQL BLOCK.
TRIGGER COMPONENTS:
TRIGGER TIMING: WHEN SHOULD THE TRIGGER FIRE?
BEFORE: EXECUTE THE TRIGGER BODY BEFORE THE TRIGGERING DML EVENT ON A
TABLE.
AFTER: EXECUTE THE TRIGGER BODY AFTER THE TRIGGERING DML EVENT ON A
TABLE.
INSTEAD OF:
EXECUTE THE TRIGGER BODY INSTEAD OF THE TRIGGERING STATEMENT. USED FOR
VIEWS THAT ARE NOT OTHERWISE MODIFIABLE.
WHAT DML STATEMENT WIL CAUSE THE TRIGGER TO EXECUTE?
INSERT.
UPDATE.
DELETE.
TRIGGER TYPE:
STATEMENT: THE TRIGGER BODY EXECUTES ONCE FOR THE TRIGGERING EVENT.
THIS IS THE DEFAULT.
ROW:THE TRIGGER BODY EXECUTES ONCE FOR EACH ROW AFFECTED BY THE
TRIGGERING EVENT.
WHAT ACTION SHOULD THE TRIGGER PERFORM?
THE TRIGGER BODY IS A PL/SQL BLOCK OR A CALL TO A PROCEDURE.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

318

FIRING SEQUENCE:

FIRING SEQUENCE OF A TRIGGER ON A TABLE, WHEN A SINGLE ROW IS


MANIPULATED.
DML STATEMENT:
INSERT INTO DEPT
VALUES
(50,COMPUTERS,NEW YORK);
TRIGGERING ACTION:
BEFORE STATEMENT TRIGGER.
DEPTNO
10
20
30
40
50

DNAME
ACCOUNTING
RESEARCH
SALES
OPERATIONS
COMPUTERS

LOC
NEW YORK
DALLAS
CHICAGO
BOSTON
NEW YORK

BEFORE ROW TRIGGER.


AFTER ROW TRIGGER.

AFTER STATEMENT TRIGGER.

FIRING SEQUENCE OF A TRIGGER ON A TABLE, WHEN MANY ROWS ARE


MANUPULATED.
UPDATE EMP
SET SAL = SAL*1.1
WHERE DEPTNO=30;
BEFORE STATEMENT TRIGGER
EMPNO
7839

ENAME
KING

DEPTNO
30
BEFORE ROW TRIGGER

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

319

AFTER ROW TRIGGER.


7698

BLAKE

30
BEFORE ROW TRIGGER
AFTER ROW TRIGGER.

7788

SMITH

30
BEFORE ROW TRIGGER
AFTER ROW TRIGGER.
AFTER STATEMENT TRIGGER.

WHEN THE TRIGGERING DATA MANIPULATION STATEMENT AFFECTS MANY ROWS,


THE STATEMENT TRIGGER FIRES EXACTLY ONCE, AND THE ROW TRIGGER FIRES
ONCE FOR EVERY ROW AFFECTED BY STATEMENT.
THE SQL STATEMENT IN THE SLIDE ABOVE CAUSES A ROW-LEVEL TRIGGER TO FIRE A
NUMBER OF TIMES EQUAL TO THE NUMBER OF ROWS THAT SATISFY THE WHERE
CLAUSE, THAT IS, THE NUMBER OF EMPLOYEES REPORTING TO DEPARTMENT 30.

CREATING STATEMENT TRIGGERS:


SQL> CREATE OR REPLACE TRIGGER SECURE_EMP
2 BEFORE INSERT ON EMP
3 BEGIN
4 IF (TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR
5 (TO_CHAR(SYSDATE,'HH24') NOT BETWEEN '08' AND '18')
6 THEN RAISE_APPLICATION_ERROR (-20500, 'YOU MAY ONLY INSERT INTO EMP
7 DURING BUSINESS HOURS');
8 END IF;
9 END;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

320

10 /
Trigger created.
INSERT IN TO EMP DURING NON OFFICE HOURS.
SQL> INSERT INTO EMP
2 (EMPNO,ENAME,DEPTNO)
3 VALUES
4 (1,'PAVAN',40);
INSERT INTO EMP
*
ERROR at line 1:
ORA-20500: YOU MAY ONLY INSERT INTO EMP
DURING BUSINESS HOURS
ORA-06512: at "SCOTT.SECURE_EMP", line 4
ORA-04088: error during execution of trigger 'SCOTT.SECURE_EMP'
INSERT IN TO EMP DURING OFFICE HOURS.
SQL> INSERT INTO EMP
2 (EMPNO,ENAME,DEPTNO)
3 VALUES
4 (1,'PAVAN',40);
1 row created.

USING CONDITIONAL PREDICATES:


1 CREATE OR REPLACE TRIGGER SECURE_EMP1
2 BEFORE INSERT OR UPDATE OR DELETE ON EMP
3 BEGIN
4 IF (TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR
5 (TO_CHAR(SYSDATE,'HH24') NOT BETWEEN '08' AND '18')
6 THEN

7 IF DELETING

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

321

8 THEN RAISE_APPLICATION_ERROR (-20502, 'YOU MAY ONLY DELETE FROM EMP


DURING BUSINESS HOURS');
9 ELSIF INSERTING
10 THEN RAISE_APPLICATION_ERROR (-20500, 'YOU MAY ONLY INSERT INTO EMP
DURING BUSINESS HOURS');
11 ELSIF UPDATING ('SAL')
12 THEN RAISE_APPLICATION_ERROR (-20503, 'YOU MAY ONLY UPDATE SAL IN EMP
DURING BUSINESS HOURS');
13 ELSE
14 RAISE_APPLICATION_ERROR (-20504, 'YOU MAY ONLY UPDATE EMP DURING
BUSINESS HOURS');
15 END IF;
16 END IF;
17* END;
18 /
Trigger created.

CREATING ROW LEVEL TRIGGERS:


USING OLD AND NEW QUALIFIERS:

1 CREATE TABLE DEPT1


2 AS
3* SELECT * FROM DEPT
4 /
Table created.
1 CREATE TABLE AUDIT_DEPT_TABLE

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

322

2 (USERNAME VARCHAR2(10),
3 TODAYDATE TIMESTAMP,
4 NEW_DEPTNO

NUMBER(10),

5 OLD_DEPTNO NUMBER(10),
6 NEW_DNAME VARCHAR2(10),
7 OLD_DNAME VARCHAR2(10),
8 NEW_LOC

VARCHAR2(10),

9* OLD_LOC

VARCHAR2(10))

SQL> /
Table created.

1 CREATE OR REPLACE TRIGGER AUDIT_DEPT_VALUES


2 AFTER DELETE OR INSERT OR UPDATE ON DEPT1
3 FOR EACH ROW
4 BEGIN
5 INSERT INTO AUDIT_DEPT_TABLE
6 VALUES
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

323

7 (USER,SYSTIMESTAMP,:NEW.DEPTNO,:OLD.DEPTNO,:NEW.DNAME,:OLD.DNAME,
8 :NEW.LOC,:OLD.LOC);
9* END;
SQL> /
Trigger created.
DATA OPERATION.
INSERT.
UPDATE.
DELETE.

OLD VALUE.
NULL.
VALUE BEFORE
UPDATE.
VALUE BEFORE DELETE.

NEW VALUE.
INSERTED VALUE.
VALUE AFTER UPDATE.
NULL.

THE OLD AND NEW QUALIFIERS ARE ONLY AVAILABLEIN ROW TRIGGERS.
PREFIX THESE QUALIFIERS WITH A COLON(:) IN EVERY SQL AND PL/SQL STATEMENT.
DELETING:
SQL> DELETE FROM DEPT1
2 WHERE DEPTNO=10;
1 row deleted.
SQL> SELECT * FROM AUDIT_DEPT_TABLE;
USERNAME TIMESTAMP NEW_DEPTNO OLD_DEPTNO NEW_DNAME OLD_DNAME
NEW_LOC OLD_LOC
---------- --------- ---------- ---------- ---------- ---------- ---------- ---------SCOTT 09-JUN-05
10
ACCOUNTING
NEW YORK
INSERTING:
SQL> INSERT INTO DEPT1
2 VALUES
3 (50,'COMPUTERS','NEW YORK');
1 row created.
SQL> SELECT * FROM AUDIT_DEPT_TABLE;
USERNAME TIMESTAMP NEW_DEPTNO OLD_DEPTNO NEW_DNAME OLD_DNAME
NEW_LOC OLD_LOC
---------- --------- ---------- ---------- ---------- ---------- ---------- ---------I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
SCOTT

09-JUN-05
NEW YORK

SCOTT

09-JUN-05

324

10

ACCOUNTING

50

COMPUTERS

NEW YORK

UPDATING WITH WHERE CLAUSE:


SQL> UPDATE DEPT1
2 SET DNAME='PAVAN'
3 WHERE DEPTNO=50;
1 row updated.
SQL> SELECT * FROM AUDIT_DEPT_TABLE;
USERNAME TIMESTAMP NEW_DEPTNO OLD_DEPTNO NEW_DNAME OLD_DNAME
NEW_LOC OLD_LOC
---------- --------- ---------- ---------- ---------- ---------- ---------- ---------SCOTT 09-JUN-05
10
ACCOUNTING
NEW YORK
SCOTT
YORK

09-JUN-05

50

SCOTT 09-JUN-05
YORK NEW YORK

50

COMPUTERS
50

PAVAN

NEW
COMPUTERS NEW

UPDATING WITHOUT WHERE CLAUSE:


SQL> UPDATE DEPT1
2 SET DEPTNO=1;
4 rows updated.
SQL> SELECT * FROM AUDIT_DEPT_TABLE;
USERNAME TIMESTAMP NEW_DT OLD_DT NEW_DNAME OLD_DNAME NEW_LOC
OLD_LOC
---------- --------- ---------- ---------- ---------- ---------- ---------- ---------SCOTT 09-JUN-05
10
ACCOUNTING
NEW YORK
SCOTT

09-JUN-05

50

SCOTT
YORK

09-JUN-05

50

I Soft Solutions ,Bang-54.

COMPUTERS
50

PAVAN

NEW YORK
COMPUTERS NEW YORK NEW

STRUCTURED QUERY LANGUAGE

ORACLE

325

SCOTT 09-JUN-05
DALLAS

20

RESEARCH

RESEARCH

DALLAS

SCOTT 09-JUN-05
CHICAGO

30

SALES

SALES

CHICAGO

SCOTT 09-JUN-05
BOSTON

40

OPERATIONS OPERATIONS BOSTON

SCOTT
YORK

50

PAVAN

09-JUN-05

PAVAN

NEW YORK NEW

7 rows selected.

PROCEDURE VS TRIGGERS:
TRIGGER

PROCEDURE

DEFINED WITH CREATE TRIGGER.

DEFINED WITH CREATE PROCEDURE.

DATA DICTIONARY CONTAINS


SOURCE CODE.
IMPLICITLY INVOKED.

DATA DICTIONARY CONTAINS


SOURCE CODE.
EXPLICTLY INVOKED.

COMMIT,SAVEPOINT,ROLL BACK
ARE NOT ALLOWED.

COMMIT,SAVEPOINT,ROLL BACK
ARE ALLOWED.

USER_TRIGGERS FOR SOURCE CODE:


SQL> DESC USER_TRIGGERS;
NAME
NULL? TYPE
---------------------------------------------------------------------------------------------------------------------TRIGGER_NAME
VARCHAR2(30)
TRIGGER_TYPE
VARCHAR2(16)
TRIGGERING_EVENT
VARCHAR2(227)
TABLE_OWNER
VARCHAR2(30)

I Soft Solutions ,Bang-54.

--------

STRUCTURED QUERY LANGUAGE

ORACLE
BASE_OBJECT_TYPE
TABLE_NAME
COLUMN_NAME
REFERENCING_NAMES
WHEN_CLAUSE
STATUS
DESCRIPTION
ACTION_TYPE
TRIGGER_BODY

326

VARCHAR2(16)
VARCHAR2(30)
VARCHAR2(4000)
VARCHAR2(128)
VARCHAR2(4000)
VARCHAR2(8)
VARCHAR2(4000)
VARCHAR2(11)
LONG

SQL> SELECT TRIGGER_NAME,TRIGGER_BODY FROM USER_TRIGGERS;


TRIGGER_NAME
TRIGGER_BODY
------------------------------ -------------------------------------------------------------------------------SECURE_EMP
BEGIN
IF (TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR
(TO_CHAR(SYSDATE,'HH24'

SELECTTRIGGER_NAME,TRIGGER_TYPE,TRIGGERING_EVENT,
TRIGGER_BODY FROM USER_TRIGGERS;
TRIGGER_NAME
TRIGGER_TYPE
------------------------------ ---------------TRIGGERING_EVENT
--------------------------------------------------------------------------------------------------------------------------------TRIGGER_BODY
-------------------------------------------------------------------------------SECURE_EMP
BEFORE STATEMENT
INSERT
BEGIN
IF (TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR
(TO_CHAR(SYSDATE,'HH24'
DISABLE OR REENABLE A CL DATABASE TRIGGER:
ALTER TRIGGER TRIGGER_NAME DISABLE/ENABLE.
DISABLE OR REENABLE ALL TRIGGERS FOR A TABLE:
ALTER TABLE TABLE_NAME DISABLE/ENABLE ALL TRIGGERS.
RECOMIPLE A TRIGGER FOR A TABLE:
ALTER TRIGGER TRIGGER_NAME COMPILE.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

327

CREATNG DATABASE TRIGGERS:


TRIGGERING USER EVENT:
CREATE , ALTER OR DROP
LOGGING ON OR OFF

TRIGGERING DATABASE OR SYSTEM EVENT:


DATA BASE SHUTTING DOWN OR STARTING UP.
A SPECIFIC ERROR OR ANY ERROR BEING RAISED.
CREATE:
SQL> CREATE TABLE DDL_CREATIONS
2 (USER_ID VARCHAR2(10),
3 OBJECT_TYPE VARCHAR2(30),
4 OBJECT_NAME VARCHAR2(30),
5 OBJECT_OWNER VARCHAR2(20),
6 CREATIONDATE TIMESTAMP(5));
Table created.
SQL> CREATE OR REPLACE TRIGGER LOGCREATIONS
2 AFTER CREATE ON SCHEMA
3 BEGIN
4 INSERT INTO DDL_CREATIONS
5 VALUES
6 (USER,SYS.DICTIONARY_OBJ_TYPE,SYS.DICTIONARY_OBJ_NAME,
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

328

7 SYS.DICTIONARY_OBJ_OWNER,SYSTIMESTAMP);
8 END;
9 /
Trigger created.

1 CREATE TABLE BALAJI11


2* (EMPNO NUMBER(10))
SQL> /
Table created.
SQL> SELECT * FROM DDL_CREATIONS;
USER_ID OBJECT_TYPE
OBJECT_NAME
OBJECT_OWNER
---------- ------------------------------ ------------------------------ -------------------CREATIONDATE
--------------------------------------------------------------------------SCOTT TABLE
BALAJI11
SCOTT
15-JUN-05 12.03.24.00000 AM
DROP:
SQL> CREATE OR REPLACE TRIGGER PREVENT_DROP
2 BEFORE DROP ON SCOTT.SCHEMA
3 BEGIN
4 IF ORA_DICT_OBJ_OWNER='SCOTT'
5 AND ORA_DICT_OBJ_TYPE ='TABLE'

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

329

6 THEN RAISE_APPLICATION_ERROR
7 (-20002,'OPERATION NOT PERMITTED');
8 END IF;
9 END;
10 /
Trigger created.
SQL> DROP TABLE EMP100;
DROP TABLE EMP100
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20002: OPERATION NOT PERMITTED
ORA-06512: at line 4

SQL> CREATE OR REPLACE TRIGGER PREVENT_DROP1


2 BEFORE DROP ON SCOTT.SCHEMA
3 BEGIN
4 IF ORA_DICT_OBJ_OWNER='SCOTT'
5 AND ORA_DICT_OBJ_NAME LIKE 'E%'
6 AND ORA_DICT_OBJ_TYPE ='TABLE'
7 THEN RAISE_APPLICATION_ERROR
8 (-20002,'OPERATION NOT PERMITTED TABLES BEGINING WITH E LETTER');
9 END IF;
10 END;
11 /
Trigger created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

330

SQL> DROP TABLE EMP100;


DROP TABLE EMP100
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20002: OPERATION NOT PERMITTED TABLES BEGINING WITH E LETTER
ORA-06512: at line 5

LOGGING AND LOGOFF ON SCHEMA:


1 CREATE TABLE LOG_TRIG_TABLE
2 (USER_ID VARCHAR2(10),
3 LOG_DATE DATE,
4* ACTION

VARCHAR2(10))

SQL> /
Table created.
1 CREATE OR REPLACE TRIGGER LOGON_TRIG
2 AFTER LOGON ON SCHEMA
3 BEGIN
4 INSERT INTO LOG_TRIG_TABLE/
5 VALUES
6 (USER,SYSDATE,'LOGGGING ON');
7* END;
SQL> /
Trigger created.
1 CREATE OR REPLACE TRIGGER LOGOFF_TRIG
2 BEFORE LOGOFF ON SCHEMA

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

331

3 BEGIN
4 INSERT INTO LOG_TRIG_TABLE
5 VALUES
6 (USER,SYSDATE,'LOGGGING OFF');
7* END;
SQL> /
Trigger created.
LOGGING AND LOGOFF ON DATABASE:
1 CREATE TABLE LOG_TRIG_TABLE1
2 (USER_ID VARCHAR2(20),
3 DATETIME TIMESTAMP(5),
4* ACTION

VARCHAR2(20))

SQL> /
Table created.

1 CREATE OR REPLACE TRIGGER LOGOFF_TRIG1


2 BEFORE LOGOFF ON DATABASE
3 BEGIN
4 INSERT INTO LOG_TRIG_TABLE1
5 VALUES
6 (USER,SYSTIMESTAMP,'LOGGGING OFF');
7* END;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

332

SQL> /
Trigger created.
1 CREATE OR REPLACE TRIGGER LOGON_TRIG1
2 AFTER LOGON ON DATABASE
3 BEGIN
4 INSERT INTO LOG_TRIG_TABLE1
5 VALUES
6 (USER,SYSTIMESTAMP,'LOGGGING ON');
7* END;
SQL> /
Trigger created.

STARTUP AND SHUTDOWN OF DATABASE:


CREATE TABLE START_SHUT_DBASE
(DATETIME TIMESTAMP(5));
Table created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

333

SQL> CREATE OR REPLACE TRIGGER DATABASE_UP


2 AFTER STARTUP
3 ON DATABASE
4 BEGIN
5 INSERT INTO
6 START_SHUT_DBASE
7 VALUES
8 (SYSTIMESTAMP);
9 END;
10 /
Trigger created.
SQL> CREATE OR REPLACE TRIGGER DATABASE_SHUTDOWN
2 BEFORE SHUTDOWN
3 ON DATABASE
4 BEGIN
5 INSERT INTO
6 START_SHUT_DBASE
7 VALUES
8 (SYSTIMESTAMP);
9 END;
10 /
Trigger created.

A SPECIFIC ERROR OR ANY ERROR:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

334

1 CREATE TABLE ERROR_LOG


2 (DATETIME TIMESTAMP(5),
3 USER_ID

VARCHAR2(20),

4 INSTANCE

NUMBER,

5 DATABASE_NAME VARCHAR2(100),
6* ERROR_STACK VARCHAR2(2000))
SQL> /
Table created.
1 CREATE OR REPLACE TRIGGER LOGERROS
2 AFTER SERVERERROR ON DATABASE
3 BEGIN
4 INSERT INTO ERROR_LOG
5 VALUES
6 (SYSTIMESTAMP,SYS.LOGIN_USER,SYS.INSTANCE_NUM,
7 SYS.DATABASE_NAME,DBMS_UTILITY.FORMAT_ERROR_STACK);
8* END;
SQL> /
Trigger created.
SQL> SELECT * FORM EMP;
SELECT * FORM EMP
*
ERROR at line 1:
ORA-00923: FROM keyword not found where expected
SQL> SELECT * FROM DDDDDD;
SELECT * FROM DDDDDD
*
ERROR at line 1:
ORA-00942: table or view does not exist
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

335

SQL> BEGIN
2 INSERT INTO LLL VALUES (1);
3 END;
4 /
INSERT INTO LLL VALUES (1);
*
ERROR at line 2:
ORA-06550: line 2, column 13:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 2, column 1:
PL/SQL: SQL Statement ignored
SQL> BEGIN
2 DELETE FROM DDDD;
3
4 /
BEGIN
*
ERROR at line 1:
ORA-06550: line 3, column 0:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
begin case declare end exception exit for goto if loop mod
null pragma raise return select update while with
<an identifier> <a double-quoted delimited-identifier>
<a bind variable> << close current delete fetch lock insert
open rollback savepoint set sql execute commit forall merge
<a single-quoted SQL string> pipe
SQL> SELECT * FROM ERROR_LOG;
DATETIME
USER_ID
INSTANCE
--------------------------------------------------------------------------- -------------------- ---------DATABASE_NAME
---------------------------------------------------------------------------------------------------ERROR_STACK
--------------------------------------------------------------------------------------------------------------------------------15-JUN-05 12.09.25.00000 AM
SCOTT
1
ORCL.US.ORACLE.COM
ORA-00923: FROM keyword not found where expected
15-JUN-05 12.09.35.00000 AM
ORCL.US.ORACLE.COM
ORA-00942: table or view does not exist

SCOTT

15-JUN-05 12.09.54.00000 AM

SCOTT

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

336

ORCL.US.ORACLE.COM
ORA-06550: line 2, column 13:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 2, column 1:
PL/SQL: SQL Statement ignored
15-JUN-05 12.10.28.00000 AM
SCOTT
1
ORCL.US.ORACLE.COM
ORA-06550: line 3, column 0:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
begin case declare end exception exit for goto if loop mod
null pragma raise return select update while with
<an identifier> <a double-quoted delimited-identifier>
<a bind variable> << close current delete fetch lock insert
open rollback savepoint set sql execute commit forall merge
<a single-quoted SQL string> pipe
RESTRICTING A ROW TRIGGER WITH WHEN CLAUSE:

SQL> CREATE TABLE WHEN_MANAGER


2 (ACTION VARCHAR2(10),
3 DATETIME TIMESTAMP(5));
Table created.
1 CREATE OR REPLACE TRIGGER WHEN_JOB
2 BEFORE INSERT ON EMP
3 FOR EACH ROW
4 WHEN (NEW.JOB='MANAGER')
5 BEGIN
6 INSERT INTO WHEN_MANAGER
7 VALUES
8 ('MANAGER',SYSTIMESTAMP);
9* END;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

337

SQL> /
Trigger created.

SQL> INSERT INTO EMP


2 VALUES
3 (1,'PAVAN','MAANGER',12,'01-DEC-81',1000,100,10);
1 row created.
1 INSERT INTO EMP
2 VALUES
3* (2,'PAVAN','MANAGER',12,'01-DEC-81',1000,100,10)
SQL> /
1 row created.
1 INSERT INTO EMP
2 VALUES
3* (3,'KUMAR','MANAGER',12,'01-DEC-81',1000,100,10)
SQL> /
1 row created.
SQL> SELECT * FROM WHEN_MANAGER;
ACTION DATETIME
---------- --------------------------------------------------------------------------MANAGER 15-JUN-05 12.20.55.00000 AM
MANAGER 15-JUN-05 12.21.09.00000 AM
1 INSERT INTO EMP

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

338

2 VALUES
3* (4,'KUMAR','GER',12,'01-DEC-81',1000,100,10)
SQL> /
1 row created.
SQL> SELECT * FROM WHEN_MANAGER;
ACTION DATETIME
---------- --------------------------------------------------------------------------MANAGER 15-JUN-05 12.20.55.00000 AM
MANAGER 15-JUN-05 12.21.09.00000 AM

1 INSERT INTO EMP


2 VALUES
3* (5,'MANAGER','MANAGER',12,'01-DEC-81',1000,100,10)
SQL> /
1 row created.
SQL> SELECT * FROM WHEN_MANAGER;
ACTION DATETIME
---------- --------------------------------------------------------------------------MANAGER 15-JUN-05 12.20.55.00000 AM
MANAGER 15-JUN-05 12.21.09.00000 AM
MANAGER 15-JUN-05 12.22.51.00000 AM
CALLING A PROCEDURE FROM TRIGGER:
1 CREATE TABLE LOG_TABLE
2 (USER VARCHAR2(10),
3* TDATE TIMESTAMP)
SQL> /
Table created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

339

SQL> CREATE OR REPLACE PROCEDURE CALL_TRIGGER


2 AS
3 BEGIN
4 INSERT INTO LOG_TABLE
5 VALUES
6 (USER,SYSTIMESTAMP);
7 END;
8 /
Procedure created.

1 CREATE OR REPLACE TRIGGER CALL_PROC


2 BEFORE INSERT ON EMP
3* CALL CALL_TRIGGER
SQL> /
Trigger created.
SQL> SELECT * FROM LOG_TABLE;
no rows selected
1 INSERT INTO EMP
2 (EMPNO,DEPTNO)
3 VALUES
4* (6,10)
SQL> /
1 row created.

SQL> SELECT * FROM LOG_TABLE;


US

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

340

---------- --------SCOTT 15-JUN-05


CREATING PACKAGES:
WE USE PACKAGES TO GROUP LOGICALLY RELATED PL/SQL TYPES,SUBPROGRAMS.
PACKAGE CONSISTS OF PACKAGE SPECIFICATION AND PACKAGE BODY.
PACKAGE SPECIFICATION CONTAINS DECLARATIONS OF ALL LOGICALLY RELATED
ITEMS.
PACKAGE BODY CONTAINS BODY FOR ALL WHAT ALL WE DECLARED IN THE
PACKAGE SPECIFICATION.

CREATING PACKAGE SPECIFICATION:


1 CREATE OR REPLACE PACKAGE HANUMAN IS
2 G_SAL NUMBER;
3 PROCEDURE FIND_SAL
4 (V_EMPNO IN NUMBER);
5* END;
6 /
Package created.
CREATING PACKAGE BODY:
1 CREATE OR REPLACE PACKAGE BODY HANUMAN IS
2 FUNCTION FINDFUN_SAL
3 (V_EMPNO IN NUMBER)
4 RETURN NUMBER IS
5 V_SAL NUMBER(10);
6 BEGIN
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

341

7 SELECT SAL INTO V_SAL FROM EMP


8 WHERE EMPNO = V_EMPNO;
9 RETURN V_SAL;
10 END;
11 PROCEDURE FIND_SAL
12 (V_EMPNO IN NUMBER)
13 IS
14 BEGIN
15 G_SAL:=FINDFUN_SAL(V_EMPNO);
16 DBMS_OUTPUT.PUT_LINE(G_SAL);
17 END;
18* END;
SQL> /
Package body created.

SQL> EXECUTE HANUMAN.FIND_SAL(7369)


PL/SQL procedure successfully completed.
SQL> SET SERVEROUTPUT ON
SQL> EXECUTE HANUMAN.FIND_SAL(7369)
800
PL/SQL procedure successfully completed.
DECLARING GLOBAL_VARIABLES IN A PACKAGE:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

342

SQL> CREATE OR REPLACE PACKAGE GOLBAL_VARS IS


2 V_EMPNO

CONSTANT NUMBER:=7369;

3 V_DEPTNO CONSTANT NUMBER:=10;


4 END;
5 /
Package created.

1 CREATE OR REPLACE PROCEDURE GLOBALFIND_SAL


2 IS
3 V_SAL NUMBER(10);
4 BEGIN
5 SELECT SAL INTO V_SAL FROM EMP
6 WHERE EMPNO=GOLBAL_VARS.V_EMPNO;
7 DBMS_OUTPUT.PUT_LINE(V_SAL);
8* END;
SQL> /
Procedure created.

SQL> EXECUTE GLOBALFIND_SAL;


800
PL/SQL procedure successfully completed.

OVERLOADING IN PACKAGES:
1 CREATE OR REPLACE PACKAGE OVERLOAD_DEPT IS

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

343

2 PROCEDURE ADD_DEPT
3 (V_DEPTNO IN DEPT.DEPTNO%TYPE);
4 PROCEDURE ADD_DEPT
5 (V_DEPTNO IN DEPT.DEPTNO%TYPE,
6 V_DNAME IN DEPT.DNAME%TYPE);
7 PROCEDURE ADD_DEPT
8 (V_DEPTNO IN DEPT.DEPTNO%TYPE,
9 V_DNAME IN DEPT.DNAME%TYPE,
10 V_LOC IN DEPT.LOC%TYPE);
11* END;
SQL> /
Package created.

1 CREATE OR REPLACE PACKAGE BODY OVERLOAD_DEPT IS


2 PROCEDURE ADD_DEPT
3 (V_DEPTNO IN DEPT.DEPTNO%TYPE)

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

344

4 IS
5 BEGIN
6 INSERT INTO DEPT
7 (DEPTNO)
8 VALUES
9 (V_DEPTNO);
10 END;
11 PROCEDURE ADD_DEPT
12 (V_DEPTNO IN DEPT.DEPTNO%TYPE,
13 V_DNAME IN DEPT.DNAME%TYPE)
14 IS
15 BEGIN
16 INSERT INTO DEPT
17 (DEPTNO,DNAME)
18 VALUES
19 (V_DEPTNO,V_DNAME);
20 END;
21 PROCEDURE ADD_DEPT
22 (V_DEPTNO IN DEPT.DEPTNO%TYPE,
23 V_DNAME IN DEPT.DNAME%TYPE,
24 V_LOC IN DEPT.LOC%TYPE)
25 IS
26 BEGIN
27 INSERT INTO DEPT
28 (DEPTNO,DNAME,LOC)

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

345

29 VALUES
30 (V_DEPTNO,V_DNAME,V_LOC);
31 END;
32* END;
33 /
Package body created.
SQL> EXECUTE OVERLOAD_DEPT.ADD_DEPT(50);
PL/SQL procedure successfully completed.
SQL> EXECUTE OVERLOAD_DEPT.ADD_DEPT(60,'COMPUTERS');
PL/SQL procedure successfully completed.
SQL> EXECUTE OVERLOAD_DEPT.ADD_DEPT(70,'IP','LONDON');
PL/SQL procedure successfully completed.
SQL> SELECT * FROM DEPT;
DEPTNO DNAME
LOC
---------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS
BOSTON
50
60 COMPUTERS
70 IP
LONDON
7 rows selected.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

346

CREATING TYPES:
SQL> CREATE TYPE ADDRESS_TY AS OBJECT
2 (STREET VARCHAR2(10),
3 CITY VARCHAR2(10),
4 STATE VARCHAR2(10),
5 ZIP NUMBER);
6 /
Type created.
SQL> CREATE TYPE PERSON_TY AS OBJECT
2 (NAME VARCHAR2(10),
3 ADDRESS ADDRESS_TY);
4 /
TYPE CREATED.
SQL> CREATE TABLE CUSTOMER
2 (CUSTOMER_ID NUMBER,
3 PERSON PERSON_TY);
Table created.

SQL> DESC CUSTOMER


Name
Null? Type
------------------------------------------------------/
----- -------- ---------------------------------------CUSTOMER_ID
PERSON

I Soft Solutions ,Bang-54.

NUMBER
PERSON_TY

STRUCTURED QUERY LANGUAGE

ORACLE

347

SQL> DESC PERSON_TY


Name
Null?
Type
----------------------------------------------- -------- -------------------------------NAME
VARCHAR2(10)
ADDRESS
ADDRESS_TY
SQL> DESC ADDRESS_TY
Name
Null?
Type
----------------------------------------------- -------- -------------------------------STREET
VARCHAR2(10)
CITY
VARCHAR2(10)
STATE
VARCHAR2(10)
ZIP
NUMBER

THE USER_TAB_COLUMNS DATA DICTIONARY VIEW CAN BE QUERIED TO


SEE THE DATA TYPE ASSOCIATED WITH EACH COLUMN IN THE
CUSTOMER TABLE.
SQL> SELECT COLUMN_NAME,DATA_TYPE FROM USER_TAB_COLUMNS
2 WHERE TABLE_NAME = 'CUSTOMER';
COLUMN_NAME
CUSTOMER_ID
PERSON

DATA_TYPE
NUMBER
PERSON_TY

IN THE FOLLOWING QUERY , THE NAME, LENGTH, AND DATA TYPE ARE SELECTED
FOR EACH OF THE ATTRIBUTES WITHIN THE PWESON_TY DATATYPE.
SELECT ATTR_NAME,LENGTH,ATTR_TYPE_NAME FROM USER_TYPE_ATTRS
WHERE TYPE_NAME = 'PERSON_TY';
SQL> /

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

348

ATTR_NAME
LENGTH
ATTR_TYPE_NAME
------------------------------ ---------- -----------------------------NAME
10
VARCHAR2
ADDRESS
ADDRESS_TY

QUERY USER_TYPE_ATTRS AGAIN TO SEE THE ATTRIBUTES OF THE


ADDRESS_TY DATATYPE.
SELECT ATTR_NAME,LENGTH,ATTR_TYPE_NAME FROM USER_TYPE_ATTRS
WHERE TYPE_NAME = 'ADDRESS_TY';
SQL> /
ATTR_NAME
LENGTH
ATTR_TYPE_NAME
------------------------------ ---------- -----------------------------STREET
10
VARCHAR2
CITY
10
VARCHAR2
STATE
10
VARCHAR2
ZIP
NUMBER
INSERTING RECORDS IN TO THE CUSTOMER TABLE:

1 INSERT INTO CUSTOMER VALUES


2* (1,PERSON_TY('PAVAN',ADDRESS_TY('RAMNAGAR','HYD','A.P',500044)))
SQL> /
1 row created.
1 INSERT INTO CUSTOMER VALUES
2* (2,PERSON_TY('GAYATRI',ADDRESS_TY('RAMNAGAR','HYD','A.P',500044)))
3 /
1 row created.

1 INSERT INTO CUSTOMER VALUES


2* (3,PERSON_TY('GAYATRIJI',ADDRESS_TY('RAMNAGAR','HYD','A.P',500044)))
SQL> /

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

349

1 row created.
SQL> DESC CUSTOMER
Name
Null? Type
----------------------------------------------- -------- -------------------------------CUSTOMER_ID
NUMBER
PERSON
PERSON_TY

SELECTING RECORDS IN TO THE CUSTOMER TABLE:

SQL> SELECT * FROM CUSTOMER;


CUSTOMER_ID
----------PERSON(NAME, ADDRESS(STREET, CITY, STATE, ZIP))
-----------------------------------------------------------------------------------------1
PERSON_TY('PAVAN', ADDRESS_TY('RAMNAGAR', 'HYD', 'A.P', 500044))
2
PERSON_TY('GAYATRI', ADDRESS_TY('RAMNAGAR', 'HYD', 'A.P', 500044))
3
PERSON_TY('GAYATRIJI', ADDRESS_TY('RAMNAGAR', 'HYD', 'A.P', 500044))
SQL> SELECT CUSTOMER_ID FROM CUSTOMER;
CUSTOMER_ID
----------1
2
3

SQL> SELECT CUSTOMER_ID,CLIENT.PERSON.NAME FROM CUSTOMER CLIENT;


CUSTOMER_ID PERSON.NAM
----------- ---------1 PAVAN

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

350

2 GAYATRI
3 GAYATRIJI
SQL> DESC CUSTOMER
Name
Null? Type
----------------------------------------------- -------- -------------------------------CUSTOMER_ID
NUMBER
PERSON
PERSON_TY
SQL> DESC PERSON_TY
Name
Null? Type
----------------------------------------------- -------- -------------------------------NAME
VARCHAR2(10)
ADDRESS
ADDRESS_TY

SQL> DESC ADDRESS_TY


Name
Null? Type
----------------------------------------------- -------- -------------------------------STREET
VARCHAR2(10)
CITY
VARCHAR2(10)
STATE
VARCHAR2(10)
ZIP
NUMBER
UPDATING RECORDS IN TO THE CUSTOMER TABLE:
1 SELECT CUSTOMER_ID,CLIENT.PERSON.NAME,
2* CLIENT.PERSON.ADDRESS.CITY FROM CUSTOMER CLIENT.
SQL> /
CUSTOMER_ID PERSON.NAM PERSON.ADD
----------- ---------- ---------1
PAVAN
HYD
2
GAYATRI
HYD
3
GAYATRIJI
HYD

SQL> UPDATE CUSTOMER CLIENT


2 SET CLIENT.PERSON.ADDRESS.CITY='NEW YORK'
3 WHERE CLIENT.PERSON.NAME='GAYATRIJI';
1 row updated.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

351

SQL> SELECT CUSTOMER_ID,CLIENT.PERSON.NAME,


2 CLIENT.PERSON.ADDRESS.CITY FROM CUSTOMER CLIENT;
CUSTOMER_ID PERSON.NAM PERSON.ADD
----------- ---------- ---------1
PAVAN
HYD
2
GAYATRI
HYD
3
GAYATRIJI
NEW YORK

DELETING RECORDS IN TO THE CUSTOMER TABLE:

SQL> DELETE FROM CUSTOMER CLIENT


2 WHERE CLIENT.PERSON.NAME='PAVAN';
1 ROW DELETED.
SQL> SELECT CUSTOMER_ID,CLIENT.PERSON.NAME,
2 CLIENT.PERSON.ADDRESS.CITY FROM CUSTOMER CLIENT;
CUSTOMER_ID PERSON.NAM PERSON.ADD
----------- ---------- ---------2 GAYATRI
HYD
3 GAYATRIJI
NEW YORK
OBJECT VIEWS:
WHAT IF TABLES ALREADY EXIST?

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

352

WHAT IF A RELATIONAL DATABASE APPLICATION IS ALREADY CREATED AND


EXISTING AND OBJECT-RELATIONAL CONCEPTS ARE TO BE IMPLEMENTED IN THE
APPLICATION WITHOUT REBUILDING AND RECREATING THE ENTIRE APPLICATION.
THE NEED WOULD BE THE ABLITY TO OVELAY OBJECT-ORIENTED STRUCTURES,SUCH
AS ABSTRACT DATATYPES ON EXISTING RELATIONAL TABLES.
ORACLE PROVIDES OBJECT-VIEWS AS A MEANS FOR DOING THIS.
FOR CREATING OBJECT VIEWS BASED ON EXISTING RELATIONAL
TABLES,THE ORDER OF OPERATION IS:

CREATE THE CUSTOMER TABLE.(RETATIONAL TYPE USING 8I/9I DATA TYPES)


CREATE THE ADDRESS_TY DATATYPE.
CREATE THE PERSON_TYPE DATA TYPE USING ADDRESS_TY DATATYPE.
CREATE THE CUSTOMER_TY DATA TYPE USING PERSON_TY DATATYPE.
CREATE THE CUSTOMER_OV OBJECT VIEW,USING THE DEFINED DATATYPES.

CREATE THE CUSTOMER TABLE.(RETATIONAL TYPE USING 8I/9I DATA


TYPES):
1 CREATE TABLE CUSTOMER1
2 (CUSTOMER_ID NUMBER PRIMARY KEY,
3 NAME

VARCHAR2(10),

4 STREET

VARCHAR2(10),

5 CITY
6 STATE
7* ZIP
SQL> /

VARCHAR2(10),
VARCHAR2(10),
NUMBER(10))

Table created.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

353

CREATE THE ADDRESS_TY DATATYPE:

1 CREATE OR REPLACE TYPE ADDRESS_TY1 AS OBJECT


2 (STREET

VARCHAR2(10),

3 CITY

VARCHAR2(10),

4 STATE

VARCHAR2(10),

5* ZIP

NUMBER(10));

SQL> /
Type created.

CREATE THE PERSON_TYPE DATA TYPE USING ADDRESS_TY DATATYPE:


1 CREATE OR REPLACE TYPE PERSON_TY1 AS OBJECT
2 (NAME VARCHAR2(10),
3* ADDRESS ADDRESS_TY1);
4 /
Type created.

CREATE THE CUSTOMER_TY DATA TYPE USING PERSON_TY DATATYPE:


1 CREATE OR REPLACE TYPE CUSTOMER_TY1 AS OBJECT
2 (CUSTOMER_ID NUMBER,
3* PERSON PERSON_TY);
SQL> /
Type created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

354

CREATE THE CUSTOMER_OV OBJECT VIEW,USING THE DEFINED


DATATYPES:
SQL> CREATE OR REPLACE VIEW CUSTOMER_VIEW
2 (CUSTOMER_ID,PERSON)
3 AS
4

SELECT CUSTOMER_ID,PERSON_TY1

(NAME,ADDRESS_TY1(STREET,CITY,STATE,ZIP))

FROM CUSTOMER1;

View created.
SQL> SELECT * FROM CUSTOMER_VIEW;
no rows selected

INSERTING VALUES IN TO CUSTOMER1 TABLE VIA TABLE:


1 INSERT INTO CUSTOMER1
2 VALUES
3* (1,'PAVAN','RAMNAGAR','HYD','AP',500044)
SQL> /
1 row created.
1 INSERT INTO CUSTOMER1
2 VALUES
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

355

3* (2,'GAYATRI','RAMNAGAR','HYD','AP',500044)
4 /
1 row created.
1 INSERT INTO CUSTOMER1
2 VALUES
3* (3,'GAYATRIJI','RAMNAGAR','HYD','AP',500044)
SQL> /
1 row created.
SELECTING VALUES THROUGH OBJECT VIEWS:
SQL> SELECT * FROM CUSTOMER_VIEW;
CUSTOMER_ID
----------PERSON(NAME, ADDRESS(STREET, CITY, STATE, ZIP))
-----------------------------------------------------------------------------------------1
PERSON_TY1('PAVAN', ADDRESS_TY1('RAMNAGAR', 'HYD', 'AP', 500044))
2
PERSON_TY1('GAYATRI', ADDRESS_TY1('RAMNAGAR', 'HYD', 'AP', 500044))
3
PERSON_TY1('GAYATRIJI', ADDRESS_TY1('RAMNAGAR', 'HYD', 'AP', 500044))

INSERTING VALUES THROUGH OBJECT VIEW:


1 INSERT INTO CUSTOMER_VIEW
2 VALUES
3* (4,PERSON_TY1('GAYAANGEL',

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

356

ADDRESS_TY1('RAMNAGAR','HYD','AP',500044)))
SQL> /
1 row created.
SQL> SELECT * FROM CUSTOMER_VIEW;
CUSTOMER_ID
----------PERSON(NAME, ADDRESS(STREET, CITY, STATE, ZIP))
-----------------------------------------------------------------------------------------1
PERSON_TY1('PAVAN', ADDRESS_TY1('RAMNAGAR', 'HYD', 'AP', 500044))
2
PERSON_TY1('GAYATRI', ADDRESS_TY1('RAMNAGAR', 'HYD', 'AP', 500044))
3
PERSON_TY1('GAYATRIJI', ADDRESS_TY1('RAMNAGAR', 'HYD', 'AP', 500044))
4
PERSON_TY1('GAYAANGEL', ADDRESS_TY1('RAMNAGAR', 'HYD', 'AP', 500044))

UPDATING TABLE VIA OBJECT VIEW:


SQL> UPDATE CUSTOMER_VIEW E
2 SET E.PERSON.ADDRESS.CITY='NEW YORK'
3 WHERE E.PERSON.NAME='PAVAN';
1 row updated.
SQL> SELECT * FROM CUSTOMER1;
CUSTOMER_ID NAME
STREET CITY
STATE
----------- ---------- ---------- ---------- ---------- ---------1 PAVAN
RAMNAGAR NEW YORK AP
2 GAYATRI RAMNAGAR HYD
AP
3 GAYATRIJI RAMNAGAR HYD
AP
4 GAYAANGELRAMNAGAR HYD
AP

ZIP
500044
500044
500044
500044

SQL> SELECT * FROM CUSTOMER_VIEW;


CUSTOMER_ID
-----------

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

357

PERSON(NAME, ADDRESS(STREET, CITY, STATE, ZIP))


-----------------------------------------------------------------------------------------1
PERSON_TY1('PAVAN', ADDRESS_TY1('RAMNAGAR', 'NEW YORK', 'AP', 500044))
2
PERSON_TY1('GAYATRI', ADDRESS_TY1('RAMNAGAR', 'HYD', 'AP', 500044))
3
PERSON_TY1('GAYATRIJI', ADDRESS_TY1('RAMNAGAR', 'HYD', 'AP', 500044))
4
PERSON_TY1('GAYAANGEL', ADDRESS_TY1('RAMNAGAR', 'HYD', 'AP', 50004))
DELETING VALUES THROUGH OBJECT_VIEWS:
SQL> DELETE FROM CUSTOMER_VIEW E
2 WHERE E.CUSTOMER_ID=1;
1 row deleted.
SQL> SELECT * FROM CUSTOMER_VIEW;
CUSTOMER_ID
----------PERSON(NAME, ADDRESS(STREET, CITY, STATE, ZIP))
-----------------------------------------------------------------------------------------2
PERSON_TY1('GAYATRI', ADDRESS_TY1('RAMNAGAR', 'HYD', 'AP', 500044))
3
PERSON_TY1('GAYATRIJI', ADDRESS_TY1('RAMNAGAR', 'HYD', 'AP', 500044))
4
PERSON_TY1('GAYAANGEL', ADDRESS_TY1('RAMNAGAR', 'HYD', 'AP', 50004))
SQL> DELETE FROM CUSTOMER_VIEW E
2 WHERE E.PERSON.NAME='GAYAANGEL';
1 row deleted.
SQL> SELECT * FROM CUSTOMER_VIEW;
CUSTOMER_ID
----------PERSON(NAME, ADDRESS(STREET, CITY, STATE, ZIP))

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

358

-----------------------------------------------------------------------------------------2
PERSON_TY1('GAYATRI', ADDRESS_TY1('RAMNAGAR', 'HYD', 'AP', 500044))
3
PERSON_TY1('GAYATRIJI', ADDRESS_TY1('RAMNAGAR', 'HYD', 'AP', 500044))
SQL> SELECT * FROM CUSTOMER1;
CUSTOMER_ID NAME
STREET CITY
STATE
ZIP
----------- ---------- ---------- ---------- ---------- ---------2 GAYATRI RAMNAGAR HYD
AP
500044
3 GAYATRIJI RAMNAGAR HYD
AP
500044
DBMS_OUTPUT PACKAGE:
SQL> DECLARE
2 V_SAL NUMBER(10);
3 BEGIN
4 SELECT SAL INTO V_SAL FROM EMP
5 WHERE EMPNO=&EMPNO;
6 DBMS_OUTPUT.PUT_LINE(V_SAL);
7 END;
8 /
Enter value for empno: 7369
old 5: WHERE EMPNO=&EMPNO;
new 5: WHERE EMPNO=7369;
PL/SQL procedure successfully completed.
SQL> SET SERVEROUTPUT ON
SQL> /
Enter value for empno: 7369
old 5: WHERE EMPNO=&EMPNO;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

359

new 5: WHERE EMPNO=7369;


800
PL/SQL procedure successfully completed.
SQL> BEGIN
2 DBMS_OUTPUT.DISABLE;
3 END;
4 /
PL/SQL procedure successfully completed.
SQL> DECLARE
2 V_SAL NUMBER(10);
3 BEGIN
4 SELECT SAL INTO V_SAL FROM EMP
5 WHERE EMPNO=&EMPNO;
6 DBMS_OUTPUT.PUT_LINE(V_SAL);
7 END;
8 /
Enter value for empno: 7369
old 5: WHERE EMPNO=&EMPNO;
new 5: WHERE EMPNO=7369;
PL/SQL procedure successfully completed.
SQL> BEGIN
2 DBMS_OUTPUT.ENABLE;
3 END;
4 /
PL/SQL procedure successfully completed.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

360

SQL> DECLARE
2 V_SAL NUMBER(10);
3 BEGIN
4 SELECT SAL INTO V_SAL FROM EMP
5 WHERE EMPNO=&EMPNO;
6 DBMS_OUTPUT.PUT_LINE(V_SAL);
7 END;
8 /
Enter value for empno: 7369
old 5: WHERE EMPNO=&EMPNO;
new 5: WHERE EMPNO=7369;
800
PL/SQL procedure successfully completed.
1 DECLARE
2 BEGIN
3 DBMS_OUTPUT.ENABLE(2000);
4 DBMS_OUTPUT.PUT_LINE('THREE NAMES WILL BE WRITTEN.');
5 DBMS_OUTPUT.PUT('PAVAN');
6 DBMS_OUTPUT.NEW_LINE;
7 DBMS_OUTPUT.PUT('GAYATRI');
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

361

8 DBMS_OUTPUT.NEW_LINE;
9 DBMS_OUTPUT.PUT('PRATHIMA');
10 DBMS_OUTPUT.NEW_LINE;
11* END;
12 /

THREE NAMES WILL BE WRITTEN.


PAVAN
GAYATRI
PRATHIMA
PL/SQL procedure successfully completed.

SQL> SET SERVEROUTPUT OFF


SQL> BEGIN
2 DBMS_OUTPUT.ENABLE(2000);
3 DBMS_OUTPUT.PUT_LINE('THREE NAMES WILL BE WRITTEN.');
4 DBMS_OUTPUT.PUT('PAVAN');
5 DBMS_OUTPUT.NEW_LINE;
6 DBMS_OUTPUT.PUT('GAYATRI');
7 DBMS_OUTPUT.NEW_LINE;
8 DBMS_OUTPUT.PUT('PRATHIMA');
9 DBMS_OUTPUT.NEW_LINE;
10 END;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

362

11 /
PL/SQL procedure successfully completed.
SQL> SET SERVEROUTPUT ON
1 DECLARE
2 THROW_AWAY VARCHAR2(50);
3 NAME1 VARCHAR2(10);
4 NAME2 VARCHAR2(10);
5 NAME3 VARCHAR2(10);
6 STATUS NUMBER;
7 BEGIN
8 DBMS_OUTPUT.GET_LINE(THROW_AWAY,STATUS);
9 DBMS_OUTPUT.GET_LINE(NAME1,STATUS);
10 DBMS_OUTPUT.GET_LINE(NAME2,STATUS);
11 DBMS_OUTPUT.GET_LINE(NAME3,STATUS);
12 DBMS_OUTPUT.PUT_LINE(NAME1||'AND'||NAME2||'AND'||NAME3);
13* END;
SQL> /
PAVAN AND GAYATRI AND PRATHIMA
PL/SQL procedure successfully completed.
UTL_FILE PACKAGE:
1 DECLARE
2 FILE_HANDLE

UTL_FILE.FILE_TYPE;

3 DATA_LINE

VARCHAR2(100);

4 BEGIN
5 FILE_HANDLE :=UTL_FILE.FOPEN('C:\PAVAN','PAVAN.TXT','R');

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

363

6 UTL_FILE.GET_LINE(FILE_HANDLE,DATA_LINE);
7 DBMS_OUTPUT.PUT_LINE(DATA_LINE);
8 UTL_FILE.GET_LINE(FILE_HANDLE,DATA_LINE);
9 DBMS_OUTPUT.PUT_LINE(DATA_LINE);
10 UTL_FILE.GET_LINE(FILE_HANDLE,DATA_LINE);
11 DBMS_OUTPUT.PUT_LINE(DATA_LINE);
12 UTL_FILE.FCLOSE(FILE_HANDLE);
13* END;
SQL> /
PL/SQL procedure successfully completed.
SQL> SET SERVEROUTPUT ON
SQL> /
GOD IS GREAT.
PAVAN IS GOOD BOY.
GAYATRI IS CUTE GIRL.
PL/SQL procedure successfully completed.
1 DECLARE
2 FILE_HANDLE UTL_FILE.FILE_TYPE;
3 DATA_LINE VARCHAR2(100);
4 BEGIN
5 FILE_HANDLE :=UTL_FILE.FOPEN('C:\PAVAN','KUMAR.TXT','W');
6 FOR V_EMP IN (SELECT EMPNO,ENAME,JOB FROM EMP) LOOP
7 UTL_FILE.PUT_LINE(FILE_HANDLE,TO_CHAR(V_EMP.EMPNO)||
8 ',"' || V_EMP.ENAME ||',"'||V_EMP.JOB||'"');

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

364

9 END LOOP;
10 UTL_FILE.FCLOSE(FILE_HANDLE);
11* END;
12 /
PL/SQL procedure successfully completed.

CREATION OF DIRECTORY:

SQL> CREATE OR REPLACE DIRECTORY BALAJI AS 'C:\ORACLE\HANUMAN';


Directory created.
DROPING DIRECTORY:
SQL> DROP DIRECTORY BALAJI;
Directory dropped.

CREATING EXTERNAL TABLE:


1 CREATE TABLE OLDEMP
2 (EMPNO NUMBER,
3 ENAME CHAR(20),
4 JOB CHAR(20))
5 ORGANIZATION EXTERNAL
6 (TYPE ORACLE_LOADER
7 DEFAULT DIRECTORY BALAJI
8 ACCESS PARAMETERS
9 (RECORDS DELIMITED BY NEWLINE
10 BADFILE 'BAD_EMP'
11 LOGFILE 'LOG_EMP'
12 FIELDS TERMINATED BY ','
13 (EMPNO CHAR,
14 ENAME CHAR,
15 JOB CHAR))
16 LOCATION ('EXT.TXT'))

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

365

17 PARALLEL 5
18* REJECT LIMIT 200
19 /
Table created.

SQL> DESC OLDEMP


Name
Null? Type
----------------------------------------------------------------------- ------------------------------------------------------EMPNO
NUMBER
ENAME
CHAR(20)
JOB
CHAR(20)

1 CREATE TABLE NEWEMP


2 (EMPNO NUMBER(10),
3 ENAME VARCHAR2(20),
4* JOB VARCHAR2(20))
SQL> /
Table created.
SQL> INSERT INTO NEWEMP
2 SELECT EMPNO,ENAME,JOB FROM OLDEMP;
4 rows created.

SQL> SELECT * FROM NEWEMP;


EMPNO ENAME
JOB
---------- -------------------- -------------------10 PAVAN
MANAGER
20 GAYATRI
MANAGER
30 PRATHIMA
MANAGER
40 SRIDEVI
MANAGER
SQL> SELECT * FROM OLDEMP;
EMPNO ENAME
JOB
---------- -------------------- -------------------10 PAVAN
MANAGER
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
20 GAYATRI
30 PRATHIMA
40 SRIDEVI

366

MANAGER
MANAGER
MANAGER

SQL> DESC OLDEMP


Name
Null? Type
----------------------------------------------------------------------- ------------------------------------------------------EMPNO
NUMBER
ENAME
CHAR(20)
JOB
CHAR(20)
NVL2:
THE NVL2 FUNCTION EXAMINES THE FIRST EXPRESSION.
IF THE FIRST EXPRESSION IS NOT NULL,THEN NVL2 FUNCTION RETURNS THE
SECOND EXPRESSION.
IF THE FIRST EXPRESSION IS NULL,THEN THE THIRD EXPRESSION IS RETURNED.
SQL> SELECT EMPNO,SAL,COMM,NVL2(COMM,'SAL+COMM','SAL') INCOME
2 FROM EMP;
EMPNO
SAL
COMM INCOME
---------- ---------- ---------- -------7369
800
SAL
7499
1600
300 SAL+COMM
7521
1250
500 SAL+COMM
7566
2975
SAL
7654
1250
1400 SAL+COMM
7698
2850
SAL
7782
2450
SAL
7788
3000
SAL
7839
5000
SAL
7844
1500
0
SAL+COMM
7876
1100
SAL
7900
950
SAL
7902
3000
SAL
7934
1300
SAL
4 rows selected.
SQL> SELECT EMPNO,SAL,COMM,NVL2(COMM,SAL+COMM,SAL) INCOME
2 FROM EMP;
EMPNO
SAL
COMM INCOME
---------- ---------- ---------- ---------7369
800
800
7499
1600
300
1900

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934

1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300

500

1750

1400

2650

367

2975
2850
2450
3000
5000
0

1500
1100
950
3000
1300

14 rows selected.
SQL> SELECT EMPNO,SAL,COMM,SAL+NVL(COMM,0) INCOME FROM EMP;
EMPNO
SAL
COMM INCOME
---------- ---------- ---------- ---------7369
800
800
7499
1600
300
1900
7521
1250
500
1750
7566
2975
2975
7654
1250
1400
2650
7698
2850
2850
7782
2450
2450
7788
3000
3000
7839
5000
5000
7844
1500
0
1500
7876
1100
1100
7900
950
950
7902
3000
3000
7934
1300
1300
14 rows selected.

NULLIF:
THE NULLIF FUNCTION COMPARES TWO EXPRESSIONS.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

368

IF THEY ARE EQUAL,THE FUNCTION RETURNS NULL.


IF THEY ARE NOT EQUAL,THE FUNCTION RETURNS THE FIRST EXPRESSION.
SQL> SELECT ENAME,JOB FROM EMP;
ENAME
JOB
---------- --------SMITH CLERK
ALLEN
SALESMAN
WARD
SALESMAN
JONES
MANAGER
MARTIN SALESMAN
BLAKE
MANAGER
CLARK
MANAGER
SCOTT ANALYST
KING
PRESIDENT
TURNER SALESMAN
ADAMS
CLERK
JAMES CLERK
FORD
ANALYST
MILLER CLERK
14 rows selected.
1 SELECT ENAME,
2 LENGTH(ENAME) "EXPR1",
3 LENGTH(JOB) "EXPR2",
4* NULLIF(LENGTH(ENAME),LENGTH(JOB)) "RESULT" FROM EMP
SQL> /
ENAME
EXPR1
EXPR2
---------- ---------- ---------- ---------SMITH
5
5
ALLEN
5
8
WARD
4
8
JONES
5
7
MARTIN
6
8
BLAKE
5
7
CLARK
5
7
SCOTT
5
7
KING
4
9
4
TURNER
6
8
ADAMS
5
5
JAMES
5
5
FORD
4
7
MILLER
6
5

RESULT
5
4
5
6
5
5
5
6
4
6

14 rows selected.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

369

COALESCE:
THE COALESCE FUNCTION RETURNS THE FIRST NON-NULL EXPRESSION IN THE LIST.
COALESCE(EXPR1,EXPR2,EXPRN)
IN SYNTAX:
EXPR1 RETURNS THIS EXPRESSION IF IT IS NOT NULL.
EXPR2 RETURNS THIS EXPRESSION IF THE FIRST EXPRESSION IS NULL AND THIS
EXPRESSION IS NOT NULL.
EXPRN
NULL.

RETURNS THIS EXPRESSION IF THE PRECEDING EXPRESSIONS ARE

SELECT EMPNO,ENAME,COALESCE(COMM,SAL,10) COMM FROM EMP


ORDER BY COMM;
EMPNO ENAME
COMM
---------- ---------- ---------7844 TURNER
0
7499 ALLEN
300
7521 WARD
500
7369 SMITH
800
7900 JAMES
950
7876 ADAMS
1100
7934 MILLER
1300
7654 MARTIN
1400
7782 CLARK
2450
7698 BLAKE
2850
7566 JONES
2975
7788 SCOTT
3000
7902 FORD
3000
7839 KING
5000
14 rows selected.

1 SELECT EMPNO,ENAME,SAL,COMM,COALESCE(COMM,SAL,10) "COMMISSION"


FROM EMP
2* ORDER BY COMM
SQL> /
EMPNO ENAME
SAL
COMM COMMISSION
---------- ---------- ---------- ---------- ----------

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
7844 TURNER
7499 ALLEN
7521 WARD
7654 MARTIN
7369 SMITH
7566 JONES
7900 JAMES
7934 MILLER
7902 FORD
7876 ADAMS
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING

1500
1600
1250
1250
800
2975

370

0
300
500
1400

0
300
500
1400
800

2975
950
1300

3000

950
1300
3000

1100
2850
2450
3000
5000

1100
2850
2450
3000
5000

14 rows selected.
SQL> INSERT INTO EMP
2 VALUES
3 (1,'PAVAN','MANAGER',7369,'01-DEC-05',NULL,NULL,10);
1 row created.
1 INSERT INTO EMP
2 VALUES
3* (2,'KUMAR','MANAGER',7369,'01-DEC-05',NULL,NULL,10)
SQL> /
1 row created.
SQL> SELECT EMPNO,ENAME,SAL,COMM,COALESCE(COMM,SAL,10) "COMMISSION"
FROM EMP
2 ORDER BY COMM;
EMPNO ENAME
SAL
COMM COMMISSION
---------- ---------- ---------- ---------- ---------7844 TURNER
1500
0
0
7499 ALLEN
1600
300
300
7521 WARD
1250
500
500
7654 MARTIN
1250
1400
1400
7369 SMITH
800
800
7566 JONES
2975
2975
7900 JAMES
950
950
7934 MILLER
1300
1300
2 KUMAR
10
1 PAVAN
10
7902 FORD
3000
3000
7876 ADAMS
1100
1100
7698 BLAKE
2850
2850
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
7782 CLARK
7788 SCOTT
7839 KING

371

2450
3000
5000

2450
3000
5000

16 rows selected.

CURSOR FOR UPDATE CLAUSE:


YOU MAY WANT TO LOCK ROWS BEFORE UPDATE OR DELETE ROWS.
ADD THE FOR UPDATE CLAUSE IN THE CURSOR QUERY TO LOCK THE AFFECTED
ROWS WHEN THE CUSOR IS OPENED.
SELECT FROM ..
FOR UPDATE [OF COLUMN_REFERENCE] [NO WAIT];
IN THE SYNTAX:
COLUMN_REFERENCE : IS A COLUMN IN THE TABLE AGAINST WHICH THE
QUERY IS PERFORMED.(A LIST OF COLUMNS MAY ALSO BE USED);
NO WAIT: RETURNS AN ORACLE ERROR IF THE ROWS ARE LOCKED BY
ANOTHER SESSION. IF YOU WONT SPECIFY IT WAITS UNTILL THE LOCK
RELEASES.
THIS IS USEFUL WHEN YOU WANT TO BASE AN UPDATE ON EXSITING VALUES IN A
ROW. IN THAT CASE,YOU MUST MAKE SURE THE ROW IS NOT CHANGED BY ANOTHER
USER BEFORE THE UPDATE.
THE FOR UPDATE CLAUSE WILL BE THE LAST CLAUSE IN A SELECT STATEMENT EVEN
AFTER ORDER BY.
WHEN EVER YOU COMMIT OR ROLLBACK LOCKS WILL BE RELEASED.
DECLARE
CUSSOR EMP_CURSOR IS
SELECT * FROM EMP WHERE DEPTNO=10 FOR UPDATE OF SAL NOWAIT;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

372

THE WHERE CURRENT OF CLAUSE:


WHERE CURRENT OF CURSOR;
USE CURSORS TO UPDATE OR DELETE THE CURRENT ROW.
INCLUDE THE FOR UPDATE CLAUSE IN THE CURSOR QUERY TO LOCK THE ROWS
FIRST.
USE THE WHERE CURRENT OF CLAUSE TO REFERENCE THE CURRENT ROW FROM AN
EXPLICIT CURSOR.
DECLARE
CURSOR SAL_CURSOR IS
SELECT * FROM EMP WHERE DEPTNO =10
FOR UPDATE OF SALARY NOWAIT;
BEGIN
FOR EMP_RECORD IN SAL_CURSOR
LOOP
IF EMP_RECORD.SAL < 5000 THEN
UPDATE EMP
SET SAL = EMP_RECORD.SAL*1.10
WHERE CURRENT OF SAL_CURSOR;
END IF;
END LOOP;
END;
CREATING INDEXES:
AN INDEX:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

373

IS A SCHEMA OBJECT.
IS USED BY THE ORACLE SERVER TO SPPED UP THE RETRIEVAL OF ROWS BY
USING A POINTER.
CAN REDUCE DISK I/O BY USING A RAPID PATH ACCESS METHOD TO LOCATE
DATA QUICKLY.
IS INDEPENDENT OF THE TABLE IT INDEXES.
IS USED AND MAINTAINED AUTOMATICALLY BY THE ORACLE SERVER.

AUTOMATICALLY:
A UNQUE INDEX IS CREATED AUTOMATICALLY WHEN YOU DEFINE A PRIMARY KEY
OR UNIQUE CONSTRAINT IN A TABLE DEFINITION.
MANUALLY:
USER EXPLICITLY CAN CREATE INDEXES FOR SPEED UP THE ACCESS TO THE ROWS.

CREATING NON-UNIQUE_INDEX:
SQL> CREATE INDEX EMP1_EMPNO_IDX
2 ON EMP1(EMPNO);
Index created.
SQL> SELECT INDEX_NAME,INDEX_TYPE,TABLE_NAME,UNIQUENESS
2 FROM USER_INDEXES;
INDEX_NAME INDEX_TYPE TABLE_NAME
UNIQUENES
------------------------------ --------------------------- ------------------------------ --------EMP1_EMPNO_IDX NORMAL EMP1
NONUNIQUE
PK_DEPT
NORMAL DEPT
UNIQUE
PK_EMP
ORMAL
EMP
UNIQUE

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

374

CREATING UNIQUE_INDEX:

SQL> CREATE UNIQUE INDEX DEPT1_DEPTNO_IDX


2 ON DEPT1(DEPTNO);
Index created.
SQL> SELECT INDEX_NAME,INDEX_TYPE,TABLE_NAME,UNIQUENESS
2 FROM USER_INDEXES;
INDEX_NAME INDEX_TYPE TABLE_NAME
UNIQUENES
------------------------------ --------------------------- ------------------------------ --------DEPT1_DEPTNO_IDX NORMAL DEPT1
UNIQUE
EMP1_EMPNO_IDX
NORMAL EMP1
NONUNIQUE
PK_DEPT
NORMAL DEPT
UNIQUE
PK_EMP
NORMAL EMP
UNIQUE

CREATING COMPOSITE_INDEX:
SQL> CREATE INDEX EMP1_EMPNO_ENAME_IDX
2 ON EMP1(EMPNO,ENAME);
Index created.
SQL> SELECT INDEX_NAME,INDEX_TYPE,TABLE_NAME,UNIQUENESS
2 FROM USER_INDEXES;
INDEX_NAMEINDEX_TYPE TABLE_NAME
UNIQUENES
------------------------------ --------------------------- ------------------------------ --------DEPT1_DEPTNO_IDX NORMAL DEPT1
UNIQUE
EMP1_EMPNO_ENAME_IDX NORMAL EMP1
NONUNIQUE
EMP1_EMPNO_IDX
NORMAL EMP1
NONUNIQUE
PK_DEPT
NORMAL DEPT
UNIQUE
PK_EMP
NORMAL EMP
UNIQUE
CREATING FUNCTIONBASED_INDEX:
SQL> CREATE INDEX DEPT1_FUNDNAME_IDX
2 ON DEPT1(UPPER(DNAME));

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

375

Index created.
SQL> SELECT INDEX_NAME,INDEX_TYPE,TABLE_NAME,UNIQUENESS
2 FROM USER_INDEXES;
CREATING BITMAP_INDEX:

SQL> CREATE BITMAP INDEX BITMAP_EMP1_JOB_IDX


2 ON EMP1(JOB);
Index created.

SELECTING COLUMN NAMES ON WHICH INDEXES CREATED:


1 SELECT UC.INDEX_NAME,UC.COLUMN_NAME,UI.UNIQUENESS
2 FROM USER_INDEXES UI,USER_IND_COLUMNS UC
3 WHERE UI.INDEX_NAME=UC.INDEX_NAME
4* AND UC.TABLE_NAME = 'EMP1'
SQL> /
INDEX_NAME
-----------------------------COLUMN_NAME
--------------------------------------------------------------------------------------------------------------------------------UNIQUENES
--------EMP1_EMPNO_IDX
EMPNO
NONUNIQUE
EMP1_EMPNO_ENAME_IDX
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

376

EMPNO
NONUNIQUE
EMP1_EMPNO_ENAME_IDX
ENAME
NONUNIQUE
BITMAP_EMP1_JOB_IDX
JOB
NONUNIQUE
REMOVING INDEX:
DROP INDEX INDEX_NAME;
WHEN TO CREATE AN INDEX:
A COLUMN CONTAINS A WIDE RANGE OF VALUES.
A COLUMN CONTAINS LARGE NUMBER OF NULL VALES.
ONE OR MORE COLUMNS ARE FREQUENTLY USED TOGETHER
IN A WHERE CLAUSE.

WHEN TO NOT CREATE AN INDEX:

THE TABLE IS SMALL.


THE COLUMNS ARE NOT OFTEN USED AS CONDITION IN THE QUERY.
THE TABLE IS UPDATED FREQUENTLY.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

377

BREAK (SQL * PLUS COMMAND):


TO SUPRESS DUPLICATES WE USE BREAK IN SQL PROMPT.
SQL> BREAK ON JOB
SQL> SELECT * FROM EMP ORDER BY JOB;
EMPNO ENAME JOB MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7788 SCOTT ANALYST 7566 19-APR-87 3000
20
7902 FORD
7566 03-DEC-81 3000
20
7369 SMITH CLERK
7902 17-DEC-80 800
7876 ADAMS
7788 23-MAY-87 1100
20
7934 MILLER
7782 23-JAN-82 1300
10
7900 JAMES
7698 03-DEC-81 950
30
7566 JONES MANAGER 7839 02-APR-81 2975
20
7782 CLARK
7839 09-JUN-81 2450
10
7698 BLAKE
7839 01-MAY-81 2850
30
7839 KING PRESIDENT
17-NOV-81 5000
10
7499 ALLEN SALESMAN 7698 20-FEB-81 1600
300
30
7654 MARTIN
7698 28-SEP-81 1250
1400
30
7844 TURNER
7698 08-SEP-81 1500
0
30
7521 WARD
7698 22-FEB-81 1250
500
30

20

14 rows selected.
SQL> CLEAR BREAK;
breaks cleared
SQL> SELECT * FROM EMP ORDER BY JOB;
EMPNO ENAMEJOB MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7788 SCOTT ANALYST 7566 19-APR-87
3000
20
7902 FORD
ANALYST 7566 03-DEC-81
3000
20
7369 SMITH
CLERK
7902 17-DEC-80
800
20
7876 ADAMS CLERK
7788 23-MAY-87
1100
20
7934 MILLER CLERK
7782 23-JAN-82
1300
10
7900 JAMES
CLERK
7698 03-DEC-81
950
30
7566 JONES
MANAGER 7839 02-APR-81
2975
20
7782 CLARK
MANAGER 7839 09-JUN-81
2450
10
7698 BLAKE
MANAGER 7839 01-MAY-81
2850
30
7839 KING
PRESIDENT
17-NOV-81
5000
10
7499 ALLEN
SALESMAN 7698 20-FEB-81
1600
300
30
7654 MARTIN SALESMAN 7698 28-SEP-81
1250
1400
30
7844 TURNER SALESMAN7698 08-SEP-81
1500
0
30
7521 WARD
SALESMAN 7698 22-FEB-81
1250
500
30

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

378

14 rows selected.

VARRAYS:
VARRAYS ARE SIMILAR TO C OR JAVA ARRAYS.
ARRAY IS COLLECTION OF SIMILAR DATATYPES.
SQL> CREATE TABLE FRIENDS
2 (NAME VARCHAR2(10),
3 FRIEND_NAME VARCHAR2(10));
Table created.
SQL> ALTER TABLE FRIENDS
2 ADD CONSTRAINT FRIENDS_PK PRIMARY KEY(NAME);
Table altered.
SQL> INSERT INTO FRIENDS
2 VALUES
3 ('PAVAN','RAM');
1 row created.
1 INSERT INTO FRIENDS
2 VALUES
3* ('PAVAN','SRIRAM')
SQL> /
INSERT INTO FRIENDS
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.FRIENDS_PK) violated

SQL> ALTER TABLE FRIENDS


2 DROP CONSTRAINT FRIENDS_PK;
Table altered.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

379

SQL> INSERT INTO FRIENDS


2 VALUES
3 ('PAVAN','SRIRAM');
1 row created.
1 INSERT INTO FRIENDS
2 VALUES
3* ('PAVAN','GAYATRI')
SQL> /
1 row created.
1 INSERT INTO FRIENDS
2 VALUES
3* ('PAVAN','SRI DEVI')
SQL> /
1 row created.
1 INSERT INTO FRIENDS
2 VALUES
3* ('BALAJI','SRI DEVI')
SQL> /
1 row created.
1 INSERT INTO FRIENDS
2 VALUES
3* ('BALAJI','GAYATRI')
SQL> /
1 row created.
1 INSERT INTO FRIENDS
2 VALUES
3* ('BALAJI','PRATHIMA')
SQL> /
1 row created.

1 INSERT INTO FRIENDS


2 VALUES
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

380

3* ('HANUMAN','PRATHIMA')
SQL> /
1 row created.
1 INSERT INTO FRIENDS
2 VALUES
3* ('HANUMAN','SRI DEVI')
SQL> /
1 row created.
1 INSERT INTO FRIENDS
2 VALUES
3* ('HANUMAN','SUNDARI')
SQL> /
1 row created.
SQL> SELECT * FROM FRIENDS;
NAME
FRIEND_NAM
---------- ---------PAVAN
RAM
PAVAN
SRIRAM
PAVAN
GAYATRI
PAVAN
SRI DEVI
BALAJI
SRI DEVI
BALAJI
GAYATRI
BALAJI
PRATHIMA
HANUMAN PRATHIMA
HANUMAN SRI DEVI
HANUMAN SUNDARI
10 rows selected.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

381

CREATION OF VARRAY:
SQL> CREATE OR REPLACE TYPE FRIENDS_NAME AS VARRAY(5) OF VARCHAR2(10);
2 /
Type created.

CREATING TABLE USING VARRAY:

SQL> CREATE TABLE FRIENDS1


2 (NAME VARCHAR2(10),
3 FRIEND_NAME FRIENDS_NAME);
Table created.
SQL> ALTER TABLE FRIENDS1
2 ADD CONSTRAINT FRIENDS1_PK PRIMARY KEY(NAME);
Table altered.
DESCRIBING THE TABLE:

SQL> DESC FRIENDS1


Name
Null? Type
----------------------------------------------------------------------- ------------------------------------------------------NAME
NOT NULL VARCHAR2(10)
FRIEND_NAME
FRIENDS_NAME
1 SELECT COLUMN_NAME,DATA_TYPE
2 FROM USER_TAB_COLUMNS
3* WHERE TABLE_NAME='FRIENDS1'
SQL> /
COLUMN_NAME
-----------------------------DATA_TYPE
---------------------------------------------------------------------------------------------------------NAME

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

382

VARCHAR2
FRIEND_NAME
FRIENDS_NAME
1 SELECT TYPECODE,ATTRIBUTES
2 FROM USER_TYPES
3* WHERE TYPE_NAME='FRIENDS_NAME'
SQL> /
TYPECODE
ATTRIBUTES
------------------------------ ---------COLLECTION
0

SQL> SELECT COLL_TYPE,ELEM_TYPE_OWNER,ELEM_TYPE_NAME,


UPPER_BOUND,LENGTH
2 FROM USER_COLL_TYPES
3 WHERE TYPE_NAME='FRIENDS_NAME';
COLL_TYPE
ELEM_TYPE_OWNER
ELEM_TYPE_NAME
UPPER_BOUND LENGTH
------------------------------ ------------------------------ ------------------------------ ----------- ---------VARYING ARRAY
VARCHAR2
5
10

INSERTING VALUES IN TO THE TABLE:

1 INSERT INTO FRIENDS1


2 VALUES
3* ('PAVAN',FRIENDS_NAME('RAM','SRIRAM','GAYATRI','SRI DEVI'))
4 /
1 row created.
1 INSERT INTO FRIENDS1
2 VALUES
3* ('BALAJI',FRIENDS_NAME('PRATHIMA','GAYATRI','SRI DEVI'))
4 /
1 row created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

383

1 INSERT INTO FRIENDS1


2 VALUES
3* ('HANUMAN',FRIENDS_NAME('PRATHIMA','GAYATRI','SUNDARI'))
SQL> /
1 row created.

SELECTING VALUES FROM THE TABLE:

SQL> SELECT * FROM FRIENDS1;


NAME
---------FRIEND_NAME
--------------------------------------------------------------------------------------------------------------------------------PAVAN
FRIENDS_NAME('RAM', 'SRIRAM', 'GAYATRI', 'SRI DEVI')
BALAJI
FRIENDS_NAME('PRATHIMA', 'GAYATRI', 'SRI DEVI')
HANUMAN
FRIENDS_NAME('PRATHIMA', 'GAYATRI', 'SUNDARI')
SELECTING VALUES FROM THE TABLE USING CURSOR:
1 DECLARE
2 CURSOR C IS SELECT * FROM FRIENDS1;
3 BEGIN
4 FOR C_REC IN C LOOP
5 DBMS_OUTPUT.PUT_LINE('NAME: ' ||C_REC.NAME);
6 FOR I IN 1.. C_REC.FRIEND_NAME.COUNT LOOP
7 DBMS_OUTPUT.PUT_LINE(C_REC.FRIEND_NAME(I));
8 END LOOP;
9 END LOOP;
10* END;
SQL> /
PL/SQL procedure successfully completed.
SQL> SET SERVEROUTPUT ON
SQL> /
NAME: PAVAN

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

384

RAM
SRIRAM
GAYATRI
SRI DEVI
NAME: BALAJI
PRATHIMA
GAYATRI
SRI DEVI
NAME: HANUMAN
PRATHIMA
GAYATRI
SUNDARI
PL/SQL procedure successfully completed.
1 SELECT F.NAME,N.*
2* FROM FRIENDS1 F, TABLE(F.FRIEND_NAME) N
3 /
NAME
COLUMN_VAL
---------- ---------PAVAN
RAM
PAVAN
SRIRAM
PAVAN
GAYATRI
PAVAN
SRI DEVI
BALAJI
PRATHIMA
BALAJI
GAYATRI
BALAJI
SRI DEVI
HANUMAN PRATHIMA
HANUMAN GAYATRI
HANUMAN SUNDARI
10 rows selected.
CREATING NUMBER VARRAY:
1 DECLARE
2 TYPE NUMBERS IS VARRAY(20) OF NUMBER(3);
3 V_LIST1 NUMBERS := NUMBERS(1,2,3,4,5);
4 V_LIST2 NUMBERS;
5 BEGIN
6 FOR I IN 1..V_LIST1.COUNT LOOP
7 DBMS_OUTPUT.PUT_LINE(V_LIST1(I));
8 END LOOP;
9 DBMS_OUTPUT.PUT_LINE('COUNT:'||V_LIST1.COUNT);
10* END;
SQL> /
1

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

385

2
3
4
5
COUNT:5
PL/SQL procedure successfully completed.
1 DECLARE
2 TYPE NUMBERS IS VARRAY(5) OF NUMBER(3);
3 V_LIST1 NUMBERS := NUMBERS(1,2,3,4,5);
4 V_LIST2 NUMBERS;
5 BEGIN
6 FOR I IN 1..V_LIST1.COUNT LOOP
7 DBMS_OUTPUT.PUT_LINE(V_LIST1(I));
8 END LOOP;
9 DBMS_OUTPUT.PUT_LINE('COUNT:'||V_LIST1.COUNT);
10* END;
SQL> /
1
2
3
4
5
COUNT:5
PL/SQL procedure successfully completed.
1 DECLARE
2 TYPE NUMBERS IS VARRAY(5) OF NUMBER(3);
3 V_LIST1 NUMBERS := NUMBERS(1,2,3,4,5);
4 BEGIN
5 FOR I IN 1..V_LIST1.COUNT LOOP
6 DBMS_OUTPUT.PUT_LINE(V_LIST1(I));
7 END LOOP;
8 DBMS_OUTPUT.PUT_LINE('COUNT:'||V_LIST1.COUNT);
9* END;
10 /
1
2
3
4
5
COUNT:5
PL/SQL procedure successfully completed.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

386

1 DECLARE
2 TYPE NUMBERS IS VARRAY(6) OF NUMBER(3);
3 V_LIST1 NUMBERS := NUMBERS(1,2,3,4,5);
4 BEGIN
5 FOR I IN 1..V_LIST1.COUNT LOOP
6 DBMS_OUTPUT.PUT_LINE(V_LIST1(I));
7 END LOOP;
8 DBMS_OUTPUT.PUT_LINE('COUNT:'||V_LIST1.COUNT);
9 V_LIST1.EXTEND;
10 V_LIST1(6):=6;
11 DBMS_OUTPUT.PUT_LINE(V_LIST1(6));
12* END;
SQL> /
1
2
3
4
5
COUNT:5
6
PL/SQL procedure successfully completed.

1 DECLARE
2 TYPE NUMBERS IS VARRAY(6) OF NUMBER(3);
3 V_LIST1 NUMBERS := NUMBERS(1,2,3,4,5);
4 BEGIN
5 FOR I IN 1..V_LIST1.COUNT LOOP
6 DBMS_OUTPUT.PUT_LINE(V_LIST1(I));
7 END LOOP;
8 DBMS_OUTPUT.PUT_LINE('COUNT:'||V_LIST1.COUNT);
9 V_LIST1.EXTEND;
10 V_LIST1(6):=6;
11 V_LIST1.EXTEND;
12 DBMS_OUTPUT.PUT_LINE(V_LIST1(6));
13* END;
SQL> /
1
2
3
4
5
COUNT:5
DECLARE
*
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

387

ERROR at line 1:
ORA-06532: Subscript outside of limit
ORA-06512: at line 11

1 DECLARE
2 TYPE NUMBERS IS VARRAY(6) OF NUMBER(3);
3 V_LIST1 NUMBERS := NUMBERS(1,2,3,4,5);
4 BEGIN
5 FOR I IN 1..V_LIST1.COUNT LOOP
6 DBMS_OUTPUT.PUT_LINE(V_LIST1(I));
7 END LOOP;
8 DBMS_OUTPUT.PUT_LINE('COUNT:'||V_LIST1.COUNT);
9 V_LIST1.EXTEND;
10 V_LIST1(6):=6;
11 DBMS_OUTPUT.PUT_LINE(V_LIST1(6));
12 DBMS_OUTPUT.PUT_LINE('LIMIT:'||V_LIST1.COUNT);
13* END;
14 /
1
2
3
4
5
COUNT:5
6
LIMIT:6
PL/SQL procedure successfully completed.

1 DECLARE
2 TYPE NUMBERS IS VARRAY(6) OF NUMBER(3);
3 V_LIST1 NUMBERS := NUMBERS(1,2,3,4,5);
4 BEGIN
5 FOR I IN 1..V_LIST1.COUNT LOOP
6 DBMS_OUTPUT.PUT_LINE(V_LIST1(I));
7 END LOOP;
8 DBMS_OUTPUT.PUT_LINE('COUNT:'||V_LIST1.COUNT);
9 V_LIST1.EXTEND;
10 V_LIST1(6):=6;
11 DBMS_OUTPUT.PUT_LINE(V_LIST1(6));
12 DBMS_OUTPUT.PUT_LINE('LIMIT:'||V_LIST1.COUNT);
13 DBMS_OUTPUT.PUT_LINE('COUNT:'||V_LIST1.COUNT);
14* END;
SQL> /
1
2
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

388

3
4
5
COUNT:5
6
LIMIT:6
COUNT:6
PL/SQL procedure successfully completed.
1 DECLARE
2 TYPE NUMBERS IS VARRAY(6) OF NUMBER(3);
3 V_LIST1 NUMBERS := NUMBERS(1,2,3,4,5);
4 BEGIN
5 FOR I IN 1..V_LIST1.COUNT LOOP
6 DBMS_OUTPUT.PUT_LINE(V_LIST1(I));
7 END LOOP;
8 DBMS_OUTPUT.PUT_LINE('COUNT:'||V_LIST1.COUNT);
9 V_LIST1.EXTEND;
10 V_LIST1(6):=6;
11 DBMS_OUTPUT.PUT_LINE(V_LIST1(6));
12 DBMS_OUTPUT.PUT_LINE('LIMIT:'||V_LIST1.COUNT);
13 DBMS_OUTPUT.PUT_LINE('COUNT:'||V_LIST1.COUNT);
14 DBMS_OUTPUT.PUT_LINE('FIRST:'||V_LIST1.FIRST);
15 DBMS_OUTPUT.PUT_LINE('LAST:'||V_LIST1.LAST);
16 DBMS_OUTPUT.PUT_LINE('PRIOR:'||V_LIST1.PRIOR(2));
17 DBMS_OUTPUT.PUT_LINE('NEXT:'||V_LIST1.NEXT(2));
18* END;
19 /
1
2
3
4
5
COUNT:5
6
LIMIT:6
COUNT:6
FIRST:1
LAST:6
PRIOR:1
NEXT:3
PL/SQL procedure successfully completed.
1 DECLARE
2 TYPE NUMBERS IS VARRAY(6) OF NUMBER(3);
3 V_LIST1 NUMBERS := NUMBERS(1,2,3,4,5);
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

389

4 BEGIN
5 FOR I IN 1..V_LIST1.COUNT LOOP
6 DBMS_OUTPUT.PUT_LINE(V_LIST1(I));
7 END LOOP;
8 DBMS_OUTPUT.PUT_LINE('COUNT:'||V_LIST1.COUNT);
9 V_LIST1.EXTEND;
10 V_LIST1(6):=6;
11 DBMS_OUTPUT.PUT_LINE(V_LIST1(6));
12 DBMS_OUTPUT.PUT_LINE('LIMIT:'||V_LIST1.COUNT);
13 DBMS_OUTPUT.PUT_LINE('COUNT:'||V_LIST1.COUNT);
14 DBMS_OUTPUT.PUT_LINE('FIRST:'||V_LIST1.FIRST);
15 DBMS_OUTPUT.PUT_LINE('LAST:'||V_LIST1.LAST);
16 DBMS_OUTPUT.PUT_LINE('PRIOR:'||V_LIST1.PRIOR(2));
17 DBMS_OUTPUT.PUT_LINE('NEXT:'||V_LIST1.NEXT(2));
18* END;
SQL> /
1
2
3
4
5
COUNT:5
6
LIMIT:6
COUNT:6
FIRST:1
LAST:6
PRIOR:1
NEXT:3
PL/SQL procedure successfully completed.

NESTED TABLES:
CREATING FRIEND TYPE:
1 CREATE OR REPLACE TYPE FRIEND_TY AS OBJECT
2 (NAME VARCHAR2(10),
3 CITY VARCHAR2(10),
4 STATE VARCHAR2(10),
5* COUNTRY VARCHAR2(10));
SQL> /
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

390

Type created.
CONVERTING FRIEND_TY AS NESTED TABLE:
THE FROEND_TY CONTAINS RECORD FOR EACH FRIEND. TO USE THIS DATA TYPE AS
THE BASIS FOR A NESTED TABLE,YOU NEED TO CREATE NEW DATA TYPE.
SQL> CREATE TYPE FRIEND_NT AS TABLE OF FRIEND_TY;
2 /
Type created.
AS TABLE OF CLAUSE OF THIS CRETE TYPE COMMAND TELLS ORACLE THAT YOU
WILL BE USING THIS TYPE AS THE BASIS FOR A NESTED TABLE.
THE FRIEND_NT STORES MULTIPLE ROWS.
CREATING TABLE USING NESTED TABLE:
SQL> CREATE TABLE FRIENDS_NESTED
2 (NAME VARCHAR2(10),
3 FRIENDS FRIEND_NT)
4 NESTED TABLE FRIENDS STORE AS FRIEND_NT_TAB;
Table created.
FIRST COLUMN IS NAME,THE SECOND COLUMN IS A COLUMN NAMED FRIENDS
WHOSE DEFINITION IS THE NESTED TABLE FRIEND_NT.
WHEN CREATING THE TABLE THAT INCLUDES A NESTED TABLE,YOU MUST SPECIFY
THE NAME OF THE TABLE THAT WILL BE USED TO STORE THE NESTED TABLES
DATA.THAT IS ,THE DATA FOR THE NESTED TABLE IS NOT STORED INLINE WITH THE
REST OF THE TABLES DATA.INSTEAD,IT IS STORED APART FROM THE MAIN
TABLE.THE DATA IN THE FRIENDS COLUMN WILL BE STORED IN ONE TABLE,AND THE
DATA IN THE NAME COLUMN WILL BE STORED IN A SEPARATE TABLE.
ORACLE WILL MAINTAIN POINTERS BETWEEN THE TABLES.
HERE THE OUT_OF_LINE DATA FOR THE NESTED TABLE IS STORED IN A TABLE
NAMED FRIEND_NT_TAB.
INSERTING INTO NESTED TABLE:
1 INSERT INTO FRIENDS_NESTED
2 VALUES

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

391

3 ('PAVAN',FRIEND_NT
4 (FRIEND_TY('GAYATRI','HYD','AP','INDIA'),
5 FRIEND_TY('SRIDEVI','HYD','AP','INDIA'),
6* FRIEND_TY('PRATHIMA','HYD','AP','INDIA')))
SQL> /
1 row created.
1 INSERT INTO FRIENDS_NESTED
2 VALUES
3 ('KUMAR',FRIEND_NT
4 (FRIEND_TY('GAYATRI','HYD','AP','INDIA'),
5 FRIEND_TY('SRIDEVI','HYD','AP','INDIA'),
6* FRIEND_TY('PRATHIMA','HYD','AP','INDIA')))
7 /
1 row created.

1 INSERT INTO FRIENDS_NESTED


2 VALUES
3 ('SRIRAM',FRIEND_NT
4 (FRIEND_TY('SHILPA','HYD','AP','INDIA'),
5 FRIEND_TY('SRIDEVI','HYD','AP','INDIA'),
6* FRIEND_TY('LALITHA','HYD','AP','INDIA')))
7 /
1 row created.
1 INSERT INTO FRIENDS_NESTED
2 VALUES
3 ('RAVIKANTH',FRIEND_NT
4 (FRIEND_TY('USGIRL','HYD','AP','INDIA'),
5 FRIEND_TY('SRIDEVI','HYD','AP','INDIA'),
6* FRIEND_TY('LALITHA','HYD','AP','INDIA')))
7 /
1 row created.

DESCRIBING THE NESTED TABLE:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

392

SQL> SET DESCRIBE DEPTH 2


SQL> DESC FRIENDS_NESTED
Name
Null? Type
----------------------------------------------------------------------- ------------------------------------------------------NAME
VARCHAR2(10)
FRIENDS
FRIEND_NT
NAME
VARCHAR2(10)
CITY
VARCHAR2(10)
STATE
VARCHAR2(10)
COUNTRY
VARCHAR2(10)
SELECTING FROM NESTED TABLE:
SQL> SELECT * FROM FRIENDS_NESTED;
NAME
---------FRIENDS(NAME, CITY, STATE, COUNTRY)
--------------------------------------------------------------------------------------------------------------------------------PAVAN
FRIEND_NT(FRIEND_TY('GAYATRI', 'HYD', 'AP', 'INDIA'), FRIEND_TY('SRIDEVI', 'HYD',
'AP', 'INDIA'), FRIEND_TY('PRATHIMA', 'HYD', 'AP
', 'INDIA'))
KUMAR
FRIEND_NT(FRIEND_TY('GAYATRI', 'HYD', 'AP', 'INDIA'), FRIEND_TY('SRIDEVI', 'HYD',
'AP', 'INDIA'), FRIEND_TY('PRATHIMA', 'HYD', 'AP
', 'INDIA'))
SRIRAM
FRIEND_NT(FRIEND_TY('SHILPA', 'HYD', 'AP', 'INDIA'), FRIEND_TY('SRIDEVI', 'HYD', 'AP',
'INDIA'), FRIEND_TY('LALITHA', 'HYD', 'AP',
'INDIA'))
RAVIKANTH
FRIEND_NT(FRIEND_TY('USGIRL', 'HYD', 'AP', 'INDIA'), FRIEND_TY('SRIDEVI', 'HYD', 'AP',
'INDIA'), FRIEND_TY('LALITHA', 'HYD', 'AP',
'INDIA'))

1 SELECT NAME,N.NAME,N.CITY,N.STATE,N.COUNTRY FROM FRIENDS_NESTED,


2* TABLE(FRIENDS_NESTED.FRIENDS) N
SQL> /

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

393

SELECT NAME,N.NAME,N.CITY,N.STATE,N.COUNTRY FROM FRIENDS_NESTED,


*
ERROR at line 1:
ORA-00918: column ambiguously defined

1 SELECT FRIENDS_NESTED.NAME,N.NAME,N.CITY,N.STATE,N.COUNTRY FROM


FRIENDS_NESTED,
2* TABLE(FRIENDS_NESTED.FRIENDS) N
SQL> /
NAME
NAME
CITY
STATE
---------- ---------- ---------- ---------- ---------PAVAN
GAYATRI HYD
AP
INDIA
PAVAN
SRIDEVI HYD
AP
INDIA
PAVAN
PRATHIMA
HYD
AP
KUMAR
GAYATRI
HYD
AP
KUMAR
SRIDEVI
HYD
AP
KUMAR
PRATHIMA
HYD
AP
SRIRAM SHILPA HYD
AP
INDIA
SRIRAM SRIDEVI
HYD
AP
SRIRAM LALITHA
HYD
AP
RAVIKANTH USGIRL
HYD
AP
RAVIKANTH SRIDEVI
HYD
AP
RAVIKANTH LALITHA
HYD
AP

COUNTRY

INDIA
INDIA
INDIA
INDIA
INDIA
INDIA
INDIA
INDIA
INDIA

12 rows selected.

1 SELECT FRIENDS_NESTED.NAME,N.NAME,N.CITY,N.STATE,N.COUNTRY FROM


FRIENDS_NESTED,
2 TABLE(FRIENDS_NESTED.FRIENDS) N
3* WHERE FRIENDS_NESTED.NAME='PAVAN'
4 /
NAME
NAME
CITY
STATE COUNTRY
---------- ---------- ---------- ---------- ---------PAVAN
GAYATRI HYD
AP
INDIA
PAVAN
SRIDEVI HYD
AP
INDIA
PAVAN
PRATHIMAHYD
AP
INDIA
1 SELECT FRIENDS_NESTED.NAME,N.NAME,N.CITY,N.STATE,N.COUNTRY FROM
FRIENDS_NESTED,
2 TABLE(FRIENDS_NESTED.FRIENDS) N
3* WHERE N.NAME='SRIDEVI'
4 /

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

394

NAME
NAME
CITY
STATE COUNTRY
---------- ---------- ---------- ---------- ---------PAVAN
SRIDEVI HYD
AP
INDIA
KUMAR
SRIDEVI HYD
AP
INDIA
SRIRAM SRIDEVI HYD
AP
INDIA
RAVIKANTH SRIDEVI HYD
AP
INDIA
INSERTING ONLY TO NESTED TABLE FOR ONE RECORD:
SQL> INSERT INTO TABLE (SELECT FRIENDS FROM FRIENDS_NESTED
2 WHERE NAME='PAVAN')
3 VALUES
4 (FRIEND_TY('NEELIMA','WALES','CARDIF','LONDON'));
1 row created.
SQL> SELECT FRIENDS_NESTED.NAME,N.NAME,N.CITY,N.STATE,N.COUNTRY FROM
FRIENDS_NESTED,
2 TABLE(FRIENDS_NESTED.FRIENDS) N
3 WHERE FRIENDS_NESTED.NAME='PAVAN';
NAME
NAME
CITY
STATE COUNTRY
---------- ---------- ---------- ---------- ---------PAVAN
GAYATRI HYD
AP
INDIA
PAVAN
SRIDEVI HYD
AP
INDIA
PAVAN
PRATHIMA
HYD
AP
INDIA
PAVAN
NEELIMA
WALES CARDIF
LONDON
UPDATING NESTED TABLE:
SQL> UPDATE TABLE (SELECT FRIENDS FROM FRIENDS_NESTED
2 WHERE NAME='PAVAN') N
3 SET N.COUNTRY='USA'
4 WHERE N.NAME='SRIDEVI';
1 row updated.
SQL> SELECT FRIENDS_NESTED.NAME,N.NAME,N.CITY,N.STATE,N.COUNTRY FROM
FRIENDS_NESTED,
2 TABLE(FRIENDS_NESTED.FRIENDS) N
3 WHERE FRIENDS_NESTED.NAME='PAVAN';
NAME
NAME
CITY
STATE COUNTRY
---------- ---------- ---------- ---------- ---------PAVAN
GAYATRI HYD
AP
INDIA
PAVAN
SRIDEVI HYD
AP
USA
PAVAN
PRATHIMA HYD
AP
INDIA
PAVAN
NEELIMA WALES
CARDIF LONDON

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

395

DELETING FROM NESTED TABLE:


1 DELETE TABLE(SELECT FRIENDS FROM FRIENDS_NESTED
2 WHERE NAME='PAVAN') N
3* WHERE N.NAME='PRATHIMA'
SQL> /
1 row deleted.

SQL> SELECT FRIENDS_NESTED.NAME,N.NAME,N.CITY,N.STATE,N.COUNTRY FROM


FRIENDS_NESTED,
2 TABLE(FRIENDS_NESTED.FRIENDS) N
3 WHERE FRIENDS_NESTED.NAME='PAVAN';
NAME
NAME
CITY
STATE COUNTRY
---------- ---------- ---------- ---------- ---------PAVAN
GAYATRI HYD
AP
INDIA
PAVAN
SRIDEVI HYD
AP
USA
PAVAN
NEELIMA WALES
CARDIF LONDON
CREATING NUMBER NESTED AND VARRAYS:
SQL> CREATE OR REPLACE TYPE NUMTAB AS TABLE OF NUMBER;
2 /
Type created.
SQL> CREATE OR REPLACE TYPE NUMVAR AS VARRAY(25) OF NUMBER;
2 /
Type created.
COUNT AND EXISTS:
COUNT GIVES NO OF ELEMENTS.
SQL> DECLARE
2 V_NESTEDTABLE NUMTAB :=NUMTAB(-7,14.3,3.1415,NULL,0);
3 V_COUNT NUMBER(2):=1;
4 BEGIN
5 LOOP
6 IF V_NESTEDTABLE.EXISTS(V_COUNT) THEN
7 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||V_COUNT||'):' ||
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

396

8 V_NESTEDTABLE(V_COUNT));
9 V_COUNT :=V_COUNT+1;
10 ELSE
11 EXIT;
12 END IF;
13 END LOOP;
14 END;
15 /
PL/SQL procedure successfully completed.

SQL> SET SERVEROUTPUT ON


SQL> /
V_NESTEDTABLE(1):-7
V_NESTEDTABLE(2):14.3
V_NESTEDTABLE(3):3.1415
V_NESTEDTABLE(4):
V_NESTEDTABLE(5):0
PL/SQL procedure successfully completed.
1 DECLARE
2 V_NESTEDTABLE NUMTAB :=NUMTAB(1,2,3);
3 V_VARRY NUMVAR := NUMVAR(-1,-2,-3,-4);
4 V_COUNT NUMBER(2):=1;
5 BEGIN
6 DBMS_OUTPUT.PUT_LINE('NESTED TABLE COUNT '||
7 V_NESTEDTABLE.COUNT);
8 DBMS_OUTPUT.PUT_LINE('VARRAY COUNT '||
9 V_VARRY.COUNT);
10* END;
11 /
NESTED TABLE COUNT 3
VARRAY COUNT 4
PL/SQL procedure successfully completed.
LIMIT:
LIMIT WILL GIVE NO OF ELEMENTS AT TIME OF DECLARATION.
1 DECLARE
2 V_NESTEDTABLE NUMTAB :=NUMTAB(1,2,3);
3 V_VARRY NUMVAR := NUMVAR(-1,-2,-3,-4);

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

397

4 V_COUNT NUMBER(2):=1;
5 BEGIN
6 DBMS_OUTPUT.PUT_LINE('NESTED TABLE COUNT '||
7 V_NESTEDTABLE.COUNT);
8 DBMS_OUTPUT.PUT_LINE('NESTED TABLE LIMIT '||
9 V_NESTEDTABLE.LIMIT);
10 DBMS_OUTPUT.PUT_LINE('VARRAY COUNT '||
11 V_VARRY.COUNT);
12 DBMS_OUTPUT.PUT_LINE('VARRAY LIMIT '||
13 V_VARRY.LIMIT);
14* END;
15 /
NESTED TABLE COUNT 3
NESTED TABLE LIMIT
VARRAY COUNT 4
VARRAY LIMIT 25
PL/SQL procedure successfully completed.

FIRST,LAST,NEXT,PRIOR:
1 DECLARE
2 V_NESTEDTABLE NUMTAB :=NUMTAB(1,2,3);
3 V_VARRY NUMVAR := NUMVAR(-1,-2,-3,-4);
4 V_COUNT NUMBER(2):=1;
5 BEGIN
6 DBMS_OUTPUT.PUT_LINE('NESTED TABLE FIRST '||
7 V_NESTEDTABLE.FIRST);
8 DBMS_OUTPUT.PUT_LINE('NESTED TABLE LAST '||
9 V_NESTEDTABLE.LAST);
10 DBMS_OUTPUT.PUT_LINE('NESTED TABLE PRIOR OF 2 '||
11 V_NESTEDTABLE.PRIOR(2));
12 DBMS_OUTPUT.PUT_LINE('NESTED TABLE NEXT OF 2 '||
13 V_NESTEDTABLE.NEXT(2));
14 DBMS_OUTPUT.PUT_LINE('VARRAY FIRST '||
15 V_VARRY.FIRST);
16 DBMS_OUTPUT.PUT_LINE('VARRAY LAST '||
17 V_VARRY.LAST);
18 DBMS_OUTPUT.PUT_LINE('VARRAY PRIOR OF 2 '||
19 V_VARRY.PRIOR(2));
20 DBMS_OUTPUT.PUT_LINE('VARRAY NEXT OF 2 '||
21 V_VARRY.NEXT(2));
22* END;
23 /
NESTED TABLE FIRST 1
NESTED TABLE LAST 3

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

398

NESTED TABLE PRIOR OF 2 1


NESTED TABLE NEXT OF 2 3
VARRAY FIRST 1
VARRAY LAST 4
VARRAY PRIOR OF 2 1
VARRAY NEXT OF 2 3
PL/SQL procedure successfully completed.
EXTEND:
1 DECLARE
2 V_NESTEDTABLE NUMTAB :=NUMTAB(1,2,3,4,5);
3 V_VARRY NUMVAR := NUMVAR(1,2,3,4,5);
4 BEGIN
5 BEGIN
6 V_NESTEDTABLE(26):=7;
7 EXCEPTION
8 WHEN SUBSCRIPT_BEYOND_COUNT THEN
9 DBMS_OUTPUT.PUT_LINE(SQLCODE||SQLERRM);
10 END;
11 V_NESTEDTABLE.EXTEND(30);
12 V_NESTEDTABLE(26):=7;
13
14
15
16
17
18

BEGIN
V_VARRY.EXTEND(30);
EXCEPTION
WHEN SUBSCRIPT_OUTSIDE_LIMIT THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||SQLERRM);
END;

19 V_VARRY.EXTEND(20);
20 V_VARRY(25):=25;
21* END;
SQL> /
-6533ORA-06533: Subscript beyond count
-6532ORA-06532: Subscript outside of limit
PL/SQL procedure successfully completed.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

399

1 DECLARE
2 V_NESTEDTABLE NUMTAB :=NUMTAB(1,2,3,4,5);
3 V_VARRY NUMVAR := NUMVAR(1,2,3,4,5);
4 BEGIN
5 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
6 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
7 V_NESTEDTABLE(C));
8 END LOOP;
9* END;
10 /
V_NESTEDTABLE(1)1
V_NESTEDTABLE(2)2
V_NESTEDTABLE(3)3
V_NESTEDTABLE(4)4
V_NESTEDTABLE(5)5
PL/SQL procedure successfully completed.

1 DECLARE
2 V_NESTEDTABLE NUMTAB :=NUMTAB(10,20,30,40,50);
3 V_VARRY NUMVAR := NUMVAR(1,2,3,4,5);
4 BEGIN
5 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
6 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
7 V_NESTEDTABLE(C));
8 END LOOP;
9* END;
SQL> /
V_NESTEDTABLE(1)10
V_NESTEDTABLE(2)20
V_NESTEDTABLE(3)30
V_NESTEDTABLE(4)40
V_NESTEDTABLE(5)50
PL/SQL procedure successfully completed.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

400

TRIM:
TRIM WILL REMOVE ELEMENTS FROM END.
1 DECLARE
2 V_NESTEDTABLE NUMTAB :=NUMTAB(10,20,30,40,50);
3 V_VARRY NUMVAR := NUMVAR(1,2,3,4,5);
4 BEGIN
5 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
6 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
7 V_NESTEDTABLE(C));
8 END LOOP;
9 DBMS_OUTPUT.PUT_LINE('OUTPUT AFTER TRIM');
10 V_NESTEDTABLE.TRIM;
11 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
12 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
13 V_NESTEDTABLE(C));
14 END LOOP;
15* END;
16 /
V_NESTEDTABLE(1)10
V_NESTEDTABLE(2)20
V_NESTEDTABLE(3)30
V_NESTEDTABLE(4)40
V_NESTEDTABLE(5)50
OUTPUT AFTER TRIM
V_NESTEDTABLE(1)10
V_NESTEDTABLE(2)20
V_NESTEDTABLE(3)30
V_NESTEDTABLE(4)40
PL/SQL procedure successfully completed.

1 DECLARE
2 V_NESTEDTABLE NUMTAB :=NUMTAB(10,20,30,40,50);
3 V_VARRY NUMVAR := NUMVAR(1,2,3,4,5);
4 BEGIN
5 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
6 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
7 V_NESTEDTABLE(C));
8 END LOOP;
9 DBMS_OUTPUT.PUT_LINE('OUTPUT AFTER TRIM.');
10 V_NESTEDTABLE.TRIM;
11 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
12 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

401

13 V_NESTEDTABLE(C));
14 END LOOP;
15 DBMS_OUTPUT.PUT_LINE('OUTPUT AFTER TRIM(3)');
16 V_NESTEDTABLE.TRIM(3);
17 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
18 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
19 V_NESTEDTABLE(C));
20 END LOOP;
21* END;
SQL> /
V_NESTEDTABLE(1)10
V_NESTEDTABLE(2)20
V_NESTEDTABLE(3)30
V_NESTEDTABLE(4)40
V_NESTEDTABLE(5)50
OUTPUT AFTER TRIM.
V_NESTEDTABLE(1)10
V_NESTEDTABLE(2)20
V_NESTEDTABLE(3)30
V_NESTEDTABLE(4)40
OUTPUT AFTER TRIM(3)
V_NESTEDTABLE(1)10
PL/SQL procedure successfully completed.
DELETE:
1 DECLARE
2 V_NESTEDTABLE NUMTAB :=NUMTAB(10,20,30,40,50);
3 BEGIN
4 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
5 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
6 V_NESTEDTABLE(C));
7 END LOOP;
8 DBMS_OUTPUT.PUT_LINE('OUTPUT AFTER DELETE.');
9 V_NESTEDTABLE.DELETE;
10 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
11 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
12 V_NESTEDTABLE(C));
13 END LOOP;
14* END;
15 /
V_NESTEDTABLE(1)10
V_NESTEDTABLE(2)20
V_NESTEDTABLE(3)30
V_NESTEDTABLE(4)40
V_NESTEDTABLE(5)50
OUTPUT AFTER DELETE.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

402

PL/SQL procedure successfully completed.


1 DECLARE
2 V_NESTEDTABLE NUMTAB :=NUMTAB(10,20,30,40,50);
3 BEGIN
4 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
5 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
6 V_NESTEDTABLE(C));
7 END LOOP;
8 DBMS_OUTPUT.PUT_LINE('OUTPUT AFTER DELETE(2).');
9 V_NESTEDTABLE.DELETE(2);
10 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
11 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
12 V_NESTEDTABLE(C));
13 END LOOP;
14* END;
SQL> /
V_NESTEDTABLE(1)10
V_NESTEDTABLE(2)20
V_NESTEDTABLE(3)30
V_NESTEDTABLE(4)40
V_NESTEDTABLE(5)50
OUTPUT AFTER DELETE(2).
V_NESTEDTABLE(1)10
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 11
1 DECLARE
2 V_NESTEDTABLE NUMTAB :=NUMTAB(10,20,30,40,50);
3 BEGIN
4 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
5 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
6 V_NESTEDTABLE(C));
7 END LOOP;
8 DBMS_OUTPUT.PUT_LINE('OUTPUT AFTER DELETE(2,4).');
9 V_NESTEDTABLE.DELETE(2,4);
10 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
11 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
12 V_NESTEDTABLE(C));
13 END LOOP;
14* END;
15 /
V_NESTEDTABLE(1)10
V_NESTEDTABLE(2)20
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

403

V_NESTEDTABLE(3)30
V_NESTEDTABLE(4)40
V_NESTEDTABLE(5)50
OUTPUT AFTER DELETE(2,4).
V_NESTEDTABLE(1)10
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 11
1 DECLARE
2 V_NESTEDTABLE NUMTAB :=NUMTAB(10,20,30,40,50,60,70,80);
3 BEGIN
4 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
5 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
6 V_NESTEDTABLE(C));
7 END LOOP;
8 DBMS_OUTPUT.PUT_LINE('OUTPUT AFTER DELETE(2,4).');
9 V_NESTEDTABLE.DELETE(2,4);
10 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
11 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
12 V_NESTEDTABLE(C));
13 END LOOP;
14 EXCEPTION
15 WHEN NO_DATA_FOUND THEN
16 FOR C IN 5..V_NESTEDTABLE.COUNT LOOP
17 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
18 V_NESTEDTABLE(C));
19 END LOOP;
20* END;
SQL> /
V_NESTEDTABLE(1)10
V_NESTEDTABLE(2)20
V_NESTEDTABLE(3)30
V_NESTEDTABLE(4)40
V_NESTEDTABLE(5)50
V_NESTEDTABLE(6)60
V_NESTEDTABLE(7)70
V_NESTEDTABLE(8)80
OUTPUT AFTER DELETE(2,4).
V_NESTEDTABLE(1)10
V_NESTEDTABLE(5)50
PL/SQL procedure successfully completed.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

404

1 DECLARE
2 V_NESTEDTABLE NUMTAB :=NUMTAB(10,20,30,40,50,60,70,80);
3 BEGIN
4 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
5 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
6 V_NESTEDTABLE(C));
7 END LOOP;
8 DBMS_OUTPUT.PUT_LINE('OUTPUT AFTER DELETE(2,4).');
9 V_NESTEDTABLE.DELETE(2,4);
10 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
11 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
12 V_NESTEDTABLE(C));
13 END LOOP;
14 EXCEPTION
15 WHEN NO_DATA_FOUND THEN
16 FOR C IN 5..V_NESTEDTABLE.COUNT LOOP
17 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
18 V_NESTEDTABLE(C));
19 END LOOP;
20* END;
21 /
V_NESTEDTABLE(1)10
V_NESTEDTABLE(2)20
V_NESTEDTABLE(3)30
V_NESTEDTABLE(4)40
V_NESTEDTABLE(5)50
V_NESTEDTABLE(6)60
V_NESTEDTABLE(7)70
V_NESTEDTABLE(8)80
OUTPUT AFTER DELETE(2,4).
V_NESTEDTABLE(1)10
V_NESTEDTABLE(5)50
PL/SQL procedure successfully completed.
1 DECLARE
2 V_NESTEDTABLE NUMTAB :=NUMTAB(10,20,30,40,50,60,70,80);
3 V_COUNT NUMBER :=V_NESTEDTABLE.COUNT;
4 BEGIN
5 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
6 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
7 V_NESTEDTABLE(C));
8 END LOOP;
9 DBMS_OUTPUT.PUT_LINE('OUTPUT AFTER DELETE(2,4).');
10 V_NESTEDTABLE.DELETE(2,4);
11 FOR C IN 1..V_NESTEDTABLE.COUNT LOOP
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

405

12 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
13 V_NESTEDTABLE(C));
14 END LOOP;
15 EXCEPTION
16 WHEN NO_DATA_FOUND THEN
17 FOR C IN 5..V_COUNT LOOP
18 DBMS_OUTPUT.PUT_LINE('V_NESTEDTABLE('||C||')'||
19 V_NESTEDTABLE(C));
20 END LOOP;
21* END;
22 /
V_NESTEDTABLE(1)10
V_NESTEDTABLE(2)20
V_NESTEDTABLE(3)30
V_NESTEDTABLE(4)40
V_NESTEDTABLE(5)50
V_NESTEDTABLE(6)60
V_NESTEDTABLE(7)70
V_NESTEDTABLE(8)80
OUTPUT AFTER DELETE(2,4).
V_NESTEDTABLE(1)10
V_NESTEDTABLE(5)50
V_NESTEDTABLE(6)60
V_NESTEDTABLE(7)70
V_NESTEDTABLE(8)80
PL/SQL procedure successfully completed.

STORED SUBPROGRAMS AND THE DATA DICTIONARY:

SQL> CREATE OR REPLACE PROCEDURE SIMPLE


2 AS
3 V_COUNTER NUMBER;
4 BEGIN
5 V_COUNTER:=7;
6 END;
7 /
Procedure created.
SQL> SELECT OBJECT_NAME,OBJECT_TYPE,STATUS
2 FROM USER_OBJECTS
3 WHERE OBJECT_NAME='SIMPLE';
OBJECT_NAME
-------------------------------------------------------------------------------OBJECT_TYPE
STATUS
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

406

------------------ ------SIMPLE
PROCEDURE
VALID
SQL> SELECT TEXT FROM USER_SOURCE
2 WHERE NAME='SIMPLE';
TEXT
---------------------------------------------------------------------------------------------------PROCEDURE SIMPLE
AS
V_COUNTER NUMBER;
BEGIN
V_COUNTER:=7;
END;
6 rows selected.
SQL> SELECT LINE,POSITION,TEXT
2 FROM USER_ERRORS
3 WHERE NAME='SIMPLE'
4 /
no rows selected
SQL> CREATE OR REPLACE PROCEDURE SIMPLE
2 AS
3 V_COUNTER NUMBER;
4 BEGIN
5 V_COUNTER:=7;
6 END
7 /
Warning: Procedure created with compilation errors.
SQL> SELECT OBJECT_NAME,OBJECT_TYPE,STATUS
2 FROM USER_OBJECTS
3 WHERE OBJECT_NAME='SIMPLE';
OBJECT_NAME
---------------------------------------------------------------------------------------------------OBJECT_TYPE
STATUS
------------------ ------SIMPLE
PROCEDURE
INVALID
SQL> SELECT TEXT FROM USER_SOURCE
2 WHERE NAME='SIMPLE';
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

407

TEXT
---------------------------------------------------------------------------------------------------PROCEDURE SIMPLE
AS
V_COUNTER NUMBER;
BEGIN
V_COUNTER:=7;
END
6 rows selected.

SQL> SELECT LINE,POSITION,TEXT


2 FROM USER_ERRORS
3 WHERE NAME='SIMPLE';
LINE POSITION
---------- ---------TEXT
---------------------------------------------------------------------------------------------------6
3
PLS-00103: Encountered the symbol "end-of-file" when expecting one of
the following:
; <an identifier> <a double-quoted delimited-identifier>
delete exists prior <a single-quoted SQL string>
The symbol ";" was substituted for "end-of-file" to continue.

CALLING UN COMPILED STORED PROCEDURE:


SQL> BEGIN
2 SIMPLE;
3 END;
4 /
SIMPLE;
*
ERROR at line 2:
ORA-06550: line 2, column 1:
PLS-00905: object SCOTT.SIMPLE is invalid

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

408

ORA-06550: line 2, column 1:


PL/SQL: Statement ignored
LOCAL SUBPROGRAMS:
A LOCAL SUBPROGRAM,DECLARED IN THE DECLARATIVE SECTION OF A PL/SQL
BLOCK.
1 DECLARE
2 CURSOR C IS SELECT EMPNO,ENAME FROM EMP;
3 V_FORMATTEDNAME VARCHAR2(100);
4 FUNCTION FORMATNAME(P_EMPNO NUMBER,P_ENAME VARCHAR2)
5 RETURN VARCHAR2
6 IS
7 BEGIN
8 RETURN P_EMPNO||' HAS NAME '||P_ENAME;
9 END FORMATNAME;
10 BEGIN
11 FOR C1 IN C
12 LOOP
13 V_FORMATTEDNAME:=FORMATNAME(C1.EMPNO,C1.ENAME);
14 DBMS_OUTPUT.PUT_LINE(V_FORMATTEDNAME);
15 END LOOP;
16* END;
SQL> /
7369 HAS NAME SMITH
7499 HAS NAME ALLEN
7521 HAS NAME WARD
7566 HAS NAME JONES
7654 HAS NAME MARTIN
7698 HAS NAME BLAKE
7782 HAS NAME CLARK
7788 HAS NAME SCOTT
7839 HAS NAME KING
7844 HAS NAME TURNER
7876 HAS NAME ADAMS
7900 HAS NAME JAMES
7902 HAS NAME FORD
7934 HAS NAME MILLER
PL/SQL procedure successfully completed.
LOCAL SUBPROGRAMS AS PART OF STORED SUBPROGRAMS:
1
2
3
4
5

CREATE OR REPLACE PROCEDURE LOCALPROC


AS
CURSOR C IS SELECT EMPNO,ENAME FROM EMP;
V_FORMATTEDNAME VARCHAR2(100);
FUNCTION FORMATNAME(P_EMPNO NUMBER,P_ENAME VARCHAR2)

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

409

6 RETURN VARCHAR2
7 IS
8 BEGIN
9 RETURN P_EMPNO||' HAS NAME '||P_ENAME;
10 END FORMATNAME;
11 BEGIN
12 FOR C1 IN C
13 LOOP
14 V_FORMATTEDNAME:=FORMATNAME(C1.EMPNO,C1.ENAME);
15 DBMS_OUTPUT.PUT_LINE(V_FORMATTEDNAME);
16 END LOOP;
17* END;
18 /
Procedure created.
SQL> BEGIN
2 LOCALPROC;
3 END;
4 /
7369 HAS NAME SMITH
7499 HAS NAME ALLEN
7521 HAS NAME WARD
7566 HAS NAME JONES
7654 HAS NAME MARTIN
7698 HAS NAME BLAKE
7782 HAS NAME CLARK
7788 HAS NAME SCOTT
7839 HAS NAME KING
7844 HAS NAME TURNER
7876 HAS NAME ADAMS
7900 HAS NAME JAMES
7902 HAS NAME FORD
7934 HAS NAME MILLER
PL/SQL procedure successfully completed.
LOCATION OF LOCAL SUBPROGRAMS:
ANY LOCAL SUBPROGRAM MUST BE DECLARED AT THE END OF THE DECLARATIVE
SECTION.
SQL> DECLARE
2 CURSOR C IS SELECT EMPNO,ENAME FROM EMP;
3 V_FORMATTEDNAME VARCHAR2(100);
4 FUNCTION FORMATNAME(P_EMPNO NUMBER,P_ENAME VARCHAR2)
5 RETURN VARCHAR2
6 IS

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

410

7 BEGIN
8 RETURN P_EMPNO||' HAS NAME '||P_ENAME;
9 END FORMATNAME;
10 BEGIN
11 FOR C1 IN C
12 LOOP
13 V_FORMATTEDNAME:=FORMATNAME(C1.EMPNO,C1.ENAME);
14 DBMS_OUTPUT.PUT_LINE(V_FORMATTEDNAME);
15 END LOOP;
16 END;
17 /
7369 HAS NAME SMITH
7499 HAS NAME ALLEN
7521 HAS NAME WARD
7566 HAS NAME JONES
7654 HAS NAME MARTIN
7698 HAS NAME BLAKE
7782 HAS NAME CLARK
7788 HAS NAME SCOTT
7839 HAS NAME KING
7844 HAS NAME TURNER
7876 HAS NAME ADAMS
7900 HAS NAME JAMES
7902 HAS NAME FORD
7934 HAS NAME MILLER
PL/SQL procedure successfully completed.

HERE WE MOVED LOCAL SUBPROGRAM FROM BOTTOM TO TOP,RESULTS A COMPILE


TIME ERROR.
1 DECLARE
2 FUNCTION FORMATNAME(P_EMPNO NUMBER,P_ENAME VARCHAR2)
3 RETURN VARCHAR2
4 IS
5 BEGIN
6 RETURN P_EMPNO||' HAS NAME '||P_ENAME;
7 END FORMATNAME;
8 CURSOR C IS SELECT EMPNO,ENAME FROM EMP;
9 V_FORMATTEDNAME VARCHAR2(100);
10 BEGIN
11 FOR C1 IN C
12 LOOP
13 V_FORMATTEDNAME:=FORMATNAME(C1.EMPNO,C1.ENAME);
14 DBMS_OUTPUT.PUT_LINE(V_FORMATTEDNAME);
15 END LOOP;
16* END;
17 /
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

411

CURSOR C IS SELECT EMPNO,ENAME FROM EMP;


*
ERROR at line 8:
ORA-06550: line 8, column 1:
PLS-00103: Encountered the symbol "CURSOR" when expecting one of the following:
begin function package pragma procedure form
HERE WE HAVE DECLARED LOCAL SUBPROGRAM BEFORE ALL DECLARATIONS- THAT
IS WRONG.
FORWARD DECLARATION:

1 DECLARE
2 V_TEMPVAL NUMBER(10):=5;
3 PROCEDURE A(P_CTR IN OUT NUMBER) IS
4 BEGIN
5 DBMS_OUTPUT.PUT_LINE('A('||P_CTR||')');
6 IF P_CTR > 0 THEN
7 B(P_CTR);
8 P_CTR:=P_CTR-1;
9 END IF;
10 END A;
11 --LOCAL PROCEDURE B THAT CALLS PROCEDURE A IN TOP A CALLS B
PROCEDURE.
12 PROCEDURE B(P_CTR IN OUT NUMBER) IS
13 BEGIN
14 DBMS_OUTPUT.PUT_LINE('B('||P_CTR||')');
15 P_CTR:=P_CTR-1;
16 A(P_CTR);
17 END B;
18 BEGIN
19 B(V_TEMPVAL);
20* END;
SQL> /
B(P_CTR);
*
ERROR at line 7:
ORA-06550: line 7, column 1:
PLS-00201: identifier 'B' must be declared
ORA-06550: line 7, column 1:
PL/SQL: Statement ignored

1
2
3
4

DECLARE
V_TEMPVAL NUMBER(10):=5;
-- TO SLOVE THE PROBLEM THAT WE ENCOUNTERED ABOVE.
-- FORWARD DECLARATION OF PROCEDURE B.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

412

5 PROCEDURE B(P_CTR IN OUT NUMBER);


6 PROCEDURE A(P_CTR IN OUT NUMBER) IS
7 BEGIN
8 DBMS_OUTPUT.PUT_LINE('A('||P_CTR||')');
9 IF P_CTR > 0 THEN
10 B(P_CTR);
11 P_CTR:=P_CTR-1;
12 END IF;
13 END A;
14 --LOCAL PROCEDURE B THAT CALLS PROCEDURE A IN TOP A CALLS B
PROCEDURE.
15 PROCEDURE B(P_CTR IN OUT NUMBER) IS
16 BEGIN
17 DBMS_OUTPUT.PUT_LINE('B('||P_CTR||')');
18 P_CTR:=P_CTR-1;
19 A(P_CTR);
20 END B;
21 BEGIN
22 B(V_TEMPVAL);
23* END;
24 /
B(5)
A(4)
B(4)
A(3)
B(3)
A(2)
B(2)
A(1)
B(1)
A(0)
PL/SQL procedure successfully completed.

OVERLOADING OF LOCAL SUBPROGRAMS:

1 DECLARE

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

413

2 -- OVERLOADING OF LOCAL SUBPROGRAMS


3
4
5
6

PROCEDURE LOCALPROC(P_PARAMETER IN NUMBER) IS


BEGIN
DBMS_OUTPUT.PUT_LINE(P_PARAMETER);
END LOCALPROC;

7 PROCEDURE LOCALPROC(P_PARAMETER IN VARCHAR2) IS


8 BEGIN
9 DBMS_OUTPUT.PUT_LINE(P_PARAMETER);
10 END LOCALPROC ;
11 BEGIN
12 LOCALPROC(12345);
13 LOCALPROC('PAVAN');
14* END;
SQL> /
12345
PAVAN
PL/SQL procedure successfully completed.

SUBPROGRAMS DEPENDENCIES:
SQL> CREATE TABLE EMP1
2 AS
3 SELECT * FROM EMP;
Table created.
SQL> CREATE TABLE TEMP_TABLE
2 (V_EMPNO NUMBER);
Table created.

1 CREATE OR REPLACE PROCEDURE RAISE_SAL

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

414

2 (P_EMPNO IN NUMBER)
3 AS
4 BEGIN
5 UPDATE EMP1
6 SET SAL=SAL+100
7 WHERE EMPNO=P_EMPNO;
8* END;
9 /
Procedure created.

SQL> CREATE OR REPLACE PROCEDURE MAINPROC


2 AS
3 CURSOR C IS SELECT EMPNO FROM EMP1;
4 BEGIN
5 FOR C1 IN C LOOP
6 RAISE_SAL(C1.EMPNO);
7 INSERT INTO TEMP_TABLE VALUES (C1.EMPNO);
8 END LOOP;
9 END;
10 /
Procedure created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

415

1 SELECT OBJECT_NAME,OBJECT_TYPE,STATUS
2 FROM USER_OBJECTS
3* WHERE OBJECT_NAME IN ('RAISE_SAL','MAINPROC')
SQL> /
OBJECT_NAME
---------------------------------------------------------------------------------------------------OBJECT_TYPE
STATUS
------------------ ------MAINPROC
PROCEDURE
VALID
RAISE_SAL
PROCEDURE

VALID

SQL> ALTER TABLE EMP1


2 ADD ADDRESS VARCHAR2(10);
Table altered.
WHEN EVER YOU ALTERED THE TABLE EMP1 THAT WAS USED BY BOTH RAISE_SAL,
MAINPROC PROCEDURES BOTH PROCEDURES STATUS WAS CHANGED TO INVALID.
SQL> SELECT OBJECT_NAME,OBJECT_TYPE,STATUS
2 FROM USER_OBJECTS
3 WHERE OBJECT_NAME IN ('RAISE_SAL','MAINPROC');
OBJECT_NAME
---------------------------------------------------------------------------------------------------OBJECT_TYPE
STATUS
------------------ ------MAINPROC
PROCEDURE
INVALID
RAISE_SAL
PROCEDURE

INVALID

AUTOMATIC RECOMPILATION:
WHEN EVER YOU CALL BOTH PROCEDURES AT THAT TIME BOTH PROCEDURES ARE
COMPILED AND THEIR STATUS CHANGED TO VALID.
SQL> BEGIN
2 MAINPROC;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

416

3 END;
4 /
PL/SQL procedure successfully completed.

SQL> SELECT OBJECT_NAME,OBJECT_TYPE,STATUS


2 FROM USER_OBJECTS
3 WHERE OBJECT_NAME IN ('RAISE_SAL','MAINPROC');
OBJECT_NAME
---------------------------------------------------------------------------------------------------OBJECT_TYPE
STATUS
------------------ ------MAINPROC
PROCEDURE
VALID
RAISE_SAL
PROCEDURE

VALID

WHEN EVER YOU CALL THE PROCEDURE AT THAT TIME IT WILL BE RECOMPILED.
PACKAGES AND DEPENDENCIES:
1 CREATE TABLE DEPT1
2 AS
3* SELECT * FROM DEPT
SQL> /
Table created.
SQL> DELETE FROM DEPT1;
4 rows deleted.
SQL> CREATE OR REPLACE PACKAGE DEPTPACKAGE AS
2 PROCEDURE ADDDEPT(P_DEPTNO IN DEPT1.DEPTNO%TYPE,
3 P_DNAME IN DEPT1.DNAME%TYPE,
4 P_LOC IN DEPT1.LOC%TYPE);
5 END DEPTPACKAGE;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

417

6 /
Package created.

1 CREATE OR REPLACE PACKAGE BODY DEPTPACKAGE AS


2 PROCEDURE ADDDEPT(P_DEPTNO IN DEPT1.DEPTNO%TYPE,
3 P_DNAME IN DEPT1.DNAME%TYPE,
4 P_LOC IN DEPT1.LOC%TYPE)
5 IS
6 BEGIN
7 INSERT INTO DEPT1
8 VALUES
9 (P_DEPTNO,P_DNAME,P_LOC);
10 END ADDDEPT;
11* END DEPTPACKAGE;
12 /
Package body created.
1 SELECT OBJECT_NAME,OBJECT_TYPE,STATUS FROM USER_OBJECTS
2* WHERE OBJECT_NAME = 'DEPTPACKAGE'
SQL> /
OBJECT_NAME
---------------------------------------------------------------------------------------------------I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

418

OBJECT_TYPE
STATUS
------------------ ------DEPTPACKAGE
PACKAGE
VALID
DEPTPACKAGE
PACKAGE BODY

VALID

SQL> DROP TABLE DEPT1;


Table dropped.
WHENEVER WE DROP TABLE DEPT1 BOTH PACKAGE HEADER AND PACKAGE BODY
STATUS WAS CHANGED TO INVALID.BCOZ BOTH HEADER AND BODY WERE USING
THE DEPT1 TABLE.

SQL> SELECT OBJECT_NAME,OBJECT_TYPE,STATUS FROM USER_OBJECTS


2 WHERE OBJECT_NAME = 'DEPTPACKAGE';
OBJECT_NAME
---------------------------------------------------------------------------------------------------OBJECT_TYPE
STATUS
------------------ ------DEPTPACKAGE
PACKAGE
INVALID
DEPTPACKAGE
PACKAGE BODY

INVALID

SQL> CREATE TABLE DEPT1


2 AS
3 SELECT * FROM DEPT;
Table created.
1 CREATE OR REPLACE PACKAGE DEPTPACKAGE AS
2 PROCEDURE ADDDEPT(P_DEPTNO IN NUMBER,
3 P_DNAME IN VARCHAR2,
4 P_LOC IN VARCHAR2);
5* END DEPTPACKAGE;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

419

SQL> /
Package created.
1 CREATE OR REPLACE PACKAGE BODY DEPTPACKAGE AS
2 PROCEDURE ADDDEPT(P_DEPTNO IN NUMBER,
3 P_DNAME IN VARCHAR2,
4 P_LOC IN VARCHAR2)
5 IS
6 BEGIN
7 INSERT INTO DEPT1
8 VALUES
9 (P_DEPTNO,P_DNAME,P_LOC);
10 END ADDDEPT;
11* END DEPTPACKAGE;
SQL> /
Package body created.

SQL> SELECT OBJECT_NAME,OBJECT_TYPE,STATUS FROM USER_OBJECTS


2 WHERE OBJECT_NAME = 'DEPTPACKAGE';
OBJECT_NAME
---------------------------------------------------------------------------------------------------OBJECT_TYPE
STATUS
------------------ ------DEPTPACKAGE
PACKAGE
VALID
DEPTPACKAGE
PACKAGE BODY

VALID

SQL> DROP TABLE DEPT1;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

420

Table dropped.
HERE I HAVE DROPED DEPT1 THEN PACKAGE HEADERS STATUS WAS NOT CHANGED
TO INVALID ONLY PACKAGE BODY STATUS WAS CHANGED TO INVALID.
SQL> SELECT OBJECT_NAME,OBJECT_TYPE,STATUS FROM USER_OBJECTS
2 WHERE OBJECT_NAME = 'DEPTPACKAGE';
OBJECT_NAME
---------------------------------------------------------------------------------------------------OBJECT_TYPE
STATUS
------------------ ------DEPTPACKAGE
PACKAGE
VALID
DEPTPACKAGE
PACKAGE BODY

INVALID

SQL> CREATE TABLE SIMPLE_TABLE


2 (F1 NUMBER);
Table created.
SQL> CREATE OR REPLACE PACKAGE DEPENDEE AS
2 PROCEDURE EXAMPLE(P_VAL IN NUMBER);
3 END DEPENDEE;
4 /
Package created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

421

1 CREATE OR REPLACE PACKAGE BODY DEPENDEE AS


2 PROCEDURE EXAMPLE(P_VAL IN NUMBER) IS
3 BEGIN
4 INSERT INTO SIMPLE_TABLE VALUES(P_VAL);
5 END EXAMPLE;
6* END DEPENDEE;
SQL> /
Package body created.
SQL> CREATE OR REPLACE PROCEDURE DEPENDER(P_VAL IN NUMBER) AS
2 BEGIN
3 DEPENDEE.EXAMPLE(P_VAL+1);
4 END DEPENDER;
5 /
Procedure created.

SQL> SELECT OBJECT_NAME,OBJECT_TYPE,STATUS


2 FROM USER_OBJECTS
3 WHERE OBJECT_NAME IN ('DEPENDEE','DEPENDER','SIMPLE_TABLE');
OBJECT_NAME
---------------------------------------------------------------------------------------------------OBJECT_TYPE
STATUS
------------------ ------SIMPLE_TABLE
TABLE
VALID
DEPENDER
PROCEDURE

VALID

DEPENDEE
PACKAGE

VALID

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
DEPENDEE
PACKAGE BODY

422

VALID

HERE I CHANGED PACKAGE BODY.


1 CREATE OR REPLACE PACKAGE BODY DEPENDEE AS
2 PROCEDURE EXAMPLE(P_VAL IN NUMBER) IS
3 BEGIN
4 --HERE I CHANGED TO P_VAL TO P_VAL-1
5 INSERT INTO SIMPLE_TABLE VALUES(P_VAL-1);
6 END EXAMPLE;
7* END DEPENDEE;
SQL> /
Package body created.
SQL> SELECT OBJECT_NAME,OBJECT_TYPE,STATUS
2 FROM USER_OBJECTS
3 WHERE OBJECT_NAME IN ('DEPENDEE','DEPENDER','SIMPLE_TABLE');
OBJECT_NAME
---------------------------------------------------------------------------------------------------OBJECT_TYPE
STATUS
------------------ ------SIMPLE_TABLE
TABLE
VALID
DEPENDER
PROCEDURE

VALID

DEPENDEE
PACKAGE

VALID

DEPENDEE
PACKAGE BODY

VALID

HERE DEPENDER IS STILL VALID.


HERE PACKAGE HEADER IS VALID.
IF YOU DROP THE TABLE IT ONLY INVALIDATES THE PACKAGE BODY.
SQL> DROP TABLE SIMPLE_TABLE;
Table dropped.
SQL> SELECT OBJECT_NAME,OBJECT_TYPE,STATUS
2 FROM USER_OBJECTS
3 WHERE OBJECT_NAME IN ('DEPENDEE','DEPENDER','SIMPLE_TABLE');
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

423

OBJECT_NAME
---------------------------------------------------------------------------------------------------OBJECT_TYPE
STATUS
------------------ ------DEPENDER
PROCEDURE
VALID
DEPENDEE
PACKAGE
DEPENDEE
PACKAGE BODY

VALID
INVALID

EXCEPTION PROPAGATION:
EXCEPTIONS CAN OCCUR IN THE DECLARATIVE , THE EXECUTABLE, OR THE
EXCECUTABLE, OR THE EXCEPTION SECTION OF A PL/SQL BLOCK.
IF EXCEPTION IS RAISED IN THE EXECUTABLE SECTION OF THE BLOCK,THEN IF
HANDLER IS THERE THEN IT WILL BE HANDLED THERE.
WHAT IF THERE IS NO HANDLER OR THE EXCEPTION IS RAISED FROM A
DIFFERENTSECTION OF THE BLOCK.
THE PROCESS THAT GOVERNS THIS IS KNOWN AS EXCEPTION PROPAGATION.
EXCEPTION RAISED IN THE EXECUTABLE SECTION:
WHEN EXCEPTION IS RAISED IN THE EXECUTABLE SECTION OF A BLOCK, PL/SQL
USES THE FOLLOWING ALGORITHM TO DETERMINE WHICH EXCEPTION HANDLER TO
INVOKE:
1. IF THE CURRENT BLOCK HAS A HANDLER FOR THE EXCEPTION,EXECUTE IT
AND COMPLETE THE BLOCK SUCESSFULLY.CONTROL THEN PASSES TO
ENCLOSING BLOCK.
2. IF THERE IS NO HANDLER FOR THE CURRENT EXCEPTION,PROPAGATE THE
EXECPTION BY RAISING IT IN THE ENCLOSING BLOCK. STEP 1 WILL THEN BE
EXECUTED FOR THE ENCLOSING BLOCK. IF THERE IS NO ENCLOSING BLOCK,
THE EXCEPTION WILL BE PROPAGATED OUT TO THE CALLING
ENVIRONMENT,SUCH AS SQL*PLUS.
DECLARE
..BEGIN OUTER BLOCK.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

424

..
BEGIN
.
.
DECLARE
.BEGIN INNER BLOCK 1 .
.
BEGIN
.
.
END;
.
BEGIN
.BEGIN INNER BLOCK 2. WHICH IS NOT HAVING DECLARATIVE BLOCK.
.
.
END;
.
.END OF OUTER BLOCK.
END;
IN THE ABOVE BOTH INNER BLOCK 1 AND INNER BLOCK 2 ARE ENCLOSED BY OUTER
BLOCK. IF ANY EXCEPTION RAISED IN INNER BLOCKS THAT WILL BE PROPAGATED TO
OUTER BLOCK.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

425

PROPAGATION EXAMPLE:1

DECLARE
A EXCEPTION;
BEGIN

RAISED
HANDLED
ONLY.

BEGIN
RAISE A;
EXCEPTION
WHEN A THEN

END;

HERE.
HERE

END;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

426

PROPAGATION EXAMPLE:2
IN THIS EXAMPLE , RULE 2 IS APPLIED FOR THE SUB-BLOCK. THE EXCEPTION IS
PROPAGATED TO THE ENCLOSING BLOCK, WHERE RULE 1 IS APPLIED. THE
ENCLOSING BLOCK THEN COMPLETES SUCEESFULLY.

DECLARE
A EXCEPTION;
B EXCEPTION;
BEGIN
BEGIN
RAISE B;
RAISED HERE
NO
THROWNTO
OUTER

EXCEPTION
WHEN A OTHERS
..
END;

HANDLER.
BLOCK.

HERE EXCEPTION HANDLED.


EXCEPTION
WHEN B THEN

END;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

427

PROPAGATION EXAMPLE:3
HERE RULE 2 IS APPLIED FOR THE SUBBLOCK. THE EXCEPTION IS PROPAGATED TO
THE ENCLOSING BLOCK, WHERE THERE IS STILL NO HANDLER FOR IT. RULE 2 IS
APPLIED AGAIN, AND THE ENCLOSING BLOCK COMPLETES UNSUCCESSFULLY WITH
AN UNHANDLED EXCEPTION.

DECLARE
A EXCEPTION;
B EXCEPTION;
C EXCEPTION;
BEGIN
BEGIN
EXCEPTION C IS RAISED
HERENO HANDLER.
THROWN TOOUTER BLOCK.

RAISE C;
EXCEPTION
WHEN A OTHERS
..
END;

HERE ALSO NO EXCEPTION HANDLER FOR C .


EXCEPTION
WHEN B THEN

END;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

428

EXCEPTION RAISED IN THE DECLARATIVE SECTION:


IF AN ASSIGNMENT IN THE DECLARATIVE SECTION RAISES AN EXCEPTION, THE
EXCEPTION IS IMMEDIATELY PROPAGATED TO THE ENCLOSING BLOCK. ONCE
THERE , THE RULES IN GIVEN IN THE PREVIOUS SECTION ARE APPLIED TO
PROPAGATE THE EXCEPTION FURTHER. EVEN IF THERE IS A
HANDLER IN THE CURRENT BLOCK, IT IS NOT EXECUTED.
PROPAGATION EXAMPLE:4

DECLARE
V_NUMBERS NUMBER(3) := ABC;
-- EXCEPTION IS RAISED HERE.EVEN THOUGH
BLOCK HAS WHEN OTHERS IT WONT HANDLE
THIS EXCEPTION. THE BLOCK COMPLETES
UNSUCCESSFULLY.
BEGIN
.

EXCEPTION
WHEN OTHERS THEN

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

429

END;

PROPAGATION EXAMPLE:5
SIMILAR TO EXAMPLE 4, THE VALUE_ERROR EXCEPTION IS RAISED IN THE
DECLARATIVE SECTIONOF THE INNER BLOCK. THE EXCEPTION IS THEN
IMMEDIATELY PROPAGATED TO THE OUTER BLOCK. BECAUSE THE OUTER BLOCK
HAS AN OTHERS EXCEPTION HANDLER, THE EXCEPTION IS HANDLED AND THE
OUTER BLOCK COMPLETES SUCCESSFULLY.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

430

DECLARE
BEGIN
DECLARE
V_NUMBERS NUMBER(3) :=ABC;
BEGIN
.
EXCEPTION
WHEN OTHERS THEN

END;

EXCEPTION
WHEN OTHERS THEN
.
END;

EXCEPTION RAISED IN THE EXCEPTION SECTION:


EXCEPTIONS CAN ALSO BE RAISED WHILE IN AN EXCEPTION HANDLER, EITHER
EXPLICITLY VIA THE RAISE STATEMENT OR IMPLICITLY VIA RUNTIME ERROR.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

431

IN THIS CASE THE EXCEPTION IS PROPAGATED TO THE ENCLOSING BLOCK., LIKE


EXCEPTIONS RAISED IN THE DECLARATIVE SECTION.
PROPAGATION EXAMPLE:6

DECLARE
A EXCEPTION;
B EXCEPTION;
BEGIN
RAISE A;-- EXCEPTION IS RAISED HERE.
EXCEPTION
WHEN A THEN
RAISE B;--EXCEPTION IS HANDLED HERE AND B IS
RAISED HERE.
WHEN B THEN
.EVEN THOUGH FOR B EXCEPTION HANDLER IS
THERE IT WONT EXECUTE. THE EXCEPTION IS
PROPAGATED TO THE OUTER BLOCK.
END;
-- THE BLOCK COMPLETES UN SUCCESSFULLY WITH
UNHANDLED EXCEPTION.

PROPAGATION EXAMPLE:7
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

432

DECLARE
ENABLING

BEGIN
DECLARE
A EXCEPTION;
B EXCEPTION;
BEGIN
RAISE A;--EXCEPTION IS RAISED HERE.
EXCEPTION
WHEN A THEN A IS HANDLED HERE AND B
IS RAISED HERE.
RAISE B;
EVEN THOUGH IT HAS HANDLER BLOCK IN
THIS BLOCK. IT WONT BE EXECUTED HERE.
IT IS PROPAGATED TO THE OUTER BLOCK.
WHEN B THEN
.
END;
EXCEPTION B IS HANDLED IN THE OUTER BLOCK.
EXCEPTION
WHEN B THEN
.
END;
THE BLOCK COMPLETES SUCCESSFULLY AND CONTROL
PASSES TO THE CALLING ENVIRONMENT.

CONSTRAINT:

SQL> CREATE TABLE EXCE_TAB


2 (ROW_ID ROWID,
3 OWNER VARCHAR2(30),
4 TABLE_NAME VARCHAR2(30),
5 CONSTRAINT VARCHAR2(30));
Table created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

433

SQL> CREATE TABLE ENABLE_EXEC


2 (EMPNO NUMBER(10) PRIMARY KEY,
3 ENAME VARCHAR2(10) );
Table created.
SQL> INSERT INTO ENABLE_EXEC
2 VALUES
3 (1,'PAVAN');
1 row created.
1 INSERT INTO ENABLE_EXEC
2 VALUES
3* (2,'KUMAR')
SQL> /
1 row created.
1 INSERT INTO ENABLE_EXEC
2 VALUES
3* (2,'KUMAR')
SQL> /
INSERT INTO ENABLE_EXEC
*
ERROR at line 1:
ORA-00001: unique constraint (D.SYS_C002783) violated
1 ALTER TABLE ENABLE_EXEC
2* DISABLE PRIMARY KEY
3 /
Table altered.
SQL> INSERT INTO ENABLE_EXEC
2 VALUES
3 (2,'BALAJI');
1 row created.
1 INSERT INTO ENABLE_EXEC
2 VALUES
3* (2,'GAYATRI')
4 /
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

434

1 row created.

1 INSERT INTO ENABLE_EXEC


2 VALUES
3* (3,'GAYATRI')
SQL> /
1 row created.
SQL> ALTER TABLE ENABLE_EXEC
2 ENABLE PRIMARY KEY;
ALTER TABLE ENABLE_EXEC
*
ERROR at line 1:
ORA-02437: cannot validate (D.SYS_C002783) - primary key violated
SQL> ALTER TABLE ENABLE_EXEC
2 ENABLE PRIMARY KEY
3 EXCEPTIONS INTO EXCE_TAB;
ALTER TABLE ENABLE_EXEC
*
ERROR at line 1:
ORA-02437: cannot validate (D.SYS_C002783) - primary key violated
SQL> SELECT * FROM EXCE_TAB;
ROW_ID
OWNER
TABLE_NAME
------------------ ------------------------------ -----------------------------CONSTRAINT
-----------------------------AAAH6PAABAAAPCAAAB D
ENABLE_EXEC
SYS_C002783
AAAH6PAABAAAPCAAAC D
SYS_C002783

ENABLE_EXEC

AAAH6PAABAAAPCAAAD D
SYS_C002783

ENABLE_EXEC

1 DELETE FROM ENABLE_EXEC


2* WHERE ROWID IN (SELECT ROW_ID FROM EXCE_TAB)
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

435

SQL> /
3 rows deleted.
SQL> SELECT * FROM ENABLE_EXEC;
EMPNO ENAME
---------- ---------1 PAVAN
3 GAYATRI
SQL> ALTER TABLE ENABLE_EXEC
2 ENABLE PRIMARY KEY;
Table altered.
MERGE STATEMENT:
1 CREATE TABLE EMP_COMPANY
2 (ENAME VARCHAR2(10),
3 CNAME VARCHAR2(10),
4* SAL NUMBER(10))
5 /
Table created.
1 CREATE TABLE EMP_ALL
2 (ENAME VARCHAR2(10),
3* SAL NUMBER(10))
4 /
Table created.
SQL> INSERT INTO EMP_COMPANY
2 VALUES
3 ('ANIL','ACC',1500);
1 row created.
1 INSERT INTO EMP_COMPANY
2 VALUES
3* ('SHANKER','TATA',2000)
4 /
1 row created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

436

1 INSERT INTO EMP_COMPANY


2 VALUES
3* ('JAYA','CMC',1800)
SQL> /
1 row created.
1 INSERT INTO EMP_COMPANY
2 VALUES
3* ('SUNIL','CMC',1700)
SQL> /
1 row created.
1 INSERT INTO EMP_COMPANY
2 VALUES
3* ('VIJAY','TATA',5000)
SQL> /
1 row created.
1 INSERT INTO EMP_COMPANY
2 VALUES
3* ('PRAKASH','TATA',3000)
4 /
1 row created.
1 INSERT INTO EMP_COMPANY
2 VALUES
3* ('AJAY','ACC',8000)
SQL> /
1 row created.
SQL> COMMIT;
Commit complete.
SQL> INSERT INTO EMP_ALL
2 VALUES
3 ('SHANKER',2000);
1 row created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

437

1 INSERT INTO EMP_ALL


2 VALUES
3* ('JAYA',1800)
4 /
1 row created.
1 INSERT INTO EMP_ALL
2 VALUES
3* ('SUNIL',1700)
SQL> /
1 row created.
1 INSERT INTO EMP_ALL
2 VALUES
3* ('VIJAY',5000)
SQL> /
1 row created.
1 INSERT INTO EMP_ALL
2 VALUES
3* ('PRAKASH',3000)
SQL> /
1 row created.
SQL> COMMIT;
Commit complete.
SQL> SELECT * FROM EMP_COMPANY;
ENAME
CNAME
---------- ---------- ---------ANIL
ACC
SHANKER
TATA
JAYA
CMC
SUNIL
CMC
VIJAY
TATA
PRAKASH
TATA
AJAY
ACC

SAL
1500
2000
1800
1700
5000
3000
8000

7 rows selected.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

438

SQL> SELECT * FROM EMP_ALL;


ENAME
---------- ---------SHANKER
JAYA
SUNIL
VIJAY
PRAKASH

SAL
2000
1800
1700
5000
3000

SQL> MERGE INTO EMP_ALL A


2 USING EMP_COMPANY B
3 ON(A.ENAME=B.ENAME)
4 WHEN MATCHED THEN
5 UPDATE SET A.SAL=B.SAL+100
6 WHEN NOT MATCHED THEN
7 INSERT(ENAME,SAL)
8 VALUES
9 (ENAME,SAL);
7 rows merged.

SQL> SELECT * FROM EMP_COMPANY;


ENAME
CNAME
---------- ---------- ---------ANIL
ACC
SHANKER
TATA
JAYA
CMC
SUNIL
CMC
VIJAY
TATA
PRAKASH
TATA
AJAY
ACC

SAL
1500
2000
1800
1700
5000
3000
8000

7 rows selected.
SQL> SELECT * FROM EMP_ALL;
ENAME
SAL
---------- ---------SHANKER
2100
JAYA
1900
SUNIL
1800
VIJAY
5100
PRAKASH
3100
AJAY
8000
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
ANIL

439

1500

7 rows selected.

HERE DATA FROM TABLE EMP_COMPANY IS MERGED WITH DATA OF TABLE


EMP_ALL.AS A RESULT
THE TABLE EMP_ALL HAS BEEN CHANGED.
ANIL IS NOT PRESENT IN THE TABLE EMP_ALL ACCORDING TO MATCH CONDITION,
THEN THE ROW IS
INSERTED INTO EMP_ALL TABLE USING INSERT STATEMENT.
SHANKER IS PRESENT IN THE BOTH THE TABLES THAT IS WHY ACCORDING TO
CONDITION IT WAS
UPDATED.

FLASH BACK QUERIES:

1 CREATE TABLE CHILD


2 (A NUMBER(10),
3* B NUMBER(10))
SQL> /
Table created.
SQL> BEGIN
2 FOR I IN 1..50 LOOP
3 INSERT INTO CHILD VALUES(1,I);
4 END LOOP;
5 END;
6 /
PL/SQL procedure successfully completed.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

440

SQL> COMMIT;
Commit complete.
SQL> SELECT COUNT(*) FROM CHILD;
COUNT(*)
---------50
SQL> DELETE FROM CHILD;
50 rows deleted.
SQL> COMMIT;
Commit complete.
SQL> SELECT COUNT(*) FROM CHILD;
COUNT(*)
---------0
SQL> EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(SYSDATE - 10/1440);
BEGIN DBMS_FLASHBACK.ENABLE_AT_TIME(SYSDATE - 10/1440); END;
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00201: identifier 'DBMS_FLASHBACK' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
SQL> CONN
Enter user-name: SYS AS SYSDBA
Connected.
SQL> GRANT ALL ON DBMS_FLASHBACK TO D;
Grant succeeded.
SQL> CONN
Enter user-name: D
Connected.
SQL> EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(SYSDATE - 10/1440);
PL/SQL procedure successfully completed.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

441

SQL> SELECT COUNT(*) FROM CHILD;


COUNT(*)
---------50
SQL> INSERT INTO CHILD VALUES
2 (11,11);
INSERT INTO CHILD VALUES
*
ERROR at line 1:
ORA-08182: operation not supported while in Flashback mode
SQL> EXECUTE DBMS_FLASHBACK.DISABLE;
PL/SQL procedure successfully completed.
SQL> SELECT COUNT(*) FROM CHILD;
COUNT(*)
---------0
SQL> INSERT INTO CHILD VALUES
2 (11,11);
1 row created.

GENERATING PRIMARY KEY USING TRIGGER:


SQL> CREATE TABLE DEPT_DUP
2 AS
3 SELECT * FROM DEPT;
Table created.
SQL> DELETE FROM DEPT_DUP;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

442

4 rows deleted.
SQL> COMMIT;
Commit complete.
1 CREATE SEQUENCE DEPT_DUP_SEQ
2 INCREMENT BY 10
3* START WITH 10
SQL> /
Sequence created.
SQL> CREATE OR REPLACE TRIGGER DEPTNO_GENERATION
2 BEFORE INSERT
3 ON DEPT_DUP
4 FOR EACH ROW
5 DECLARE
6 PRIMARY_KEY_VALUE VARCHAR2(10);
7 BEGIN
8 SELECT DEPT_DUP_SEQ.NEXTVAL INTO PRIMARY_KEY_VALUE FROM DUAL;
9 :NEW.DEPTNO := 'D' || TO_CHAR(PRIMARY_KEY_VALUE);
10 END;
11 /
Trigger created.
SQL> INSERT INTO DEPT_DUP
2 (DNAME,LOC)
3 VALUES
4 ('ACCOUNTING','NEWYORK');
INSERT INTO DEPT_DUP
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "D.DEPTNO_GENERATION", line 5
ORA-04088: error during execution of trigger 'D.DEPTNO_GENERATION'

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

443

SQL> ALTER TABLE DEPT_DUP


2 MODIFY DEPTNO VARCHAR2(10);
Table altered.
SQL> INSERT INTO DEPT_DUP
2 (DNAME,LOC)
3 VALUES
4 ('ACCOUNTING','NEWYORK');
1 row created.
SQL> SELECT * FROM DEPT_DUP;
DEPTNO DNAME
LOC
---------- -------------- ------------D20
ACCOUNTING NEWYORK
SQL> INSERT INTO DEPT_DUP
2 (DNAME,LOC)
3 VALUES
4 ('ACCOUNTING','NEWYORK')
5
1 INSERT INTO DEPT_DUP
2 (DNAME,LOC)
3 VALUES
4* ('SALES','NEWYORK')
SQL> /
1 row created.
1 INSERT INTO DEPT_DUP
2 (DNAME,LOC)
3 VALUES
4* ('COMPUTERS','NEWYORK')
SQL> /
1 row created.
SQL> SELECT * FROM DEPT_DUP;
DEPTNO DNAME
LOC
---------- -------------- ------------D20
ACCOUNTING
NEWYORK
D30
SALES
NEWYORK
D40
COMPUTERS
NEWYORK

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

444

SQL> DELETE FROM DEPT_DUP;


3 rows deleted.
WORKING WITH LARGE OBJECTS:

FOUR LOB DATATYPES ARE:


BLOB.
CLOB.
NCLOB.
BFILE.

BLOB: BINARY LARGE OBJECT.


IT IS USED TO STORE LARGE BINARY OBJECTS IN THE DATABASE. MAXSIZE THAT
CAN BE STORED IS
4 GB.
CLOB: CHARACTER LARGE OBJECT.
IT IS SIMILAR TO LONG DATATYPE. MAXIMUM SIZE IS 4 GB.CLOB IS USED TO STORE
LARGE BLOCKS OF SINGLE BYTE CHARACTER DATA IN THE DATABASE.
NCLOB: NATIONAL CHARACTER LARGE OBJECT.
THE NCLOB DATA TYPE IS USED TO STORE LARGE BLOCKS OF FIXED WIDTH SINGLEBYTE OR MULTI BYTE CHARACTER DATA IN THE DATABASE BASED ON THE
NATIONAL LANGUAGE CHARACTER.
MAXSIZE 4 GB.
BFILE:
IS USED TO STORE LARGE BINARY OBJECTS IN OPERATING SYSTEM FILES OUTSIDE
THE DATABASE. BFILE COLUMN STORES A FILE LOCATOR,WHICH POINTS TO THE
LARGE BINARY FILE ON THE SERVER.
THESE FILES ARE READ ONLY. VIDEOS MAY BE STORED IN THIS WAY.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

445

CREATING TABLE WITH LOB COLUMNS:


SQL> CREATE TABLE AIRBUS_DESC
2 (AIRBUSNO CHAR(10),
3 AIRBUS_DET BFILE,
4 AIRBUS_PROFILE CLOB);
Table created.
CREATING DIRECTORY FOR BFILE COLUMN:
SQL> CREATE OR REPLACE DIRECTORY GOD AS
2 'C:\BALAJI';
Directory created.
INSERTING VALUES IN TO TABLE WITH LOB COLUMNS:
1 INSERT INTO AIRBUS_DESC
2 VALUES
3* ('AB01',BFILENAME('GOD','AIRBUS_DESC1.DOC'),'THE DESCRIPTION OF THE PLANE
IS AS FOLLOWS:')
SQL> /
1 row created.
1 INSERT INTO AIRBUS_DESC
2 VALUES
3* ('AB02',BFILENAME('GOD','AIRBUS_DESC2.DOC'),'THE DESCRIPTION OF THE PLANE
IS AS FOLLOWS:')
4 /
1 row created.
1 INSERT INTO AIRBUS_DESC
2 VALUES
3* ('AB03',BFILENAME('GOD','AIRBUS_DESC3.DOC'),'THE DESCRIPTION OF THE PLANE
IS AS FOLLOWS:')
SQL> /
1 row created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

446

SQL> COMMIT;
Commit complete.

SELECTING VALUES FROM THE TABLE WITH LOB COLUMNS:


THE DATA FROM LOB'S CANNOT BE DISPLAYED BY USING SELECT
STATEMENT,EXCEPT FOR THE CLOBDATATYPE.
SQL> SELECT AIRBUSNO,AIRBUS_PROFILE FROM AIRBUS_DESC;
AIRBUSNO AIRBUS_PROFILE
---------- -------------------------------------------------------------------------------AB01
THE DESCRIPTION OF THE PLANE IS AS FOLLOWS:
AB02
THE DESCRIPTION OF THE PLANE IS AS FOLLOWS:
AB03
THE DESCRIPTION OF THE PLANE IS AS FOLLOWS:
NORMALLY WHEN YOU UPDATE A VALUE THE ROW BEING UPDATED GETS
AUTOMATICALLY LOCKED IN THE BACKGROUND. THE TRANSACTION IS PERFORMED
AND THEN THE LOCK IS RELEASED BY ORACLE.
BUT,IF YOU HAVE TO UPDATE A LOB VALUE THEN YOU HAVE TO EXPLICITLY LOCK
THE ROWS.
FOR THE PURPOSE YOU CAN MAKE USE OF THE FOR UPDATE CLAUSE IN THE SELECT
STATEMENT.
SQL>SELECT AIRBUS_PROFILE FROM AIRBUS_DESC
2 WHERE AIRBUSNO='AB01'
3 FOR UPDATE;
AIRBUS_PROFILE
-------------------------------------------------------------------------------THE DESCRIPTION OF THE PLANE IS AS FOLLOWS:
AS THE RECORD FOR AIRBUSNO AB01 HAS BEEN SELECTED FOR UPDATE THE ROW
HAS BEEN EXCLUSIVELY LOCKED. NOW THE ROW CAN BE UPDATED FOR A NEW
AIRBUS_PROFILE VALUE.

1 UPDATE AIRBUS_DESC
2 SET AIRBUS_PROFILE = 'THE DESCRIPTION OF THE PLANE IS AS FOLLOWS:LUXURY
SEATS IN
3 ECONOMY CLASS'

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

447

4* WHERE AIRBUSNO='AB01'
SQL> /
1 row updated.
TO RELEASE THE LOCK, FIRE A COMMIT STATEMENT. THIS TYPE OF EXPLICIT
LOCKING IS REQUIRED
ONLY FOR INTERNALLY STORED LOBS USING DBMS_LOB PACKAGE:
THE DBMS_LOB PACKAGE PROVIDES ROUTINES TO ACCESS BLOBS,CLOBS,NCLOBS
AND BFILES.
YOU CAN USE DBMS_LOB FOR ACCESS AND MANIPULATION OF SPECIFIC PARTS OF A
LOB, AS WELL AS COMPLETE LOBS.
DBMS_LOB CAN READ AS WELL AS MODIFY BLOBS,CLOBS, AND NCOLBS AND
PROVIDE READ ONLY OPERATIONSON BFILES.
THE STRING COMPARISON AND MANIPULATION PROCEDURES AND FUNCTIONS
AVAILABLE WITHIN
DBMS_LOB PACKAGE ARE LISTED BELOW.
READ.
SUBSTR.
INSTR.
GETLENGTH.
COMPARE.
WRITE.
APPEND.
ERASE.
TRIM.
COPY.
ADDITIONAL PROCEDURES AND FUNCTIONS SPECIFIC TO BFILE ARE
LISTED BELOW:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

448

FILEOPEN.
FILECLOSE.
FILECLOSEALL.
FILEXISTS.
FILEGETNAME.

FILEOPEN.
DBMS_LOB.READ:
THE PARAMETERS TO BE SPECIFIED IN THE READ PROCEDURE ARE:

LOCATOR FOR THE LOB TO READ.


NUMBER OF BYTES OR CHARACTERS TO BE READ.
OFFSET IN BYTES(FOR BLOBS) OR CHARACTERS (FOR CLOBS) FROM THE
START OF THE LOB.(ORIGIN:1).
OUTPUT BUFFER FOR THE READ OPERATION.
THE FOLLOWING SELECTS FIRST 15 CHARACTERS FROM THE
AIRBUS_PROFILE COLB COLUMN.
1 DECLARE
2 LOC_VAR CLOB;
3 NUM INTEGER;
4 OFFSET INTEGER;
5 OUTPUT_VAR VARCHAR2(20);
6 BEGIN
7 NUM:=15;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

449

8 OFFSET :=1;
9 SELECT AIRBUS_PROFILE INTO LOC_VAR
10 FROM AIRBUS_DESC
11 WHERE AIRBUSNO='AB01';
12 DBMS_LOB.READ(LOC_VAR,NUM,OFFSET,OUTPUT_VAR);
13 DBMS_OUTPUT.PUT_LINE('START OF AIRBUS PROFILE ' || OUTPUT_VAR);
14* END;
SQL> /
PL/SQL procedure successfully completed.
SQL> SET SERVEROUTPUT ON
SQL> /
START OF AIRBUS PROFILE THE DESCRIPTION
PL/SQL procedure successfully completed.
SQL> SELECT AIRBUS_PROFILE FROM AIRBUS_DESC
2 WHERE AIRBUSNO = 'AB01';
AIRBUS_PROFILE
-------------------------------------------------------------------------------THE DESCRIPTION OF THE PLANE IS AS FOLLOWS:LUXURY SEATS IN
ECONOMY CLASS

DBMS_LOB.SUBSTR:

THE PARAMETERS TO BE SPECIFIED IN THE SUBSTR FUNCTION ARE:

LOCATOR FOR THE LOB TO READ.


NUMBER OF BYTES OR CHARACTERS TO BE READ.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

450

OFFSET IN BYTES(FOR BLOBS) OR CHARACTERS (FOR CLOBS) FROM THE


START OF THE LOB.(ORIGIN:1).

THE FOLLOWING CODE SELECTS 12 CHRACTERS FROM THE


AIRBUS_PROFILE COLUMN STARTING
AT THE 17 TH CHARACTER.

1 DECLARE
2 LOC_VAR CLOB;
3 NUM INTEGER;
4 OFFSET INTEGER;
5 OUTPUT_VAR VARCHAR2(20);
6 BEGIN
7 NUM:=12;
8 OFFSET :=17;
9 SELECT AIRBUS_PROFILE INTO LOC_VAR
10 FROM AIRBUS_DESC
11 WHERE AIRBUSNO='AB01';
12 OUTPUT_VAR:=DBMS_LOB.SUBSTR(LOC_VAR,NUM,OFFSET);
13 DBMS_OUTPUT.PUT_LINE('SUBSTRING OF AIRBUS PROFILE ' || OUTPUT_VAR);
14* END;
SQL> /
SUBSTRING OF AIRBUS PROFILE OF THE PLANE
PL/SQL procedure successfully completed.
DBMS_LOB.INSTR:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

451

THE PARAMETERS TO BE SPECIFIED IN THE INSTR FUNCTION ARE:

LOCATOR FOR THE LOB TO READ.


PATTERN TO BE TESTED FOR.
ABSOLUTE OFFSET IN BYTES(FOR BLOBS) OR CHARACTERS (FOR CLOBS)
FROM THE START OF THE LOB.
OCCURRENCE NUMBER,START AT 1.

THE FOLLOWING CODE SEARCHES AS IN THE CLOB COLUMN.


1 DECLARE
2 LOC_VAR CLOB;
3 PATTERN VARCHAR2(10);
4 OFFSET INTEGER;
5 OCCUR_VAR INTEGER;
6 POSITION INTEGER;
7 BEGIN
8 PATTERN:='AS';
9 OFFSET :=1;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

452

10 OCCUR_VAR :=1;
11 SELECT AIRBUS_PROFILE INTO LOC_VAR
12 FROM AIRBUS_DESC
13 WHERE AIRBUSNO='AB01';
14 POSITION:=DBMS_LOB.INSTR(LOC_VAR,PATTERN,OFFSET,OCCUR_VAR);
15 DBMS_OUTPUT.PUT_LINE('STRING FOUND AT POSITION: ' || POSITION);
16* END;
SQL> /
STRING FOUND AT POSITION: 33
PL/SQL procedure successfully completed.
SQL> SELECT AIRBUS_PROFILE FROM AIRBUS_DESC
2 WHERE AIRBUSNO = 'AB01';
AIRBUS_PROFILE
-------------------------------------------------------------------------------THE DESCRIPTION OF THE PLANE IS AS FOLLOWS:LUXURY SEATS IN
ECONOMY CLASS

DBMS_LOB.GETLENGTH:
THE PARAMETERS TO BE SPECIFIED IN THE GETLENGTH FUNCTION ARE:

LOCATOR FOR THE LOB WHOSE LENGTH IS TO BE RETURNED.

SQL> DECLARE
2 LOC_VAR CLOB;
3 LEN INTEGER;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

453

4 BEGIN
5 SELECT AIRBUS_PROFILE INTO LOC_VAR
6 FROM AIRBUS_DESC
7 WHERE AIRBUSNO='AB01';
8 LEN:=DBMS_LOB.GETLENGTH(LOC_VAR);
9 DBMS_OUTPUT.PUT_LINE('LENGTH OF THE LOB IS :' ||LEN);
10 END;
11 /
LENGTH OF THE LOB IS :72
PL/SQL procedure successfully completed.
SQL> SELECT AIRBUS_PROFILE FROM AIRBUS_DESC
2 WHERE AIRBUSNO = 'AB01';
AIRBUS_PROFILE
-------------------------------------------------------------------------------THE DESCRIPTION OF THE PLANE IS AS FOLLOWS:LUXURY SEATS IN
ECONOMY CLASS

DBMS_LOB.COMPARE:
THE PARAMETERS TO BE SPECIFIED IN THE COMPARE FUNCTION ARE:

LOB LOCATOR OF FIRST LOB FOR COMPARISON.


LOB LOCATOR OF SECOND LOB FOR COMPARISON.
NUMBER OF BYTES OR CHRACTERS TO COMPARE OVER.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

454

OFFSET IN BYTES(FOR BLOBS) OR CHARACTERS (FOR CLOBS) ON THE FIRST


LOB(ORIGIN:1) FOR THE COMPARISON.

OFFSET IN BYTES(FOR BLOBS) OR CHARACTERS (FOR CLOBS) ON THE SECOND


LOB(ORIGIN:1) FOR THE COMPARISON.
1 DECLARE
2 LOC1_VAR CLOB;
3 LOC2_VAR CLOB;
4 NUM INTEGER;
5 OFFSET1 INTEGER;
6 OFFSET2 INTEGER;
7 OUTPUT_VAR INTEGER;
8 BEGIN
9 NUM:=30;
10 OFFSET1:=1;
11 OFFSET2:=1;
12 SELECT AIRBUS_PROFILE INTO LOC1_VAR
13 FROM AIRBUS_DESC
14 WHERE AIRBUSNO='AB01';
15 SELECT AIRBUS_PROFILE INTO LOC2_VAR
16 FROM AIRBUS_DESC
17 WHERE AIRBUSNO='AB02';
18
OUTPUT_VAR:=DBMS_LOB.COMPARE(LOC1_VAR,LOC2_VAR,NUM,OFFSET1,OFFSET2);
19 DBMS_OUTPUT.PUT_LINE('COMPARISON VALUE ( 0 IF THE SAME ) IS : ' ||
OUTPUT_VAR);

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

455

20* END;
21 /
COMPARISON VALUE ( 0 IF THE SAME ) IS : 0
PL/SQL procedure successfully completed.
SQL> SELECT AIRBUS_PROFILE FROM AIRBUS_DESC
2 WHERE AIRBUSNO IN ('AB01','AB02');
AIRBUS_PROFILE
-------------------------------------------------------------------------------THE DESCRIPTION OF THE PLANE IS AS FOLLOWS:LUXURY SEATS IN
ECONOMY CLASS
THE DESCRIPTION OF THE PLANE IS AS FOLLOWS:

DBMS_LOB.WRITE:
THE PARAMETERS TO BE SPECIFIED IN THE WRITE PROCEDURE ARE:

LOB LOCATOR OF INTERNAL LOB TO BE WRITTEN TO.


NUMBER OF BYTES OR CHRACTERS TO WRITE OR THAT WERE WRITTEN..

OFFSET IN BYTES(FOR BLOBS) OR CHARACTERS (FOR CLOBS) FROM THE


START OF THE LOB(ORIGIN:1) FOR WRITE OPERATION.

INPUT BUFFER FOR THE WRITE OPERATION.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

456

THE FOLLOWING CODE UPDATES THE VALUE IN THE AIRBUS_PROFILE COLUMN FOR
AIRBUSNO AB02 WITH LUXURY SEATS.
SQL> DECLARE
2 LOC_VAR CLOB;
3 NUM INTEGER;
4 OFFSET INTEGER;
5 BUFFER_VAR VARCHAR2(20);
6 BEGIN
7 NUM:=13;
8 OFFSET :=43;
9 BUFFER_VAR:=':LUXURY SEATS';
10 SELECT AIRBUS_PROFILE INTO LOC_VAR
11 FROM AIRBUS_DESC
12 WHERE AIRBUSNO='AB02'
13 FOR UPDATE;
14 DBMS_LOB.WRITE(LOC_VAR,NUM,OFFSET,BUFFER_VAR);
15 COMMIT;
16 END;
17 /
PL/SQL procedure successfully completed.
SQL> SELECT AIRBUS_PROFILE FROM AIRBUS_DESC
2 WHERE AIRBUSNO='AB02';
AIRBUS_PROFILE
-------------------------------------------------------------------------------THE DESCRIPTION OF THE PLANE IS AS FOLLOWS:LUXURY SEATS

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

457

DBMS_LOB.APPEND:
THE PARAMETERS TO BE SPECIFIED IN THE APPEND PROCEDURE ARE:

LOCATOR FOR THE INTERNAL LOB TO WHICH THE DATA IS TO BE APPENDED.


LOCATOR FOR THE INTERNAL LOB FROM WHICH THE DATA IS TO BE READ.
THE FOLLOWING CODE APPENDS THE VALUE IN THE AIRBUS_PROFILE COLUMN IN
THE AIRBUS_DESC TABLE FOR AIRBUSNO ABO2 WITH THE VALUE FOR AB01.
SQL> DECLARE
2 DEST_LOC_VAR CLOB;
3 SRC_LOC_VAR CLOB;
4 BEGIN
5 SELECT AIRBUS_PROFILE INTO DEST_LOC_VAR
6 FROM AIRBUS_DESC
7 WHERE AIRBUSNO='AB02'
8 FOR UPDATE;
9 SELECT AIRBUS_PROFILE INTO SRC_LOC_VAR
10 FROM AIRBUS_DESC
11 WHERE AIRBUSNO='AB01';
12 DBMS_LOB.APPEND(DEST_LOC_VAR,SRC_LOC_VAR);
13 COMMIT;
14 END;
15 /
PL/SQL procedure successfully completed.
SQL> SELECT AIRBUS_PROFILE FROM AIRBUS_DESC

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

458

2 WHERE AIRBUSNO='AB01';
AIRBUS_PROFILE
-------------------------------------------------------------------------------THE DESCRIPTION OF THE PLANE IS AS FOLLOWS:LUXURY SEATS IN
ECONOMY CLASS
SQL> SELECT AIRBUS_PROFILE FROM AIRBUS_DESC
2 WHERE AIRBUSNO='AB02';
AIRBUS_PROFILE
-------------------------------------------------------------------------------THE DESCRIPTION OF THE PLANE IS AS FOLLOWS:LUXURY SEATSTHE DESCRIPTION
OF THE PL
DBMS_LOB.ERASE:
THE PARAMETERS TO BE SPECIFIED IN THE ERASE PROCEDURE ARE:

LOCATOR FOR THE LOB TO BE ERASED.


NUMBER OF BYTES(FOR BLOBS) OR CHARACTERS (FOR CLOBS) TO BE
ERASED.
ABSOLUTE OFFSET FROM THE BEGINNING OF THE LOB IN BYTES(FOR BLOBS)
OR CHARACTERS(CLOBS).
THE FOLLOWING CODE ERASES 20 CHARACTERS FROM THE VALUE IN THE
AIRBUS_PROFILE COLUMN IN THE AIRBUS_DESC TABLE FOR AIRBUSNO ABO2
STARTING WITH THE 10TH CHARACTER.
SQL> DECLARE
2 LOC_VAR CLOB;
3 NUM INTEGER;
4 OFFSET INTEGER;
5 BEGIN
6 NUM:=20;
7 OFFSET :=10;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

459

8 SELECT AIRBUS_PROFILE INTO LOC_VAR


9 FROM AIRBUS_DESC
10 WHERE AIRBUSNO='AB02'
11 FOR UPDATE;
12 DBMS_LOB.ERASE(LOC_VAR,NUM,OFFSET);
13 COMMIT;
14 END;
15 /
PL/SQL procedure successfully completed.
SQL> SELECT AIRBUS_PROFILE FROM AIRBUS_DESC
2 WHERE AIRBUSNO='AB02';
AIRBUS_PROFILE
-------------------------------------------------------------------------------THE DESCR
IS AS FOLLOWS:LUXURY SEATSTHE DESCRIPTION OF THE PL
DBMS_LOB.TRIM:

THE PARAMETERS TO BE SPECIFIED IN THE TRIM PROCEDURE ARE:

LOCATOR FOR THE INTERNAL WHOSE LENGTH IS TO BE TRIMMED.


NEW,TRIMMED LENGTH OF THE LOB VALUE IN BYTES FOR BLOBS OR
CHARACTERS FOR CLOBS.
THE FOLLOWING CODE TRIMS THE VALUE IN THE AIRBUS_PROFILE COLUMN IN THE
AIRBUS_DESC
TABLE FOR AIRBUSNO ABO2 TO 40 CHRACTERS.
SQL> DECLARE
2 LOC_VAR CLOB;
3 NEWLEN INTEGER;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

460

4 BEGIN
5 NEWLEN :=40;
6 SELECT AIRBUS_PROFILE INTO LOC_VAR
7 FROM AIRBUS_DESC
8 WHERE AIRBUSNO='AB02'
9 FOR UPDATE;
10 DBMS_LOB.TRIM(LOC_VAR,NEWLEN);
11 COMMIT;
12 END;
13 /
PL/SQL procedure successfully completed.
SQL> SELECT AIRBUS_PROFILE FROM AIRBUS_DESC
2 WHERE AIRBUSNO='AB02';
AIRBUS_PROFILE
-------------------------------------------------------------------------------THE DESCR
IS AS FOLLO
DBMS_LOB.COPY:

THE PARAMETERS TO BE SPECIFIED IN THE COPY PROCEDURE ARE:

LOB LOCATOR OF THE COPY TARGET.


LOB LOCATOR OF SOURCE FOR THE COPY.
NUMBER OF BYTES OR CHARACTERS TO COPY.
OFFSET IN BYTES OR CHARACTERS IN THE DESTINATION LOB(ORIGIN:1) FOR
THE START OF THE COPY.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

461

OFFSET IN BYTES OR CHARACTERS IN THE SOURCE LOB(ORIGIN:1) FOR THE


START OF THE COPY.
THE FOLLOWING CODE COPIES THE VALUES IN THE AIRBUS_PROFILE COLUMN IN
THE AIRBUS_DESC TABLE FOR AIRBUSNO AB01 TO AB02.

1 DECLARE
2 DEST_LOC_VAR CLOB;
3 SRC_LOC_VAR CLOB;
4 NUM INTEGER;
5 DEST_OFFSET INTEGER;
6 SRC_OFFSET INTEGER;
7 BEGIN
8 NUM:=73;
9 DEST_OFFSET :=1;
10 SRC_OFFSET :=1;
11 SELECT AIRBUS_PROFILE INTO DEST_LOC_VAR
12 FROM AIRBUS_DESC
13 WHERE AIRBUSNO='AB02'
14 FOR UPDATE;
15 SELECT AIRBUS_PROFILE INTO SRC_LOC_VAR
16 FROM AIRBUS_DESC
17 WHERE AIRBUSNO='AB01';
18
DBMS_LOB.COPY(DEST_LOC_VAR,SRC_LOC_VAR,NUM,DEST_OFFSET,SRC_OFFSET);
19 COMMIT;
20* END;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

462

SQL> /
PL/SQL procedure successfully completed.
SQL> SELECT AIRBUS_PROFILE FROM AIRBUS_DESC
2 WHERE AIRBUSNO IN ('AB01','AB02');
AIRBUS_PROFILE
-------------------------------------------------------------------------------THE DESCRIPTION OF THE PLANE IS AS FOLLOWS:LUXURY SEATS IN
ECONOMY CLASS
THE DESCRIPTION OF THE PLANE IS AS FOLLOWS:LUXURY SEATS IN
ECONOMY CLASS.

USING BFILE RELATED ROUTINES:

1 DECLARE
2 LOC_VAR BFILE;
3 FEXISTS_VAR INTEGER;
4 FOPEN_VAR INTEGER;
5 NUM INTEGER;
6 OFFSET INTEGER;
7 LEN INTEGER;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

463

8 DIR_ALIAS_VAR VARCHAR2(25);
9 FNAME VARCHAR2(15);
10 OUTPUT_VAR LONG;
11 BEGIN
12 SELECT AIRBUS_DET INTO LOC_VAR
13 FROM AIRBUS_DESC
14 WHERE AIRBUSNO='AB01';
15 FEXISTS_VAR := DBMS_LOB.FILEEXISTS(LOC_VAR);
16 IF FEXISTS_VAR=1 THEN
17 DBMS_OUTPUT.PUT_LINE('THE FILE EXISTS');
18 ELSE
19 DBMS_OUTPUT.PUT_LINE('THE FILE COULD NOT BE FOUND');
20 END IF;
21* END;
22 /
SQL> /
THE FILE EXISTS
PL/SQL procedure successfully completed.

1 DECLARE
2 LOC_VAR BFILE;
3 FEXISTS_VAR INTEGER;
4 FOPEN_VAR INTEGER;
5 NUM INTEGER;
6 OFFSET INTEGER;
7 LEN INTEGER;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

464

8 DIR_ALIAS_VAR VARCHAR2(25);
9 FNAME VARCHAR2(30);
10 OUTPUT_VAR LONG;
11 BEGIN
12 SELECT AIRBUS_DET INTO LOC_VAR
13 FROM AIRBUS_DESC
14 WHERE AIRBUSNO='AB01';
15 FEXISTS_VAR := DBMS_LOB.FILEEXISTS(LOC_VAR);
16 IF FEXISTS_VAR=1 THEN
17 DBMS_OUTPUT.PUT_LINE('THE FILE EXISTS');
18 ELSE
19 DBMS_OUTPUT.PUT_LINE('THE FILE COULD NOT BE FOUND');
20 END IF;
21 DBMS_LOB.FILEGETNAME(LOC_VAR,DIR_ALIAS_VAR,FNAME);
22 DBMS_OUTPUT.PUT_LINE('FILE NAME IS:' || DIR_ALIAS_VAR || ' '|| FNAME);
23* END;
SQL> /
THE FILE EXISTS
FILE NAME IS:GOD AIRBUS_DESC1.DOC
PL/SQL procedure successfully completed.
1 DECLARE
2 LOC_VAR BFILE;
3 FEXISTS_VAR INTEGER;
4 FOPEN_VAR INTEGER;
5 NUM INTEGER;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

465

6 OFFSET INTEGER;
7 LEN INTEGER;
8 DIR_ALIAS_VAR VARCHAR2(25);
9 FNAME VARCHAR2(30);
10 OUTPUT_VAR LONG;
11 BEGIN
12 SELECT AIRBUS_DET INTO LOC_VAR
13 FROM AIRBUS_DESC
14 WHERE AIRBUSNO='AB01';
15 FEXISTS_VAR := DBMS_LOB.FILEEXISTS(LOC_VAR);
16 IF FEXISTS_VAR=1 THEN
17 DBMS_OUTPUT.PUT_LINE('THE FILE EXISTS');
18 ELSE
19 DBMS_OUTPUT.PUT_LINE('THE FILE COULD NOT BE FOUND');
20 END IF;
21 DBMS_LOB.FILEGETNAME(LOC_VAR,DIR_ALIAS_VAR,FNAME);
22 DBMS_OUTPUT.PUT_LINE('FILE NAME IS:' || DIR_ALIAS_VAR || ' '|| FNAME);
23* END;
SQL>
SQL> /
THE FILE EXISTS
FILE NAME IS:GOD AIRBUS_DESC1.DOC
PL/SQL procedure successfully completed.
1 DECLARE
2 LOC_VAR BFILE;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

466

3 FEXISTS_VAR INTEGER;
4 FOPEN_VAR INTEGER;
5 NUM INTEGER;
6 OFFSET INTEGER;
7 LEN INTEGER;
8 DIR_ALIAS_VAR VARCHAR2(25);
9 FNAME VARCHAR2(30);
10 OUTPUT_VAR LONG;
11 BEGIN
12 SELECT AIRBUS_DET INTO LOC_VAR
13 FROM AIRBUS_DESC
14 WHERE AIRBUSNO='AB01';
15 FEXISTS_VAR := DBMS_LOB.FILEEXISTS(LOC_VAR);
16 IF FEXISTS_VAR=1 THEN
17 DBMS_OUTPUT.PUT_LINE('THE FILE EXISTS');
18 ELSE
19 DBMS_OUTPUT.PUT_LINE('THE FILE COULD NOT BE FOUND');
20 END IF;
21 DBMS_LOB.FILEGETNAME(LOC_VAR,DIR_ALIAS_VAR,FNAME);
22 DBMS_OUTPUT.PUT_LINE('FILE NAME IS:' || DIR_ALIAS_VAR || ' '|| FNAME);
23* END;
24 /
THE FILE EXISTS
FILE NAME IS:GOD AIRBUS_DESC1.DOC
PL/SQL procedure successfully completed.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

467

1 DECLARE
2 LOC_VAR BFILE;
3 FEXISTS_VAR INTEGER;
4 FOPEN_VAR INTEGER;
5 NUM INTEGER;
6 OFFSET INTEGER;
7 LEN INTEGER;
8 DIR_ALIAS_VAR VARCHAR2(25);
9 FNAME VARCHAR2(30);
10 OUTPUT_VAR LONG;
11 BEGIN
12 SELECT AIRBUS_DET INTO LOC_VAR
13 FROM AIRBUS_DESC
14 WHERE AIRBUSNO='AB01';
15 FEXISTS_VAR := DBMS_LOB.FILEEXISTS(LOC_VAR);
16 IF FEXISTS_VAR=1 THEN
17 DBMS_OUTPUT.PUT_LINE('THE FILE EXISTS');
18 ELSE
19 DBMS_OUTPUT.PUT_LINE('THE FILE COULD NOT BE FOUND');
20 END IF;
21 DBMS_LOB.FILEGETNAME(LOC_VAR,DIR_ALIAS_VAR,FNAME);
22 DBMS_OUTPUT.PUT_LINE('FILE NAME IS:' || DIR_ALIAS_VAR || ' ' ||FNAME);
23 FOPEN_VAR := DBMS_LOB.FILEISOPEN(LOC_VAR);
24 IF FOPEN_VAR = 1 THEN
25 DBMS_OUTPUT.PUT_LINE('THE FILE IS OPEN');
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

468

26 ELSE
27 DBMS_OUTPUT.PUT_LINE('THE FILE IS BEING OPENED');
28 DBMS_LOB.FILEOPEN(LOC_VAR);
29 END IF;
30 NUM:=20;
31 OFFSET := 1;
32 DBMS_LOB.READ(LOC_VAR,NUM,OFFSET,OUTPUT_VAR);
33 DBMS_OUTPUT.PUT_LINE('THE FIRST 20 CHARACTERS ARE: ' || OUTPUT_VAR);
34 DBMS_LOB.FILECLOSE(LOC_VAR);
35* END;
SQL> /
THE FILE EXISTS
FILE NAME IS:GOD AIRBUS_DESC1.DOC
THE FILE IS BEING OPENED
THE FIRST 20 CHARACTERS ARE:
PL/SQL procedure successfully completed.
1 DECLARE
2 LOC_VAR BFILE;
3 FEXISTS_VAR INTEGER;
4 FOPEN_VAR INTEGER;
5 NUM INTEGER;
6 OFFSET INTEGER;
7 LEN INTEGER;
8 DIR_ALIAS_VAR VARCHAR2(25);
9 FNAME VARCHAR2(30);
10 OUTPUT_VAR VARCHAR2(200);
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

469

11 BEGIN
12 SELECT AIRBUS_DET INTO LOC_VAR
13 FROM AIRBUS_DESC
14 WHERE AIRBUSNO='AB01';
15 FEXISTS_VAR := DBMS_LOB.FILEEXISTS(LOC_VAR);
16 IF FEXISTS_VAR=1 THEN
17 DBMS_OUTPUT.PUT_LINE('THE FILE EXISTS');
18 ELSE
19 DBMS_OUTPUT.PUT_LINE('THE FILE COULD NOT BE FOUND');
20 END IF;
21 DBMS_LOB.FILEGETNAME(LOC_VAR,DIR_ALIAS_VAR,FNAME);
22 DBMS_OUTPUT.PUT_LINE('FILE NAME IS:' || DIR_ALIAS_VAR || ' ' ||FNAME);
23 FOPEN_VAR := DBMS_LOB.FILEISOPEN(LOC_VAR);
24 IF FOPEN_VAR = 1 THEN
25 DBMS_OUTPUT.PUT_LINE('THE FILE IS OPEN');
26 ELSE
27 DBMS_OUTPUT.PUT_LINE('THE FILE IS BEING OPENED');
28 DBMS_LOB.FILEOPEN(LOC_VAR);
29 END IF;
30 NUM:=20;
31 OFFSET := 1;
32 DBMS_LOB.READ(LOC_VAR,NUM,OFFSET,OUTPUT_VAR);
33 DBMS_OUTPUT.PUT_LINE('THE FIRST 20 CHARACTERS ARE: ' || OUTPUT_VAR);
34 DBMS_LOB.FILECLOSE(LOC_VAR);
35* END;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

470

36 /
THE FILE EXISTS
FILE NAME IS:GOD AIRBUS_DESC1.DOC
THE FILE IS BEING OPENED
THE FIRST 20 CHARACTERS ARE: D0CF11E0A1B11AE1000000000000000000000000
PL/SQL procedure successfully completed.

1 DECLARE
2 LOC_VAR BFILE;
3 FEXISTS_VAR INTEGER;
4 FOPEN_VAR INTEGER;
5 NUM INTEGER;
6 OFFSET INTEGER;
7 LEN INTEGER;
8 DIR_ALIAS_VAR VARCHAR2(25);
9 FNAME VARCHAR2(30);
10 OUTPUT_VAR LONG;
11 BEGIN
12 SELECT AIRBUS_DET INTO LOC_VAR
13 FROM AIRBUS_DESC
14 WHERE AIRBUSNO='AB01';
15 FEXISTS_VAR := DBMS_LOB.FILEEXISTS(LOC_VAR);
16 IF FEXISTS_VAR=1 THEN
17 DBMS_OUTPUT.PUT_LINE('THE FILE EXISTS');

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

471

18 ELSE
19 DBMS_OUTPUT.PUT_LINE('THE FILE COULD NOT BE FOUND');
20 END IF;
21 DBMS_LOB.FILEGETNAME(LOC_VAR,DIR_ALIAS_VAR,FNAME);
22 DBMS_OUTPUT.PUT_LINE('FILE NAME IS:' || DIR_ALIAS_VAR || ' ' ||FNAME);
23 FOPEN_VAR := DBMS_LOB.FILEISOPEN(LOC_VAR);
24 IF FOPEN_VAR = 1 THEN
25 DBMS_OUTPUT.PUT_LINE('THE FILE IS OPEN');
26 ELSE
27 DBMS_OUTPUT.PUT_LINE('THE FILE IS BEING OPENED');
28 DBMS_LOB.FILEOPEN(LOC_VAR);
29 END IF;
30 NUM:=20;
31 OFFSET := 1;
32 DBMS_LOB.READ(LOC_VAR,NUM,OFFSET,OUTPUT_VAR);
33 DBMS_OUTPUT.PUT_LINE('THE FIRST 20 CHARACTERS ARE: ' ||
TO_CHAR(OUTPUT_VAR));
34 DBMS_LOB.FILECLOSE(LOC_VAR);
35* END;
SQL> /
THE FILE EXISTS
FILE NAME IS:GOD AIRBUS_DESC1.DOC
THE FILE IS BEING OPENED
THE FIRST 20 CHARACTERS ARE:
PL/SQL procedure successfully completed.
1 DECLARE
2 LOC_VAR BFILE;
3 FEXISTS_VAR INTEGER;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

472

4 FOPEN_VAR INTEGER;
5 NUM INTEGER;
6 OFFSET INTEGER;
7 LEN INTEGER;
8 DIR_ALIAS_VAR VARCHAR2(25);
9 FNAME VARCHAR2(30);
10 OUTPUT_VAR VARCHAR2(200);
11 BEGIN
12 SELECT AIRBUS_DET INTO LOC_VAR
13 FROM AIRBUS_DESC
14 WHERE AIRBUSNO='AB01';
15 FEXISTS_VAR := DBMS_LOB.FILEEXISTS(LOC_VAR);
16 IF FEXISTS_VAR=1 THEN
17 DBMS_OUTPUT.PUT_LINE('THE FILE EXISTS');
18 ELSE
19 DBMS_OUTPUT.PUT_LINE('THE FILE COULD NOT BE FOUND');
20 END IF;
21 DBMS_LOB.FILEGETNAME(LOC_VAR,DIR_ALIAS_VAR,FNAME);
22 DBMS_OUTPUT.PUT_LINE('FILE NAME IS:' || DIR_ALIAS_VAR || ' ' ||FNAME);
23 FOPEN_VAR := DBMS_LOB.FILEISOPEN(LOC_VAR);
24 IF FOPEN_VAR = 1 THEN
25 DBMS_OUTPUT.PUT_LINE('THE FILE IS OPEN');
26 ELSE
27 DBMS_OUTPUT.PUT_LINE('THE FILE IS BEING OPENED');
28 DBMS_LOB.FILEOPEN(LOC_VAR);
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

473

29 END IF;
30 NUM:=20;
31 OFFSET := 1;
32 DBMS_LOB.READ(LOC_VAR,NUM,OFFSET,OUTPUT_VAR);
33 DBMS_OUTPUT.PUT_LINE('THE FIRST 20 CHARACTERS ARE: ' ||
TO_CHAR(OUTPUT_VAR));
34 DBMS_LOB.FILECLOSE(LOC_VAR);
35* END;
36 /
THE FILE EXISTS
FILE NAME IS:GOD AIRBUS_DESC1.DOC
THE FILE IS BEING OPENED
THE FIRST 20 CHARACTERS ARE: D0CF11E0A1B11AE1000000000000000000000000
PL/SQL procedure successfully completed.
SQL> /
THE FILE EXISTS
FILE NAME IS:GOD AIRBUS_DESC1.DOC
THE FILE IS BEING OPENED
THE FIRST 20 CHARACTERS ARE: D0CF11E0A1B11AE1000000000000000000000000
PL/SQL procedure successfully completed.
1 DECLARE
2 LOC_VAR BFILE;
3 FEXISTS_VAR INTEGER;
4 FOPEN_VAR INTEGER;
5 NUM INTEGER;
6 OFFSET INTEGER;
7 LEN INTEGER;
8 DIR_ALIAS_VAR VARCHAR2(25);
9 FNAME VARCHAR2(30);
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

474

10 OUTPUT_VAR VARCHAR2(200);
11 BEGIN
12 SELECT AIRBUS_DET INTO LOC_VAR
13 FROM AIRBUS_DESC
14 WHERE AIRBUSNO='AB01';
15 FEXISTS_VAR := DBMS_LOB.FILEEXISTS(LOC_VAR);
16 IF FEXISTS_VAR=1 THEN
17 DBMS_OUTPUT.PUT_LINE('THE FILE EXISTS');
18 ELSE
19 DBMS_OUTPUT.PUT_LINE('THE FILE COULD NOT BE FOUND');
20 END IF;
21 DBMS_LOB.FILEGETNAME(LOC_VAR,DIR_ALIAS_VAR,FNAME);
22 DBMS_OUTPUT.PUT_LINE('FILE NAME IS:' || DIR_ALIAS_VAR || ' ' ||FNAME);
23 FOPEN_VAR := DBMS_LOB.FILEISOPEN(LOC_VAR);
24 IF FOPEN_VAR = 1 THEN
25 DBMS_OUTPUT.PUT_LINE('THE FILE IS OPEN');
26 ELSE
27 DBMS_OUTPUT.PUT_LINE('THE FILE IS BEING OPENED');
28 DBMS_LOB.FILEOPEN(LOC_VAR);
29 END IF;
30 NUM:=20;
31 OFFSET := 1;
32 DBMS_LOB.READ(LOC_VAR,NUM,OFFSET,OUTPUT_VAR);
33 DBMS_OUTPUT.PUT_LINE('THE FIRST 20 CHARACTERS ARE: ' || OUTPUT_VAR);
34 DBMS_LOB.FILECLOSE(LOC_VAR);
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

475

35* END;
SQL> /
THE FILE EXISTS
FILE NAME IS:GOD AIRBUS_DESC1.DOC
THE FILE IS BEING OPENED
THE FIRST 20 CHARACTERS ARE: D0CF11E0A1B11AE1000000000000000000000000
PL/SQL procedure successfully completed.
1 DECLARE
2 LOC_VAR BFILE;
3 FEXISTS_VAR INTEGER;
4 FOPEN_VAR INTEGER;
5 NUM INTEGER;
6 OFFSET INTEGER;
7 LEN INTEGER;
8 DIR_ALIAS_VAR VARCHAR2(25);
9 FNAME VARCHAR2(30);
10 OUTPUT_VAR VARCHAR2(200);
11 BEGIN
12 SELECT AIRBUS_DET INTO LOC_VAR
13 FROM AIRBUS_DESC
14 WHERE AIRBUSNO='AB01';
15 FEXISTS_VAR := DBMS_LOB.FILEEXISTS(LOC_VAR);
16 IF FEXISTS_VAR=1 THEN
17 DBMS_OUTPUT.PUT_LINE('THE FILE EXISTS');
18 ELSE
19 DBMS_OUTPUT.PUT_LINE('THE FILE COULD NOT BE FOUND');
20 END IF;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

476

21 DBMS_LOB.FILEGETNAME(LOC_VAR,DIR_ALIAS_VAR,FNAME);
22 DBMS_OUTPUT.PUT_LINE('FILE NAME IS:' || DIR_ALIAS_VAR || ' ' ||FNAME);
23 FOPEN_VAR := DBMS_LOB.FILEISOPEN(LOC_VAR);
24 IF FOPEN_VAR = 1 THEN
25 DBMS_OUTPUT.PUT_LINE('THE FILE IS OPEN');
26 ELSE
27 DBMS_OUTPUT.PUT_LINE('THE FILE IS BEING OPENED');
28 DBMS_LOB.FILEOPEN(LOC_VAR);
29 END IF;
30 NUM:=20;
31 OFFSET := 1;
32 DBMS_LOB.READ(LOC_VAR,NUM,OFFSET,OUTPUT_VAR);
33 DBMS_OUTPUT.PUT_LINE('THE FIRST 20 CHARACTERS ARE: ' || OUTPUT_VAR);
34 LEN:=DBMS_LOB.GETLENGTH(LOC_VAR);
35 DBMS_OUTPUT.PUT_LINE(LEN);
36 DBMS_LOB.FILECLOSE(LOC_VAR);
37* END;
38 /
THE FILE EXISTS
FILE NAME IS:GOD AIRBUS_DESC1.DOC
THE FILE IS BEING OPENED
THE FIRST 20 CHARACTERS ARE: D0CF11E0A1B11AE1000000000000000000000000
19968
PL/SQL procedure successfully completed.

TYPES OF APPLICATION ARCHITECURES:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

477

APPLICATIONS ARE DEVELOPED TO SUPPORT ORGANIZATIONS IN THEIR BUSSINESS


OPERATIONS.
APPLICATIONS ACCEPT INPUT,PROCESS THE DATA BASED ON BUSSINESS RULES, AND
PROVIDE DATA AS OUTPUT.
THE FUNCTIONS PERFORMED BY AN APPLICATION CAN BE DIVIDED INTO THREE
CATEGORIES.
USER SERVICES.
BUSSINESS SERVICES.
DATA SERVICES.
EACH CATEGEORY IS IMPLEMENTED AS A LAYER IN AN APPLICATION.
THE USER SERVICES LAYER CONSTITUTES THE FRONT-END OF A SOLUTION. IT IS
ALSO CALLED A PRESENTATION LAYER BECAUSE IT PROVIDES AN INTERACTIVE
USER INTERFACE.
THE BUSSINESS SERVICES LAYER CONTROLS THE ENFORCEMENT OF BUSSINESS
RULES ON THE DATA OF AN ORGANIZATION.
FOR EXAMPLE, AN ORAGANIZATION MAY HAVE DECIDED THAT THE CREDIT LIMIT OF
CLIENTS CANNOT EXCEED $200000.
THE BUSSINESS SERVICE LAYER PERFORMS VALIDATIONS PERTAINING TO BUSSINESS
RULES.
IT ENSURES THAT BACK END DOESNT RECEIVE INCORRECT DATA.
THE DATA SERVICES LAYER COMPRISES THE DATA AND THE FUNCTIONS FOR
MANIPULATING THIS DATA.
APPLICATIONS MAY VARY FROM SINGLE TIER DESKTOP APPLICATIONS
(APPLICATIONS THAT FOLLOW THE SINGLE TIER ARCHITECTURE) TO MULTI-TIER
APPLICATIONS( APPLICATIONS THE FOLLOW THE TWO ,THREE,OR N TIER
ARCHITECTURE.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

478

SINGLE_TIER ARCHITECTURE:
IN THE CASE OF THE SINGLE TIER ARCHITECTURE, A SINGLE EXECUTABLE FILE
HANDLES ALL FUNCTIONS RELATING TO THE USER,BUSSINE AND DATA SERVICE
LAYERS.
SUCH AN APPLICATION IS ALSO CALLED A MONOLITHIC APPLICATION.
SOME OF THE VERY EARLY COBOL PROGRAMS PERFORMING EXTREMELY MISSION
CRITICAL OPERATIONS FALL UNDER THIS CATEGORY.
MONOLITHIC APPLICATIONS
USER SERVICES

BUSSINESS SERVICES

DATA SERVICES

TWO-TIER ARCHITECTURE:
THE TWO TIER ARCHITECTURE DIVIDES AN APPLICATION IN TO THE FOLLOWING
TWO
COMPONENTS:
CLIENT : IMPLEMENTS THE USER INTERFACE.
SERVER : STORES DATA.
THUS , IN THE CASE OF THE TWO-TIER ARCHITECTURE , THE USER AND DATA
SERVICES ARE LOCATED SEPARATELY, EITHER ON THE SAME MACHINE OR ON
SEPARATE MACHINES. FOR EXAMPLE YOU MIGHT HAVE A VISUAL BASIC
APPLICATION, WHICH PROVIDES THE USER INTERFACE AND SQL SERVER 7.0 WHICH
MANAGES DATA.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

479

IN THE TWO-TIER ARCHITECTURE, THE BUSSINESS SERVICES LAYER MAY BE


IMPLEMENTED IN ONE OF THE FOLLOWING WAYS:
BY USING FAT CLIENT.
BY USING FAT SERVER.
BY DIVIDING THE BUSSINESS SERVICES BETWEEN THE USER SERVICES AND THE
DATA SERVICES.

FAT CLIENT :
IN THE CASE OF FAT CLIENTS,THE BUSSINESS SERVICES LAYER IS COMBINED WITH
THE USER SERVICES LAYER. CLIENTS EXECUTE THE PRESENTATION LOGIC AND
ENFORCES BUSSINESS RULES.
THE SERVER STORES DATA AND PROCESSESS TRANSACTIONS. THE FAT CLIENT
MODEL IS USED WHEN THE SERVER IS OVERLOADED WITH TRASACTION
PROCESSING ACTIVITIES AND IS NOT EQUIPPED TO PROCESS BUSSINESS LOGIC.

FAT CLIENT
CLIENT
USER TIER

SERVER
BUSSINESS
LOGIC.

DATA TIER.

FAT SERVER:
IN A TWO TIER ARCHITECTURE WITH A FAT SERVER, THE BUSSINESS SERVICES
LAYER IS COMBINED WITH THE DATA SERVICES LAYER. AS BUSSINESS SERVICES ARE
STORED ON THE SERVER,MOST OF THE PROCESSING TAKES PLACE ON THE SERVER.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
CLIENT.
USER TIER.

480

FAT SERVER.
BUSSINESS
LOGIC.

SERVER.
DATA TIER.

DIVIDING BUSSINESS SERVICES BETWEEN THE USER AND DATA


SERVICES:
YOU CAN ALSO IMPLEMENT A TWO-TIER MODEL IN WHICH THE BUSSINESS SERVICES
ARE DISTRIBUTED BETWEEN THE USER AND DATA SERVICES. IN THIS CASE , THE
PROCESSING OF BUSSINESS LOGIC IS DISTRIBUTED BETWEEN THE USER AND DATA
SERVICES.

THREE-TIER ARCHITECTURE:

IN THE CASE OF THE THREE-TIER ARCHITECTURE, ALL THE THREE SERVICES LAYERS
RESIDE SEPARETLEY, EITHER ON THE SAME MACHINE OR ON DIFFERENT MACHINES.
THE USER INTERFACE INTERACTS WITH THE BUSSINESS LOGIC. THE BUSSINESS
LOGIC VALIDATES THE DATA SENT BY THE INTERFACES AND FORWARDS IT TO THE
DATABASE IF IT CONFORMS TO THE REQUIREMENTS.
THE FRONT END ONLY INTERACTS WITH BUSINESS LOGIC, WHICH IN TURN,
INTERACTS WITH THE DATABASE.

CLIENT.
USER
SERVICES.

I Soft Solutions ,Bang-54.

BUSSINESS LOGIC.
BUSSINESS
SERVICES.

SERVER.
DATA SERVICES.

STRUCTURED QUERY LANGUAGE

ORACLE

481

N-TIER ARCHITECTURE.

AN N-TIER APPLICATIONS USES BUSSINESS OBJECTS FOR HANDLING BUSSINESS


RULES AND DATA ACCESS. IT HAS MULTIPLE SERVERS HANDLING THE BUSSINESS
SERVICES.
THIS APPLICATION ARCHITECTURE PROVIDES VARIOUS ADVANTAGES OVER OTHER
TYPES OF APPLICATION ARCHITECTURES.
SOME OF THE ADVANTAGES INCLUDES EXTENSIBILITY, RESILIENCE TO CHANGE .
MAINTAINABILITY, AND SCALABILITY OF THE APPLICATION.

SUBPROGRAMS:
SQL> DROP TABLE DEPT1;
Table dropped.
1 CREATE TABLE DEPT1
2 AS
3* SELECT * FROM DEPT
4 /
Table created.
SQL> DELETE FROM DEPT1;
4 rows deleted.
SQL> CREATE OR REPLACE PROCEDURE ADDDEPT
2 (P_DEPTNO IN DEPT1.DEPTNO%TYPE,
3 P_DNAME IN DEPT1.DEPTNO%TYPE,
4 P_LOC IN DEPT1.DEPTNO%TYPE)
5 AS
6 BEGIN
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

482

7 INSERT INTO DEPT1 VALUES


8 (P_DEPTNO,P_DNAME,P_LOC);
9 END;
10 /
Procedure created.

SQL> DECLARE
2 V_DEPTNO DEPT1.DEPTNO%TYPE:=10;
3 V_DNAME DEPT1.DNAME%TYPE:='ACCOUNTING';
4 V_LOC

DEPT1.LOC%TYPE:='NEW YORK';

5 BEGIN
6 ADDDEPT(V_DEPTNO,V_DNAME,V_LOC);
7 END;
8 /
PL/SQL procedure successfully completed.
SQL> SELECT * FROM DEPT1;
DEPTNO DNAME
LOC
---------- -------------- ------------10 ACCOUNTING NEW YORK

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

483

THE VARIABLES DECLARED IN THE PRECEDING BLOCK V_DEPTNO,V_DNAME,V_LOC


ARE PASSED AS ARGUMENTS TO ADDDEPT. IN THIS CONTEXT, THEY ARE KNOWN AS
ACTUAL PARAMETERS.
WHERE AS PARAMETERS IN THE PROCEDURE DECLARATION OF
ADDDEPT(P_DEPTNO,P_DNAME,P_LOC) ARE KNOWN AS FORMAL PARAMETERS.
ACTUAL PARAMETERS CONTAINS THE VALUES PASSED TO THE PROCEDURE WHEN IT
IS CALLED, AND THEY RECEIVE RESULTS FROM THE PROCEDURE WHEN IT RETURNS
(DEPENDING UPON MODE).
THE VALUES OF THE ACTUAL PARAMETERS ARE THE ONES THAT WILL BE USED IN
PROCEDURE.
THE FORMAL PARAMETERS ARE THE PLACE HOLDERS FOR THE VALUES OF THE
ACTUAL PARAMETERS.
WHEN THE PROCEDURE IS CALLED, THE FORMAL PARAMETERS ARE ASSIGNED THE
VALUES OF THE ACTUAL PARAMETERS.
WHEN THE PROCEDURE RETURNS, THE ACTUAL PARAMETERS ARE ASSIGNED THE
VALUES OF THE FORMAL PARAMETERS.

1 CREATE OR REPLACE PROCEDURE MODETEST


2 (P_INPARAMETER IN NUMBER,
3 P_OUTPARAMETER OUT NUMBER,
4 P_INOUTPARAMETER IN OUT NUMBER) IS
5 V_LOCALVARIABLE NUMBER :=0;
6 BEGIN
7 DBMS_OUTPUT.PUT_LINE('INSIDE MODE TEST');
8 IF (P_INPARAMETER IS NULL) THEN
9 DBMS_OUTPUT.PUT_LINE('P_INPARAMETER IS NULL');
10 ELSE

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

484

11 DBMS_OUTPUT.PUT_LINE('P_INPARAMETER = ' ||P_INPARAMETER);


12 END IF;
13 IF (P_OUTPARAMETER IS NULL) THEN
14 DBMS_OUTPUT.PUT_LINE('P_OUTPARAMETER IS NULL');
15 ELSE
16 DBMS_OUTPUT.PUT_LINE('P_OUTPARAMETER = ' ||P_OUTPARAMETER);
17 END IF;
18 IF (P_INOUTPARAMETER IS NULL) THEN
19 DBMS_OUTPUT.PUT_LINE('P_INOUTPARAMETER IS NULL');
20 ELSE
21 DBMS_OUTPUT.PUT_LINE('P_INOUTPARAMETER = ' ||P_INOUTPARAMETER);
22 END IF;
23 /* ASSIGN P_INPARAMTER TO V_LOCALVARIABLE. THIS IS LEGAL */
24 V_LOCALVARIABLE := P_INPARAMETER; -- LEGAL;
25 /* ASSIGN 9 TO P_INPARAMTER.THIS IS ILLEGAL */
26 --P_INPARAMETER:=9;--ILLEGAL
27 /* ASSIGN 9 TO P_OUTPARAMTER.THIS IS LEGAL */
28 P_OUTPARAMETER:=7;--LEGAL
29 /* ASSIGN P_OUTPARAMTER TO V_LOCAL VARIBALE .THIS IS LEGAL */
30 V_LOCALVARIABLE :=P_OUTPARAMETER;--LEGAL
31 /* ASSIGN P_INOUTPARAMTER TO V_LOCAL VARIBALE .THIS IS LEGAL */
32 V_LOCALVARIABLE :=P_INOUTPARAMETER;--LEGAL
33 /* ASSIGN 9 TO P_INOUTPARAMTER.THIS IS LEGAL */
34 P_INOUTPARAMETER:=9;--LEGAL
35 DBMS_OUTPUT.PUT_LINE('AT END OF MODETEST');

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

485

36 IF (P_INPARAMETER IS NULL) THEN


37 DBMS_OUTPUT.PUT_LINE('P_INPARAMETER IS NULL');
38 ELSE
39 DBMS_OUTPUT.PUT_LINE('P_INPARAMETER = ' ||P_INPARAMETER);
40 END IF;
41 IF (P_OUTPARAMETER IS NULL) THEN
42 DBMS_OUTPUT.PUT_LINE('P_OUTPARAMETER IS NULL');
43 ELSE
44 DBMS_OUTPUT.PUT_LINE('P_OUTPARAMETER = ' ||P_OUTPARAMETER);
45 END IF;
46 IF (P_INOUTPARAMETER IS NULL) THEN
47 DBMS_OUTPUT.PUT_LINE('P_INOUTPARAMETER IS NULL');
48 ELSE
49 DBMS_OUTPUT.PUT_LINE('P_INOUTPARAMETER = ' ||P_INOUTPARAMETER);
50 END IF;
51* END MODETEST;
52 /
Procedure created.

PASSING VALUES BETWEEN FORMAL AND ACTUAL PARAMETERS:


SQL> DECLARE

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

486

2 V_IN NUMBER:=1;
3 V_OUT NUMBER:=2;
4 V_INOUT NUMBER:=3;
5 BEGIN
6 DBMS_OUTPUT.PUT_LINE('BEFORE CALLING MODETEST');
7 DBMS_OUTPUT.PUT_LINE('V_IN = ' || V_IN || ' V_OUT = ' || V_OUT || ' V_INOUT = ' ||
V_INOUT)
8 ;
9 MODETEST(V_IN,V_OUT,V_INOUT);
10 DBMS_OUTPUT.PUT_LINE('AFTER CALLING MODETEST');
11 DBMS_OUTPUT.PUT_LINE(' V_IN = ' || V_IN || ' V_OUT = ' || V_OUT || ' V_INOUT = ' ||
V_INOUT)
12 ;
13 END;
14 /
PL/SQL procedure successfully completed.
BEFORE CALLING MODETEST
V_IN = 1 V_OUT = 2 V_INOUT = 3
INSIDE MODE TEST
P_INPARAMETER = 1
P_OUTPARAMETER IS NULL
P_INOUTPARAMETER = 3
AT END OF MODETEST
P_INPARAMETER = 1
P_OUTPARAMETER = 7
P_INOUTPARAMETER = 9

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

487

AFTER CALLING MODETEST


V_IN = 1 V_OUT = 7 V_INOUT = 9
PL/SQL procedure successfully completed.
THE OUTPUT SHOWS THAT THE OUT PARAMETER HAS BEEN INITIALIZED TO NULL
INSIDE THE PROCEDURE.ALSO THE VALUES OF THE IN AND IN OUT FORMAL
PARAMETERS AT THE END OF THE PROCEDURE HAVE BEEN COPIED BACK TO THE
ACTUAL PARAMETERS WHEN THE PROCEDURE ENDS.
LITERALS OR CONSTANTS AS ACTUAL PARAMETERS:
HERE WE REPALCED IN PARAMETER WITH LITERAL.
1 DECLARE
2 V_OUT NUMBER :=2;
3 V_INOUT NUMBER :=3;
4 BEGIN
5 MODETEST(1,V_OUT,V_INOUT);
6* END;
SQL> /
INSIDE MODE TEST
P_INPARAMETER = 1
P_OUTPARAMETER IS NULL
P_INOUTPARAMETER = 3
AT END OF MODETEST
P_INPARAMETER = 1
P_OUTPARAMETER = 7
P_INOUTPARAMETER = 9
PL/SQL procedure successfully completed.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

488

HERE IF WE REPLACE V_OUT WITH LITERAL.


1 DECLARE
2 V_INOUT NUMBER :=3;
3 BEGIN
4 MODETEST(1,2,V_INOUT);
5* END;
6 /
MODETEST(1,2,V_INOUT);
*
ERROR at line 4:
ORA-06550: line 4, column 12:
PLS-00363: expression '2' cannot be used as an assignment target
ORA-06550: line 4, column 1:
PL/SQL: Statement ignored
COMPILATION CHECKS:
THE PL/SQL COMPILER WILL CHECK FOR LEGAL ASSIGNMENTS WHEN THE
PROCEDURE IS CREATED.
FOR EXAMPLE, IF WE REMOVE THE COMMENTS ON THE ASSIGNMENT TO
P_INPARAMETER,MODE TEST GENERATES THE FOLLOWING ERROR IF WE ATTEMPT
TO COMPILE IT.
PLS-363:
EXPRESSION P_INPARAMETER CANNOT BE USED AS AN ASSIGNMENT TARGET.
READING FROM OUT PARAMETERS:
PRIOR TO VERSION 7.3.4 AND IN 8.0.3, IT IS ILLEGAL TO READ FROM AN OUT
PARAMETER IN A PROCEDURE.
IF YOU ATTEMPT TO COMPILE MODETEST AGAINST AN 8.0.3 DATABASE,WE RECEIVE
THE FOLLOWING ERROR MESSAGE.
PLS-00365:
P_OUTPARAMETER IS AN OUT PARAMETER AND CANNOT READ.
ORACLE VERSION

LEGAL TO READ OUT PARAMETERS?

PRIOR TO 7.3.4
I Soft Solutions ,Bang-54.

NO
STRUCTURED QUERY LANGUAGE

ORACLE

489

7.3.4

YES

8.0.3

NO

8.0.4

AND HIGHER

YES.

CONSTRAINTS ON FORMAL PARAMETERS:


1 CREATE OR REPLACE PROCEDURE PARAMETERLENGTH
2 (P_PARAMETER1 IN OUT VARCHAR2(10),
3 P_PARAMETER2 IN OUT NUMBER(3,1)) AS
4 BEGIN
5 P_PARAMETER1:='ABCDEFGHIJKLM';
6 P_PARAMETER2 :=12.3;
7* END;
THE CORRECT DECLARATION FOR THIS PROCEDURE WOULD BE.

1 CREATE OR REPLACE PROCEDURE PATAMETERLENGTH


2 (P_PARAMETER1 IN OUT VARCHAR2,
3 P_PARAMETER2 IN OUT NUMBER) AS
4 BEGIN
5 P_PARAMETER1:='ABCDEFGHIJKLM';
6 P_PARAMETER2 :=12.3;
7* END;
SQL> /
Procedure created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

490

SO,WHAT ARE THE CONSTRAINTS ON P_PARAMETER1 AND P_PARAMETER2?


THEY COME FROM THE ACTUAL PARAMETERS. IF WE CALL PARAMETERLENGTH
WITH.
1 DECLARE
2 V_VARIABLE1 VARCHAR2(40);
3 V_VARIABLE2 NUMBER(7,3);
4 BEGIN
5 PARAMETERLENGTH(V_VARIABLE1,V_VARIABLE2);
6* END;
SQL> /
PL/SQL procedure successfully completed.
HERE P_PARAMETER1 WILL HAVE A MAXIMUM LENGHT OF 40(COMING FROM THE
ACTUAL PARAMETER V_VARIABLE1) AND P_PARAMETER2 WILL HAVE PRECISION 7
AND SCALE 3(COMING FROM THE ACTUALPARAMETER V_VARIABLE2. IT IS VERY
IMPORTANT.
SQL> DECLARE
2 V_VARIABLE1 VARCHAR2(10);
3 V_VARIABLE2 NUMBER(7,3);
4 BEGIN
5 PARAMETERLENGTH(V_VARIABLE1,V_VARIABLE2);
6 END;
7 /

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

491

DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "SCOTT.PARAMETERLENGTH", line 5
ORA-06512: at line 5
THE ONLY DIFFERENCE BETWEEN THIS BLOCK AND THE PRIOR ONE IS THE
V_VARIABLE1,AND HENCE P_PARAMETER1 HAS A LENGTH OF 10 RATHER THAN 40.
BECAUSE PARAMETERLENGTH ASSIGNS A CHARACTER STRING OF LENGTH 15 TO
P_PARAMETER1(AND HENCE V_VARIABLE1), THERE IS NOT ENOUGH ROOM IN THE
STRING.
THE SOURCE OF THE ERROR IS NOT IN THE PROCEDURE- IT IS IN THE CODE THAT
CALLS THE PROCEDURE.IN ADDITION ,THE ORA-6502 IS RUNTIME ERROR, NOT
COMPILE TIME ERROR.THUS PROCEDURE CREATED SUCCESFULLY.
HERE ERROR WAS ACTUALLY RAISED WHEN THE PROCEDURE RETURNED AND THE
PL/SQL ENGINE ATTEMPTED TO COPY THE ACTUAL VALUE 'ABCDEFGHIJKLMNO' INTO
THE FORMAL PARAMETER.
%TYPE AND PROCEDURE PARAMETERS:
SQL> CREATE TABLE TEST
2 (NO NUMBER(3));
1 CREATE OR REPLACE PROCEDURE PARAMETERLENGHT1
2 (P_PARAMETER1 IN OUT VARCHAR2,
3 P_PARAMETER2 IN OUT TEST.NO%TYPE)
4 AS
5 BEGIN
6 P_PARAMETER2 :=12345;
7* END;
8 /
Procedure created.
HERE P_PARAMETER2 WILL BE CONSTRAINED WITH PRECISION OF 3, BECAUSE THAT
IS THE PRECISION OF THE TEST TABLE NO COLUMN.EVEN IF WE CALL

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

492

PARAMETERLENGTH WITH AN ACTUAL PARAMETER OF ENOUGH PRECISION,THE


FORMAL PRECISION IS TAKEN.
1 DECLARE
2 V_VARIABLE1 VARCHAR2(1);
3 V_VARIABLE2 NUMBER; -- DECLARED VARIABLE WITH NO CONSTRAINTS.
4 BEGIN
5 /* HERE EVEN THOUGH THE ACTUAL PARAMETER HAS ROOM FOR 12345, THE
CONSTRAINT ON THE FORMAL
6 PARAMETER IS TAKEN AND WE GET ORA-6502 ON THIS PROCEDURE CALL. */
7 PARAMETERLENGHT1(V_VARIABLE1,V_VARIABLE2);
8* END;
SQL> /

DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: number precision too large
ORA-06512: at "SCOTT.PARAMETERLENGHT1", line 6
ORA-06512: at line 7
CREATING, ALTERING AND DROPING STORTED PROCEDURES:
THERE ARE TWO MAIN WAYS TO CREATE PROCEDURE:
1.USING THE CREATE PROCEDURE COMMAND IN A PL/SQL COMMAND SCRIPT THAT
EXECUTES IN THE SQL*PLUS COMMAND LINE INTERFACE.
2. USING GUI TOOLS,SUCH AS PROCEDURE BUILDER.
POINTS TO REMEMBER WHILE CREATING STORED PROCEDURES:

CREATE OR [REPLACE] PROCDURE PROCEDURE_NAME


[(ARGUMENT[{IN|OUT|IN OUT}] TYPE,

[(ARGUMENT[{IN|OUT|IN OUT}] TYPE]


I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

493

{ IS|AS}
PROCEDURE BODY.
CREATE OR REPLACE PROCEDURE PROCEDURE_NAME [ PARAMETER LIST]
IS/AS
/* DECLARATIVE SECTION*/
BEGIN
/* EXECUTABLE SECTION*/
EXCEPTION
/* EXEPTION SECTION*/
END [PROCEDURE_NAME];
THE RESERVED WORDS CREATE PROCEDURE.
THE NAME OF STORED PROCEDURE CAN BE UP TO 30 CHARACTERS NO SPACES.
THE RESERVED WORD IS OR THE RESERVED WORD AS EITHER IS ACCEPTED.
A VALID PL/SQL BLOCK.
THE KEY WORDS BEGIN AND END ARE REQUIRED.
EXCEPTION IS OPTIONAL.
THE KEY WORD DECLARE ,HOWEVER NEVER USED.
INSTEAD OF USING DECLARE TO BEGIN THE OPTIONAL DECLARATIVE SECTION OF
THE BLOCK, MAKE ANY DECLARATIONS AFTER THE RESERVED WORD IS AND
BEFORE THE RESERVED WORD BEGIN.
WE TYPE SLASH (/) AT THE END OF FILE.
WE USE THAT TO SUBMIT THE PL/SQL BLOCK TO THE SQL*PLUS INTERFACE FOR
PROCESSING.
WHEN U SUBMIT A CREATE PROCEDURE COMMAND TO SQL*PLUS THE FOLLOWING
HAPPENS:
THE CODE STORED IN THE DATA DICTIONARY.
THE CODE IS PARSED FOR SYNTAX AND DETERMINED TO BE EITHER VALID OR
INVALID.
IF THE CODE IS VALID, YOU ARE PROVIDED WITH A PROCEDURE CREATED
MESSAGE,AND PROCEDURE IS NOW GIVEN A STATUS OF VALID AND IS AVALIABLE
FOR EXECUTION.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

494

IF THE CODE IS INVALID, YOU ARE PROVIDED WITH SOME SORT OF ERROR MESSAGE,
AND THE CODE, WHICH IS NOW STORED IN THE DATA DICTIONARY, IS GIVEN A
STATUS OF INVALID AND NOT AVALIABLE FOR EXECUTION.
PLEASE NOTE THE WHETHER THE PROCEDURE IS SUCCESFULLY PARSED OR NOT, IT
WILL BE STORED IN THE DATA DICTIONARY.
ONCE PROCEDURE IS STORED IN TH DATABASE,YOU CANNOT CREATE ANOTHER
PROCEDURE WITH SAME NAME. U WILL GET ERROR.
HOWEVER , AN OPTION IN THE CREATE PROCEDURE COMMAND THAT IS OR
REPLACE ENABLES U TO AUTOMATICALLY OVERWRITE ANY PREEXISTING
PROCEDURE OF THE SAME NAME.
THE OR REPLACE OPTION IN THE CREATE PROCEDURE COMMAND GUARANTEES
THAT THE PROCEDURE IS CREATED AND STORED ,WHETHER AN EXISTING
PROCEDURE OF THE SAME NAME IS ALREADY STORED IN DATABASE OR NOT.
PROCEDURES OPTIONALLY INCLUDE SOMETHING CALLED AN END LABEL.WHICH IS
THE NAME OF THE PROCEDURE REPEATED AFTER THE END STATEMENT.
CREATE OR REPLACE PROCEDURE GAYATRI
IS
BEGIN
-- CLEAN OUT THE DEPT TABLE;
DELETE FROM DEPT;
COMMIT;
END GAYATRI;
/
THE ADVANTAGE TO AN END LABEL BECOMES MORE IMPORTANT ONCE YOU BEGIN
COMBINING MANY PROCEDURES IN TO A PACKAGE,WHEN SEVERAL PROCEDURES
ARE INCLUDED ONE AFTER ANOTHER. AT THAT TIME IT MAY BE DIFFICULT TO BE
SURE WHERE ONE PROCEDURE ENDS AND ANOTHER PROGRAM BEGINS.THE USE OF
THE END LABEL CAN HELP PREVENT CONFUSSION.
ALTERING PROCEDURES:
ONCE PROCEDURE HAS BEEN CREATED, YOU CAN USE TWO METHODS TO ALTER
THE PROCEDURE.
IF YOU ARE REPLACING THE ORIGINAL SOURCE CODE WITH NEW SET OF SOURCE
CODE, USE THE OR REPLACE OPTION.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

495

IF HOWEVER YOU ARE RECOMPILING THE PROCEDURE WITHOUT CHANGING THE


CODE,THEN USE THE ALTER PROCEDURE COMMAND.
WE USE ALTER PROCEDURE WHEN ANY OBJECT WHICH IS REFERENCED FROM
WITHIN YOUR PROCEDURE SUCH AS TABLE HAS BEEN CHANGED.THIS
AUTOMATICALLY CAUSES PROCEDURE TO BE FLAGGED TO INVALID.
SQL> DROP TABLE DEPT_DUP;
Table dropped.
SQL> CREATE TABLE DEPT_DUP
2 AS
3 SELECT * FROM DEPT;
Table created.
SQL> CREATE OR REPLACE PROCEDURE GAYATRI
2 AS
3 BEGIN
4 DELETE FROM DEPT_DUP
5 WHERE DEPTNO=10;
6 COMMIT;
7 END;
8 /
Procedure created.
SQL> DESC USER_OBJECTS
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------OBJECT_NAME
VARCHAR2(128)
SUBOBJECT_NAME
VARCHAR2(30)
OBJECT_ID
NUMBER
DATA_OBJECT_ID
NUMBER
OBJECT_TYPE
VARCHAR2(18)
CREATED
DATE
LAST_DDL_TIME
DATE
TIMESTAMP
VARCHAR2(19)
STATUS
VARCHAR2(7)
TEMPORARY
VARCHAR2(1)
GENERATED
VARCHAR2(1)
SECONDARY
VARCHAR2(1)
SQL> SELECT STATUS FROM USER_OBJECTS
2 WHERE OBJECT_NAME='GAYATRI' AND OBJECT_TYPE='PROCEDURE';

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

496

STATUS
------VALID
SQL> DROP TABLE DEPT_DUP;
Table dropped.
SQL> SELECT STATUS FROM USER_OBJECTS
2 WHERE OBJECT_NAME='GAYATRI' AND OBJECT_TYPE='PROCEDURE';
STATUS
------INVALID
SQL> CREATE TABLE DEPT_DUP
2 AS
3 SELECT * FROM DEPT;
Table created.
SQL> SELECT STATUS FROM USER_OBJECTS
2 WHERE OBJECT_NAME='GAYATRI' AND OBJECT_TYPE='PROCEDURE';
STATUS
------INVALID
SQL> ALTER PROCEDURE GAYATRI
2 COMPILE;
Procedure altered.
SQL> SELECT STATUS FROM USER_OBJECTS
2 WHERE OBJECT_NAME='GAYATRI' AND OBJECT_TYPE='PROCEDURE';
STATUS
------VALID
SQL> DROP PROCEDURE GAYATRI;
Procedure dropped.

INVOKING PROCEDURES:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

497

ONCE A PROCEDURE HAS BEEN CREATED AND STORED IN THE DATABASE, IT CAN BE
INVOKED FROM
AN EXECUTABLE STATEMENT OF A PL/SQL BLOCK.
A COMMAND ENTERED IN THE SQL*PLUS COMMAND LINE INTERFACE.
1ST WAY:
BEGIN
GAYATRI;
END;
BEGIN
CALL GAYATRI;-- IT IS A STORED PROCEDURE.
IF CONDTION IS TRUE THEN
CALL PRATHIMA -- IT IS A STORED PROCEDURE.
ELSE
CALL SRI;-- IT IS A STORED PROCEDURE.
END IF;
WHEN A PL/SQL BLOCK CALLS A PROCEDURE THE CALLING BLOCK TEMPORARILY
SUSPENDS EXECUTION AT THE POINT OF THE PROCEDURE CALL AND WAITS WHILE
THE CALLED PROCEDURE EXECUTES.
ONCE THE CALLED PROCEDURE COMPLETES EXECUTION, CONTROL PASSES BACK TO
THE CALLING PL/SQL BLOCK, WHICH THEN PICKS UP WITH NEXT EXECUTABLE
STATEMENT AFTER PROCEDURE CALL AND CONTINUES EXECUTION.

2ND WAY:
EXECUTE GAYATRI;
EXEC GAYATRI;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

498

DATA DICTIONARY RESOURCES FOR PROCEDURES:


USER_DEPENDENCIES:
IS A VIEW IN THE DATA DICTIONARY IS WHERE YOU WILL FIND THE RELATIONSHIPS
THAT YOUR PROGRAM UNITS HAVE WITH THE DATABASE OBJECTS IN THE SAME
SCHEMA AS WELL AS THOSE DATABASE OBJECTS IN OTHER SCHEMAS.

USER_OBJECTS:
THIS VIEW CONTAINS A MASTER LIST OF ALL OBJECTS,INCLUDING TABLES
,VIEWS,SEQUENCES,SYNONYMS AND FOR OUR PURPOSES PL/SQL PROGRAM UNITS.
USER_OBJECT_SIZE:
THIS VIEW CONTAINS INFORMATION ABOUT THE SIZE OF THE OBJECTS THAT ARE
LISTED IN USER_OBJECTS.
USER_SOURCE:
THIS IS WHERE ACTUAL SOURCE CODE OF THE PL/SQL PROGRAM UNITS IS FOUND.
USER_ERRORS:
THIS IS WHERE ERRORS RESULTING FROM COMPILATION ARE STORED.
THE EXECUTE IMMEDIATE STATEMENT:
THE EXECUTE IMMDEDIATE STATEMENT PARSES A DYNAMIC STATEMENT OR A
PL/SQL BLOCK FOR IMMEDIATE EXECUTION AND HAS THE STRUCTURE SHOWN
BELOW.
EXECUTE IMMEDIATE DYNAMIC_SQL_STRING
[INTO DEFINED_VARIABLE1,DEFINED_VARIABLE2,]
[USING [IN | OUT | IN OUT ] BIND_ARGUMENT1,BIND_ARGUMENT2,.]
RETURNING INTO | RETURN BIND_ARGUMENT1,BIND_ARGUMENT2,.]

PL/SQL USES EARLY BINDING TO EXECUTE SQL STATEMENTS. THIS HASTHE


CONSEQUENCE THAT ONLY
DML STATEMENTS CAN BE INCLUDED DIRECTLY IN PL/SQL BLOCKS.THIS CAN BE
RECTIFIED,HOWEVER,

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

499

SQL> THROUGH DYNAMIC SQL.RATHER THAN BEING PARSED ALONG WITH THE
PL/SQL BLOCK,DYNAMIC SQL IS
PARSED AND SUBSEQUENTLY EXECUTED AT RUNTIME.
THERE ARE TWO TECHNIQUES FOR EXECUTING DYNAMIC SQL IN PL/SQL.
THE FIRST IS THE DBMS_SQL PACKAGE.
THE SECOND TECHNIQUE, INTRODUCED IN ORACLE 8I, IS NATIVE DYNAMIC SQL.IT IS
SIGNIFICANTLY SIMPLER TO USE AND FASTER THAN DBMS_SQL.
SQL> CREATE TABLE NATIVE
2 (EMPNO NUMBER(10));
Table created.
SQL> DROP TABLE NATIVE;
Table dropped.
SQL> BEGIN
2 CREATE TABLE NATIVE
3 (EMPNO NUMBER(10));
4 END;
5 /
CREATE TABLE NATIVE
*
ERROR at line 2:
ORA-06550: line 2, column 1:
PLS-00103: Encountered the symbol "CREATE" when expecting one of the
following:
begin case declare exit for go to if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
save point set sol execute commit for all merge
<a single-quoted SQL string> pipe

1 DECLARE
2 V_SQLSTRING VARCHAR2(200);
3 V_PLSQLBLOCK VARCHAR2(200);
4 BEGIN
5 --FIRST CREATE A TEMPORARY TABLE,USING A LITERAL. NOTE THAT
6 --THERE IS NO TRAILING SEMICOLON IN THE STRING.
7 EXECUTE IMMEDIATE
8 'CREATE TABLE NATIVE (EMPNO NUMBER(10))';
9 --INSERT SOME ROWS USING A STRING.AGAIN, THERE IS NO TRAILING SEMICOLON
INSIDE THE STRING.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

500

10 FOR V_COUNTER IN 1..10 LOOP


11 V_SQLSTRING :='INSERT INTO NATIVE VALUES (' || V_COUNTER || ')';
12 EXECUTE IMMEDIATE V_SQLSTRING;
13 END LOOP;
14 -- PRINT OUT THE CONTENTS OF THE TABLE USING AN ANONYMOUS PL/SQL
BLOCK. HERE
15 --WE PUT THE ENTIRE BLOCK INTO A SINGLE STRING(INCLUDING THE
SEMICOLON).
16 V_PLSQLBLOCK:=
17 'BEGIN
18 FOR V_REC IN (SELECT * FROM NATIVE) LOOP
19 DBMS_OUTPUT.PUT_LINE(V_REC.EMPNO);
20 END LOOP;
21 END;';
22 -- AND NOW WE EXECUTE THE ANONYMOUS BLOCK.
23 EXECUTE IMMEDIATE V_PLSQLBLOCK;
24 --FINALLY , DROP THE TABLE.
25 EXECUTE IMMEDIATE 'DROP TABLE NATIVE';
26* END;
SQL> /
PL/SQL procedure successfully completed.
SQL> SET SERVEROUTPUT ON
SQL> /
1
2
3
4
5
6
7
8
9
10
PL/SQL procedure successfully completed.
1 DECLARE
2 V_SQLSTRING VARCHAR2(200);
3 V_PLSQLBLOCK VARCHAR2(200);
4 BEGIN
5 --FIRST CREATE A TEMPORARY TABLE,USING A LITERAL. NOTE THAT
6 --THERE IS NO TRAILING SEMICOLON IN THE STRING.
7 EXECUTE IMMEDIATE
8 'CREATE TABLE NATIVE (EMPNO NUMBER(10))';
9 --INSERT SOME ROWS USING A STRING.AGAIN, THERE IS NO TRAILING SEMICOLON
INSIDE THE STRING.
10 FOR V_COUNTER IN 1..10 LOOP
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

501

11 V_SQLSTRING :='INSERT INTO NATIVE VALUES (' || V_COUNTER || ')';


12 EXECUTE IMMEDIATE V_SQLSTRING;
13 END LOOP;
14 -- PRINT OUT THE CONTENTS OF THE TABLE USING AN ANONYMOUS PL/SQL
BLOCK. HERE
15 --WE PUT THE ENTIRE BLOCK INTO A SINGLE STRING(INCLUDING THE
SEMICOLON).
16 V_PLSQLBLOCK:=
17 'BEGIN
18 FOR V_REC IN (SELECT * FROM NATIVE) LOOP
19 DBMS_OUTPUT.PUT_LINE(V_REC.EMPNO);
20 END LOOP;
21 END;';
22 -- AND NOW WE EXECUTE THE ANONYMOUS BLOCK.
23 EXECUTE IMMEDIATE V_PLSQLBLOCK;
24 --FINALLY , DROP THE TABLE.
25 --EXECUTE IMMEDIATE 'DROP TABLE NATIVE';
26* END;
SQL> /
1
2
3
4
5
6
7
8
9
10
PL/SQL procedure successfully completed.
SQL> DESC NATIVE
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------EMPNO
NUMBER(10)
SQL> SELECT * FROM NATIVE;
EMPNO
---------1
2
3
4
5
6
7
8
9
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

502

10
10 rows selected.
1 DECLARE
2 V_SQLSTRING VARCHAR2(200);
3 V_PLSQLBLOCK VARCHAR2(200);
4 BEGIN
5 --FIRST CREATE A TEMPORARY TABLE,USING A LITERAL. NOTE THAT
6 --THERE IS NO TRAILING SEMICOLON IN THE STRING.
7 EXECUTE IMMEDIATE
8 'CREATE TABLE NATIVE1 (EMPNO VARCHAR(10))';
9 --INSERT SOME ROWS USING A STRING.AGAIN, THERE IS NO TRAILING SEMICOLON
INSIDE THE STRING.
10 FOR V_COUNTER IN 1..10 LOOP
11 V_SQLSTRING :='INSERT INTO NATIVE1 VALUES (''ROW' || V_COUNTER || ''')';
12 EXECUTE IMMEDIATE V_SQLSTRING;
13 END LOOP;
14 -- PRINT OUT THE CONTENTS OF THE TABLE USING AN ANONYMOUS PL/SQL
BLOCK. HERE
15 --WE PUT THE ENTIRE BLOCK INTO A SINGLE STRING(INCLUDING THE
SEMICOLON).
16 V_PLSQLBLOCK:=
17 'BEGIN
18 FOR V_REC IN (SELECT * FROM NATIVE1) LOOP
19 DBMS_OUTPUT.PUT_LINE(V_REC.EMPNO);
20 END LOOP;
21 END;';
22 -- AND NOW WE EXECUTE THE ANONYMOUS BLOCK.
23 EXECUTE IMMEDIATE V_PLSQLBLOCK;
24 --FINALLY , DROP THE TABLE.
25 --EXECUTE IMMEDIATE 'DROP TABLE NATIVE1';
26* END;
SQL> /
ROW1
ROW2
ROW3
ROW4
ROW5
ROW6
ROW7
ROW8
ROW9
ROW10
PL/SQL procedure successfully completed.
SQL> DESC NATIVE1
Name
I Soft Solutions ,Bang-54.

Null? Type
STRUCTURED QUERY LANGUAGE

ORACLE

503

----------------------------------------------------- -------- -----------------------------------EMPNO


VARCHAR2(10)
SQL> SELECT * FROM NATIVE1;
EMPNO
---------ROW1
ROW2
ROW3
ROW4
ROW5
ROW6
ROW7
ROW8
ROW9
ROW10
10 rows selected.

SQL> SELECT * FROM MY_EMPLOYEE;


EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7782 CLARK
MANAGER
7839 09-JUN-81
2450
10
7839 KING
PRESIDENT
17-NOV-81
5000
10
7934 MILLER CLERK
7782 23-JAN-82
1300
10
SQL> DECLARE
2 SQL_STMT VARCHAR2(100);
3 PLSQL_BLOCK VARCHAR2(300);
4 V_DEPTNO NUMBER(10) :=10;
5 V_TOTAL_EMPLOYEES NUMBER;
6 V_NEW_DEPTNO NUMBER(10);
7 BEGIN
8 --CREATE TABLE MY_EMPLOYEE
9 SQL_STMT := 'CREATE TABLE MY_EMPLOYEE ' ||
10 'AS SELECT * FROM EMP WHERE DEPTNO = ' || V_DEPTNO;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

504

11 EXECUTE IMMEDIATE SQL_STMT;


12 --INSERT RECORD INTO MY_EMPLOYEE TABLE
13 SQL_STMT:=
14 'INSERT INTO MY_EMPLOYEE
15 (EMPNO,ENAME,DEPTNO)
16 VALUES
17 (:EMPNO,:ENAME,:DEPTNO)';
18 EXECUTE IMMEDIATE SQL_STMT USING 1,'PAVAN',10;
19 --SELECT TOTAL NUMBER OF RECORDS FROM MY_EMPLOYEE TABLE AND
DISPLAY RESULTS
20 --ON THE SCREEN
21 EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM MY_EMPLOYEE' INTO
V_TOTAL_EMPLOYEES;
22 DBMS_OUTPUT.PUT_LINE('EMPLOYEES: ' || V_TOTAL_EMPLOYEES);
23 --UPDATE RECORD IN MY_EMPLOYEE TABLE
24 SQL_STMT:=
25 'UPDATE MY_EMPLOYEE SET DEPTNO=9 WHERE EMPNO = :1 '||
26 'RETURNING DEPTNO INTO :2';
27 EXECUTE IMMEDIATE SQL_STMT USING 1 RETURNING INTO V_NEW_DEPTNO;
28 DBMS_OUTPUT.PUT_LINE('NEW DEPTNO:' ||V_NEW_DEPTNO);
29 END;
30 /
EMPLOYEES: 4
NEW DEPTNO:9
PL/SQL procedure successfully completed.
1 DECLARE
2 SQL_STMT VARCHAR2(100);
3 BEGIN
4 --CREATE TABLE MY_EMPLOYEE1
5 SQL_STMT := 'CREATE TABLE MY_EMPLOYEE1 ' ||
6 'AS SELECT * FROM EMP WHERE DEPTNO = :DEPTNO ';
7 EXECUTE IMMEDIATE SQL_STMT USING 10;
8* END;
9 /
DECLARE
*
ERROR at line 1:
ORA-01027: bind variables not allowed for data definition operations
ORA-06512: at line 7
A CREATE TABLE STATEMENT IS A DATA DEFINITION STATEMENT AND AS A RESULT IT
CANNOT ACCEPTANY BIND ARGUMENTS

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

505

1 DECLARE
2 SQL_STMT VARCHAR2(100);
3 V_DEPTNO NUMBER(10) :=10;
4 V_TOTALEMPLOYEES NUMBER(10);
5 BEGIN
6 --CREATE TABLE MY_EMPLOYEE2
7 SQL_STMT :=
8 'CREATE TABLE MY_EMPLOYEE2 ' ||
9 'AS SELECT * FROM EMP ' ||
10 'WHERE DEPTNO = ' || V_DEPTNO;
11 EXECUTE IMMEDIATE SQL_STMT;
12 --SELECT TOTAL NUMBER OF RECORDS FROM MY_EMPLOYEE2 TABLE
13 EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM :MY_TABLE' INTO
V_TOTALEMPLOYEES USING 'MY_EMPLOYEE2'
14 ;
15 DBMS_OUTPUT.PUT_LINE(V_TOTALEMPLOYEES);
16* END;
SQL> /
DECLARE
*
ERROR at line 1:
ORA-00903: invalid table name
ORA-06512: at line 13
SQL> DESC MY_EMPLOYEE2
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------EMPNO
NUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NUMBER(2)
YOU CANNOT PASS NAMES OF SCHEMA OBJECTS TO DYNAMIC SQL STATEMENTS AS
BIND ARGUMENTS.

1 DECLARE
2 SQL_STMT VARCHAR2(100);
3 V_DEPTNO NUMBER(10) :=10;
4 V_TOTALEMPLOYEES NUMBER(10);
5 BEGIN
6 --CREATE TABLE MY_EMPLOYEE2
7 SQL_STMT :=
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

506

8 'CREATE TABLE MY_EMPLOYEE2 ' ||


9 'AS SELECT * FROM EMP ' ||
10 'WHERE DEPTNO = ' || V_DEPTNO;
11 EXECUTE IMMEDIATE SQL_STMT;
12 --SELECT TOTAL NUMBER OF RECORDS FROM MY_EMPLOYEE2 TABLE
13 EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || MY_EMPLOYEE2 INTO
V_TOTALEMPLOYEES
14 ;
15 DBMS_OUTPUT.PUT_LINE(V_TOTALEMPLOYEES);
16* END;
SQL> /
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || MY_EMPLOYEE2 INTO
V_TOTALEMPLOYEES
*
ERROR at line 13:
ORA-06550: line 13, column 46:
PLS-00357: Table,View Or Sequence reference 'MY_EMPLOYEE2' not allowed in this context
ORA-06550: line 13, column 1:
PL/SQL: Statement ignored

SQL> DECLARE
2 SQL_STMT VARCHAR2(100);
3 V_DEPTNO NUMBER(10) :=10;
4 V_TOTALEMPLOYEES NUMBER(10);
5 BEGIN
6 --CREATE TABLE MY_EMPLOYEE2
7 SQL_STMT :=
8 'CREATE TABLE MY_EMPLOYEE2 ' ||
9 'AS SELECT * FROM EMP ' ||
10 'WHERE DEPTNO = ' || V_DEPTNO;
11 EXECUTE IMMEDIATE SQL_STMT;
12 --SELECT TOTAL NUMBER OF RECORDS FROM MY_EMPLOYEE2 TABLE
13 EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || 'MY_EMPLOYEE2' INTO
V_TOTALEMPLOYEES ;
14 DBMS_OUTPUT.PUT_LINE(V_TOTALEMPLOYEES);
15 END;
16 /
3
PL/SQL procedure successfully completed.

SQL> DECLARE
2 SQL_STMT VARCHAR2(100);
3 V_DEPTNO NUMBER(10) :=10;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

507

4 V_TOTALEMPLOYEES NUMBER(10);
5 BEGIN
6 --CREATE TABLE MY_EMPLOYEE2
7 SQL_STMT :=
8 'CREATE TABLE MY_EMPLOYEE2 ' ||
9 'AS SELECT * FROM EMP ' ||
10 'WHERE DEPTNO = ' || V_DEPTNO;
11 EXECUTE IMMEDIATE SQL_STMT;
12 --SELECT TOTAL NUMBER OF RECORDS FROM MY_EMPLOYEE2 TABLE
13 EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM MY_EMPLOYEE2;' INTO
V_TOTALEMPLOYEES ;
14 DBMS_OUTPUT.PUT_LINE(V_TOTALEMPLOYEES);
15 END;
16 /
DECLARE
*
ERROR at line 1:
ORA-00911: invalid character
ORA-06512: at line 13
THE SEMICOLON ADDED TO THE SELECT STATEMENT IS TREATED AS AN INVALID
CHARACTER WHEN
THE STATEMENT IS CREATED DYNAMICALLY.
NESTED TABLES:

SQL> CREATE TYPE BOOKS_TYPE AS OBJECT


2 (BOOK_NO NUMBER(4),
3 BOOK_TITLE VARCHAR2(20),
4 AUTHOR VARCHAR2(10));
5 /
Type created.
SQL> CREATE TYPE BOOKS AS TABLE OF BOOK_TYPE;
2 /
Warning: Type created with compilation errors.
SQL> SHOW ERRORS
Errors for TYPE BOOKS:
LINE/COL ERROR
-------- ----------------------------------------------------------------0/0 PL/SQL: Compilation unit analysis terminated
1/24 PLS-00201: identifier 'BOOK_TYPE' must be declared

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

508

SQL> CREATE OR REPLACE TYPE BOOKS AS TABLE OF BOOKS_TYPE;


2 /
Type created.
CREATING TABLE USING NESTED TABLE;
SQL> CREATE TABLE STUDENT
2 (STUDENT_NO NUMBER(10) CONSTRAINT STUDENT_PK PRIMARY KEY,
3 STUDENT_NAME VARCHAR2(10),
4 BOOKS_ISSUED BOOKS)
5 NESTED TABLE BOOKS_ISSUED STORE AS BOOK_TABLE;
Table created.
BOOKS_ISSUED IS A COLUMN OF TABLE TYPE BOOKS AND BOOK_TABLE IS THE
SYSTEM GENERATED TABLE WHICH WILL CONTAIN THE DATA ACTUALLY STORED IN
THE NESTED TABLE.

EACH ROW OF THE TABLE CONTAINS A NESTED TABLE.


TO INSERT ROWS IN THE NESTED TABLE, WE NEED TO USE THE CONSTRUCTOR
METHOD PROVIDED BY ORACLE.

1 INSERT INTO STUDENT


2 VALUES
3 (100,'PAVAN',BOOKS(BOOKS_TYPE(01,'ORACLE IN 21 DAYS','KEVIN'),
4* BOOKS_TYPE(02,'ORACLE IN 9 DAYS','SMITH')))
SQL> /
1 row created.
SQL> ED
Wrote file afiedt.buf
1 INSERT INTO STUDENT
2 VALUES
3 (101,'KUMAR',BOOKS(BOOKS_TYPE(01,'ORACLE IN 21 DAYS','KEVIN'),
4* BOOKS_TYPE(02,'ORACLE IN 9 DAYS','SMITH')))
5 /
1 row created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

509

BOOKS IS THE CONSTRUCTOR METHOD FOR TABLE TYPE BOOKS AND BOOKS_TYPE
IS THE CONSTRUCTOR METHOD FOR OBJECT TYPE BOOKS_TYPE.

IN PL/SQL:
SQL> DECLARE
2 BOOK_VAR BOOKS;
3 BEGIN
4 BOOK_VAR:=BOOKS(BOOKS_TYPE(03,'ORACLE IN 3DAYS','ALLEN'));
5 INSERT INTO STUDENT
6 VALUES
7 (102,'GAYATRI',BOOK_VAR);
8 END;
9 /
PL/SQL procedure successfully completed.
SQL> SELECT * FROM STUDENT;
STUDENT_NO STUDENT_NA
---------- ---------BOOKS_ISSUED(BOOK_NO, BOOK_TITLE, AUTHOR)
---------------------------------------------------------------------------------------------------100 PAVAN
BOOKS(BOOKS_TYPE(1, 'ORACLE IN 21 DAYS', 'KEVIN'), BOOKS_TYPE(2, 'ORACLE IN 9
DAYS', 'SMITH'))
101 KUMAR
BOOKS(BOOKS_TYPE(1, 'ORACLE IN 21 DAYS', 'KEVIN'), BOOKS_TYPE(2, 'ORACLE IN 9
DAYS', 'SMITH'))
102 GAYATRI
BOOKS(BOOKS_TYPE(3, 'ORACLE IN 3DAYS', 'ALLEN'))

IN PL/SQL:
1
2
3
4
5
6

DECLARE
MBOOK STUDENT.BOOKS_ISSUED%TYPE;
MNAME STUDENT.STUDENT_NAME%TYPE;
CURSOR C IS SELECT STUDENT_NAME,BOOKS_ISSUED FROM STUDENT;
BEGIN
OPEN C;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

510

7 LOOP
8 FETCH C INTO MNAME,MBOOK;
9 EXIT WHEN C%NOTFOUND;
10 DBMS_OUTPUT.PUT_LINE('BOOKS ISSUED TO' || ' ' ||MNAME);
11 --LOOP OVER THE NESTED TABLE AND PRINT BOOKS DETAILS
12 FOR I IN 1..MBOOK.COUNT
13 LOOP
14 DBMS_OUTPUT.PUT_LINE(' ' ||MBOOK(I).BOOK_TITLE);
15 END LOOP;
16 END LOOP;
17 CLOSE C;
18* END;
SQL> /
PL/SQL procedure successfully completed.
SQL> SET SERVEROUTPUT ON
SQL> /
BOOKS ISSUED TO PAVAN
ORACLE IN 21 DAYS
ORACLE IN 9 DAYS
BOOKS ISSUED TO KUMAR
ORACLE IN 21 DAYS
ORACLE IN 9 DAYS
BOOKS ISSUED TO GAYATRI
ORACLE IN 3DAYS
PL/SQL procedure successfully completed.
UPDATING THE NESTED TABLE:
THE OPERATOR ALLOWS NESTED TABLES TO BE MANIPULATED.
SQL> UPDATE THE (
2 SELECT BOOKS_ISSUED FROM STUDENT WHERE STUDENT_NO=100)
3 SET BOOK_TITLE = 'VB'
4 WHERE BOOK_NO = 01;
1 row updated.
SQL> SELECT * FROM STUDENT;
STUDENT_NO STUDENT_NA
---------- ---------BOOKS_ISSUED(BOOK_NO, BOOK_TITLE, AUTHOR)
---------------------------------------------------------------------------------------------------100 PAVAN
BOOKS(BOOKS_TYPE(1, 'VB', 'KEVIN'), BOOKS_TYPE(2, 'ORACLE IN 9 DAYS', 'SMITH'))

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

511

101 KUMAR
BOOKS(BOOKS_TYPE(1, 'ORACLE IN 21 DAYS', 'KEVIN'), BOOKS_TYPE(2, 'ORACLE IN 9
DAYS', 'SMITH'))
102 GAYATRI
BOOKS(BOOKS_TYPE(3, 'ORACLE IN 3DAYS', 'ALLEN'))

IN PL/SQL:
SQL> DECLARE
2 BOOK_VAR BOOKS;
3 BEGIN
4 BOOK_VAR:=BOOKS(BOOKS_TYPE(4,'VB IN 1 DAY','KING'),BOOKS_TYPE(5,'PB IN 1
DAY','ROLLEN'));
5 UPDATE STUDENT
6 SET BOOKS_ISSUED = BOOK_VAR
7 WHERE STUDENT_NO=103;
8 END;
9 /
PL/SQL procedure successfully completed.
SQL> SELECT * FROM STUDENT;
STUDENT_NO STUDENT_NA
---------- ---------BOOKS_ISSUED(BOOK_NO, BOOK_TITLE, AUTHOR)
---------------------------------------------------------------------------------------------------100 PAVAN
BOOKS(BOOKS_TYPE(1, 'VB', 'KEVIN'), BOOKS_TYPE(2, 'ORACLE IN 9 DAYS', 'SMITH'))
101 KUMAR
BOOKS(BOOKS_TYPE(1, 'ORACLE IN 21 DAYS', 'KEVIN'), BOOKS_TYPE(2, 'ORACLE IN 9
DAYS', 'SMITH'))
102 GAYATRI
BOOKS(BOOKS_TYPE(3, 'ORACLE IN 3DAYS', 'ALLEN'))

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

512

1 DECLARE
2 BOOK_VAR BOOKS;
3 BEGIN
4 BOOK_VAR:=BOOKS(BOOKS_TYPE(4,'VB IN 1 DAY','KING'),BOOKS_TYPE(5,'PB IN 1
DAY','ROLLEN'));
5 UPDATE STUDENT
6 SET BOOKS_ISSUED = BOOK_VAR
7 WHERE STUDENT_NO=102;
8* END;
SQL> /
PL/SQL procedure successfully completed.

SQL> SELECT * FROM STUDENT;


STUDENT_NO STUDENT_NA
---------- ---------BOOKS_ISSUED(BOOK_NO, BOOK_TITLE, AUTHOR)
---------------------------------------------------------------------------------------------------100 PAVAN
BOOKS(BOOKS_TYPE(1, 'VB', 'KEVIN'), BOOKS_TYPE(2, 'ORACLE IN 9 DAYS', 'SMITH'))
101 KUMAR
BOOKS(BOOKS_TYPE(1, 'ORACLE IN 21 DAYS', 'KEVIN'), BOOKS_TYPE(2, 'ORACLE IN 9
DAYS', 'SMITH'))
102 GAYATRI
BOOKS(BOOKS_TYPE(4, 'VB IN 1 DAY', 'KING'), BOOKS_TYPE(5, 'PB IN 1 DAY',
'ROLLEN'))
SQL> INSERT INTO THE (SELECT BOOKS_ISSUED FROM STUDENT
2 WHERE STUDENT_NO = 101)
3 VALUES
4 (BOOKS_TYPE(6,'JAVA IN 21 DAYS','KEVIN'));
1 row created.
SQL> SELECT * FROM STUDENT;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

513

STUDENT_NO STUDENT_NA
---------- ---------BOOKS_ISSUED(BOOK_NO, BOOK_TITLE, AUTHOR)
---------------------------------------------------------------------------------------------------100 PAVAN
BOOKS(BOOKS_TYPE(1, 'VB', 'KEVIN'), BOOKS_TYPE(2, 'ORACLE IN 9 DAYS', 'SMITH'))
101 KUMAR
BOOKS(BOOKS_TYPE(1, 'ORACLE IN 21 DAYS', 'KEVIN'), BOOKS_TYPE(2, 'ORACLE IN 9
DAYS', 'SMITH'), BOOKS
_TYPE(6, 'JAVA IN 21 DAYS', 'KEVIN'))
102 GAYATRI
BOOKS(BOOKS_TYPE(4, 'VB IN 1 DAY', 'KING'), BOOKS_TYPE(5, 'PB IN 1 DAY',
'ROLLEN'))
SQL> DELETE FROM STUDENT
2 WHERE STUDENT_NO=102;
1 row deleted.

SQL> SELECT * FROM STUDENT;


STUDENT_NO STUDENT_NA
---------- ---------BOOKS_ISSUED(BOOK_NO, BOOK_TITLE, AUTHOR)
---------------------------------------------------------------------------------------------------100 PAVAN
BOOKS(BOOKS_TYPE(1, 'VB', 'KEVIN'), BOOKS_TYPE(2, 'ORACLE IN 9 DAYS', 'SMITH'))
101 KUMAR
BOOKS(BOOKS_TYPE(1, 'ORACLE IN 21 DAYS', 'KEVIN'), BOOKS_TYPE(2, 'ORACLE IN 9
DAYS', 'SMITH'), BOOKS
_TYPE(6, 'JAVA IN 21 DAYS', 'KEVIN'))

DELETING:
FOR DELETING A ROW FROM THE NESTED TABLE USING THE CONDITION FROM THE
NESTED TABLE.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

514

SQL> DELETE FROM THE(


2 SELECT BOOKS_ISSUED FROM STUDENT WHERE STUDENT_NO=100)
3 WHERE BOOK_NO=2;
1 row deleted.
SQL> SELECT * FROM STUDENT;
STUDENT_NO STUDENT_NA
---------- ---------BOOKS_ISSUED(BOOK_NO, BOOK_TITLE, AUTHOR)
---------------------------------------------------------------------------------------------------100 PAVAN
BOOKS(BOOKS_TYPE(1, 'VB', 'KEVIN'))
101 KUMAR
BOOKS(BOOKS_TYPE(1, 'ORACLE IN 21 DAYS', 'KEVIN'), BOOKS_TYPE(2, 'ORACLE IN 9
DAYS', 'SMITH'), BOOKS
_TYPE(6, 'JAVA IN 21 DAYS', 'KEVIN'))

VARRAYS:

CREATING VARRAYS:
SQL> CREATE OR REPLACE TYPE BOOKS_ARRAY AS VARRAY(10) BOOKS_TYPE;
2 /
Warning: Type created with compilation errors.
SQL> SHOW ERRORS
Errors for TYPE BOOKS_ARRAY:
LINE/COL ERROR
-------- ----------------------------------------------------------------1/32 PLS-00103: Encountered the symbol "BOOKS_TYPE" when expecting one

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

515

of the following:
of
The symbol "of" was substituted for "BOOKS_TYPE" to continue.
1* CREATE OR REPLACE TYPE BOOKS_ARRAY AS VARRAY(10) OF BOOKS_TYPE;
SQL> /
Type created.
SQL> CREATE TABLE STUDENTS
2 (STUDENT_NO NUMBER(10),
3 STUDENT_NAME VARCHAR2(10),
4 BOOKS_ISSUED BOOKS_ARRAY);
Table created.
1 INSERT INTO STUDENTS
2 VALUES
3 (100,'PAVAN',BOOKS_ARRAY(BOOKS_TYPE(1,'ORACLE IN 21
DAYS','KEVIN'),BOOKS_TYPE(2,
4* 'VB IN 21 DAYS','LOL')))
SQL> /
1 row created.

1 INSERT INTO STUDENTS


2 VALUES
3 (101,'KUMAR',BOOKS_ARRAY(BOOKS_TYPE(1,'ORACLE IN 21
DAYS','KEVIN'),BOOKS_TYPE(2,
4* 'VB IN 21 DAYS','LOL')))
SQL> /
1 row created.

1 INSERT INTO STUDENTS


2 VALUES
3 (102,'GAYATRI',BOOKS_ARRAY(BOOKS_TYPE(1,'ORACLE IN 21
DAYS','KEVIN'),BOOKS_TYPE(2,
4* 'VB IN 21 DAYS','LOL')))
SQL> /
1 row created.
SQL> SELECT * FROM STUDENTS;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

516

STUDENT_NO STUDENT_NA
---------- ---------BOOKS_ISSUED(BOOK_NO, BOOK_TITLE, AUTHOR)
---------------------------------------------------------------------------------------------------100 PAVAN
BOOKS_ARRAY(BOOKS_TYPE(1, 'ORACLE IN 21 DAYS', 'KEVIN'), BOOKS_TYPE(2, 'VB IN
21 DAYS', 'LOL'))
101 KUMAR
BOOKS_ARRAY(BOOKS_TYPE(1, 'ORACLE IN 21 DAYS', 'KEVIN'), BOOKS_TYPE(2, 'VB IN
21 DAYS', 'LOL'))
102 GAYATRI
BOOKS_ARRAY(BOOKS_TYPE(1, 'ORACLE IN 21 DAYS', 'KEVIN'), BOOKS_TYPE(2, 'VB IN
21 DAYS', 'LOL'))
USING VARRAYS IN PL/SQL:

TO MODIFY A STORED VARRAY,IT HAS TO BE SELECTED IN TO PL/SQL VARIABLE AND


THEN INSERTED BACK IN TO THE TABLE.
DECLARE
LIST_OF_BOOKS BOOKS_ARRAY;
BEGIN
SELECT BOOKS_ISSUED INTO LIST_OF_BOOKS
FROM STUDENTS
WHERE STUDENT_NO=100;
DBMS_OUTPUT.PUT_LINE( NO OF BOOKS ISSUED ||
TO_CHAR (LIST_OF_BOOKS.COUNT));
DBMS_OUTPUT.PUT_LINE(ARRAY LIMIT ||LIST_OF_BOOKS.LIMIT);
LIST_OF_BOOKS.EXTEND;
LIST_OF_BOOKS(LIST_OF_BOOKS.COUNT)
:=BOOK_TYPE(6,PASCAL IN 9 DAYS,KEVIN);
UPDATE STUDENTS
SET BOOKS_ISSUED = LIST_OF_BOOKS
WHERE STUDENT_NO=100;
COMMIT;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

517

END;
SIMILARITIES OF VARRAYS AND NESTED TABLES:
BOTH VARRAYS AND NESTED TABLES ARE COLLECTIONS.
BOTHE TYPES ALLOW ACCESS TO INDIVIDUAL ELEMENTS USING SUBSCRIPT
NOTATION.
BOTH TYPES CAN BE STORED IN DATABASE TABLES.
DIFFERENCES OF VARRAYS AND NESTED TABLES:
VARRAYS HAVE MAXIMUM SIZE, AS SPECIFIED AT TIME OF CREATION.
WHILE NESTED TABLES DO NOT.
VARRAYS ARE STORED IN LINE WITH THE CONTAINING TABLE, WHILE NESTED
TABLES ARE STORED IN A SEPARATE TABLE, WHICH CAN HAVE DIFFERENT STORAGE
CHARACTERSTICS.
ROWS IN THE NESTED TABLE CAN BE ACCESSED INDIVIDUALLY BY USING THE THE
CLAUSE, WHERE AS IN THE VARRAYS ALL THE ROWS SHOULD BE ACCESSED AS ONE
OBJECT AND IS TO NE MANIPULATED BY USING PL/SQL BLOCKS.
ADVANTAGES:
IMPLEMENTATIONS OF ONE-TO-MANY RELATIONSHIPS.
TRIGGERS

SQL> CREATE TABLE EMP_D


2 AS
3 SELECT * FROM EMP;
Table created.
SQL> CREATE TABLE TRIG_INSERT
2 (ACTION VARCHAR2(100),
3 TDATE TIMESTAMP(6));
Table created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

518

1 CREATE TABLE TRIG_UPDATE


2 (ACTION VARCHAR2(100),
3* TDATE TIMESTAMP(6))
SQL> /
Table created.
1 CREATE TABLE TRIG_DELETE
2 (ACTION VARCHAR2(100),
3* TDATE TIMESTAMP(6))
SQL> /
Table created.
INSERT TRIGGERS:

SQL> CREATE OR REPLACE TRIGGER BFORE_INSERT_TAB


2 BEFORE INSERT ON EMP_D
3 BEGIN
4 INSERT INTO TRIG_INSERT
5 VALUES
6 ('BFORE INSERT TAB LVL',SYSTIMESTAMP);
7 END;
8 /
Trigger created.

1 CREATE OR REPLACE TRIGGER BFORE_INSERT_ROW


2 BEFORE INSERT ON EMP_D FOR EACH ROW
3 BEGIN
4 INSERT INTO TRIG_INSERT
5 VALUES
6 ('BFORE INSERT ROW LVL',SYSTIMESTAMP);
7* END;
SQL> /
Trigger created.
1
2
3
4
5
6

CREATE OR REPLACE TRIGGER AFTER_INSERT_TAB


AFTER INSERT ON EMP_D
BEGIN
INSERT INTO TRIG_INSERT
VALUES
('AFTER INSERT TAB LVL',SYSTIMESTAMP);

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

519

7* END;
SQL> /
Trigger created.
1 CREATE OR REPLACE TRIGGER AFTER_INSERT_ROW
2 AFTER INSERT ON EMP_D FOR EACH ROW
3 BEGIN
4 INSERT INTO TRIG_INSERT
5 VALUES
6 ('AFTER INSERT ROW LVL',SYSTIMESTAMP);
7* END;
SQL> /
Trigger created.
SELECTING TRIGGERS IN USER_OBJECTS:

SQL> SELECT OBJECT_NAME,OBJECT_TYPE FROM USER_OBJECTS


2 WHERE OBJECT_TYPE='TRIGGER';
OBJECT_NAME
---------------------------------------------------------------------------------------------------OBJECT_TYPE
-----------------AFTER_INSERT_ROW
TRIGGER
AFTER_INSERT_TAB
TRIGGER
BFORE_INSERT_ROW
TRIGGER
BFORE_INSERT_TAB
TRIGGER
SQL> SELECT TRIGGER_NAME FROM USER_TRIGGERS;
TRIGGER_NAME
-----------------------------AFTER_INSERT_ROW
AFTER_INSERT_TAB
BFORE_INSERT_ROW
BFORE_INSERT_TAB

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

520

SQL> SELECT * FROM USER_TRIGGERS


2 WHERE TRIGGER_NAME='BFORE_INSERT_TAB';
TRIGGER_NAME
TRIGGER_TYPE
------------------------------ ---------------TRIGGERING_EVENT
---------------------------------------------------------------------------------------------------TABLE_OWNER
BASE_OBJECT_TYPE TABLE_NAME
------------------------------ ---------------- -----------------------------COLUMN_NAME
---------------------------------------------------------------------------------------------------REFERENCING_NAMES
---------------------------------------------------------------------------------------------------WHEN_CLAUSE
---------------------------------------------------------------------------------------------------STATUS
-------DESCRIPTION
---------------------------------------------------------------------------------------------------ACTION_TYPE TRIGGER_BODY
----------- -------------------------------------------------------------------------------BFORE_INSERT_TAB
BEFORE STATEMENT
INSERT
SCOTT
TABLE
EMP_D
REFERENCING NEW AS NEW OLD AS OLD
ENABLED
BFORE_INSERT_TAB
BEFORE INSERT ON EMP_D
PL/SQL BEGIN
INSERT INTO TRIG_INSERT
VALUES
('BFORE INSERT TAB LVL',SYSTIMESTAMP);
END;
SQL> DESC USER_TRIGGERS
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
TRIGGER_NAME
TRIGGER_TYPE
TRIGGERING_EVENT
TABLE_OWNER
BASE_OBJECT_TYPE
TABLE_NAME
COLUMN_NAME
REFERENCING_NAMES
WHEN_CLAUSE
STATUS
DESCRIPTION
ACTION_TYPE
TRIGGER_BODY

521

VARCHAR2(30)
VARCHAR2(16)
VARCHAR2(227)
VARCHAR2(30)
VARCHAR2(16)
VARCHAR2(30)
VARCHAR2(4000)
VARCHAR2(128)
VARCHAR2(4000)
VARCHAR2(8)
VARCHAR2(4000)
VARCHAR2(11)
LONG

SQL> SELECT TRIGGER_BODY FROM USER_TRIGGERS


2 WHERE TRIGGER_NAME='BFORE_INSERT_TAB';
TRIGGER_BODY
-------------------------------------------------------------------------------BEGIN
INSERT INTO TRIG_INSERT
VALUES
('BFORE INSERT TAB LVL',SYSTIMESTAMP);
END;
SQL> SELECT * FROM TRIG_INSERT;
no rows selected
SQL> INSERT INTO EMP_D
2 (EMPNO,DEPTNO)
3 VALUES
4 (1,10);
1 row created.
SQL> SELECT * FROM TRIG_INSERT;
ACTION
---------------------------------------------------------------------------------------------------TDATE
--------------------------------------------------------------------------BFORE INSERT TAB LVL
19-SEP-05 12.52.39.000000 AM
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

522

BFORE INSERT ROW LVL


19-SEP-05 12.52.39.000000 AM
AFTER INSERT ROW LVL
19-SEP-05 12.52.39.000000 AM
AFTER INSERT TAB LVL
19-SEP-05 12.52.39.000000 AM
SQL> DROP TRIGGER BFORE_INSERT_TAB;
Trigger dropped.
1* DROP TRIGGER BFORE_INSERT_ROW
SQL> /
Trigger dropped.
1* DROP TRIGGER AFTER_INSERT_TAB
2 /
Trigger dropped.
1* DROP TRIGGER AFTER_INSERT_ROW
SQL> /
Trigger dropped.

UPDATING:

1 CREATE OR REPLACE TRIGGER BFORE_UPDATE_TAB


2 BEFORE UPDATE ON EMP_D
3 BEGIN
4 INSERT INTO TRIG_UPDATE
5 VALUES
6 ('BFORE UPDATE TAB LVL',SYSTIMESTAMP);
7* END;
SQL> /
Trigger created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

523

1 CREATE OR REPLACE TRIGGER BFORE_UPDATE_ROW


2 BEFORE UPDATE ON EMP_D FOR EACH ROW
3 BEGIN
4 INSERT INTO TRIG_UPDATE
5 VALUES
6 ('BFORE UPDATE ROW LVL',SYSTIMESTAMP);
7* END;
SQL> /
Trigger created.
1 CREATE OR REPLACE TRIGGER AFTER_UPDATE_ROW
2 AFTER UPDATE ON EMP_D FOR EACH ROW
3 BEGIN
4 INSERT INTO TRIG_UPDATE
5 VALUES
6 ('AFTER UPDATE ROW LVL',SYSTIMESTAMP);
7* END;
SQL> /
Trigger created.

1 CREATE OR REPLACE TRIGGER AFTER_UPDATE_TAB


2 AFTER UPDATE ON EMP_D
3 BEGIN
4 INSERT INTO TRIG_UPDATE
5 VALUES
6 ('AFTER UPDATE TAB LVL',SYSTIMESTAMP);
7* END;
SQL> /
Trigger created.
SQL> SELECT TRIGGER_NAME FROM USER_TRIGGERS;
TRIGGER_NAME
-----------------------------AFTER_UPDATE_ROW
AFTER_UPDATE_TAB
BFORE_UPDATE_ROW
BFORE_UPDATE_TAB
SQL> SELECT * FROM TRIG_UPDATE;
no rows selected
SQL> UPDATE EMP_D
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

524

2 SET SAL=SAL+100
3 WHERE EMPNO=7788;
1 row updated.
SQL> SELECT * FROM TRIG_UPDATE;
ACTION
---------------------------------------------------------------------------------------------------TDATE
--------------------------------------------------------------------------BFORE UPDATE TAB LVL
19-SEP-05 01.03.20.000000 AM
BFORE UPDATE ROW LVL
19-SEP-05 01.03.20.000000 AM
AFTER UPDATE ROW LVL
19-SEP-05 01.03.20.000000 AM
AFTER UPDATE TAB LVL
19-SEP-05 01.03.20.000000 AM
SQL> DELETE FROM TRIG_UPDATE;
4 rows deleted.
SQL> SELECT * FROM TRIG_UPDATE;
no rows selected
SQL> UPDATE EMP_D
2 SET SAL = SAL+100;
15 rows updated.
SQL> SELECT * FROM TRIG_UPDATE;
ACTION
---------------------------------------------------------------------------------------------------TDATE
--------------------------------------------------------------------------BFORE UPDATE TAB LVL
19-SEP-05 01.04.06.000001 AM
BFORE UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

525

AFTER UPDATE ROW LVL


19-SEP-05 01.04.06.000001 AM
BFORE UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
AFTER UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
BFORE UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
AFTER UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
BFORE UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
AFTER UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
BFORE UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
AFTER UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
BFORE UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM

ACTION
---------------------------------------------------------------------------------------------------TDATE
--------------------------------------------------------------------------AFTER UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
BFORE UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
AFTER UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
BFORE UPDATE ROW LVL
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

526

19-SEP-05 01.04.06.000001 AM
AFTER UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
BFORE UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
AFTER UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
BFORE UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
AFTER UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
BFORE UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
AFTER UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
BFORE UPDATE ROW LVL
ACTION
---------------------------------------------------------------------------------------------------TDATE
--------------------------------------------------------------------------19-SEP-05 01.04.06.000001 AM
AFTER UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
BFORE UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
AFTER UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
BFORE UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
AFTER UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
BFORE UPDATE ROW LVL
19-SEP-05 01.04.06.000001 AM
AFTER UPDATE ROW LVL
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

527

19-SEP-05 01.04.06.000001 AM
AFTER UPDATE TAB LVL
19-SEP-05 01.04.06.000001 AM
32 rows selected.
SQL> DROP TRIGGER BFORE_UPDATE_TAB;
Trigger dropped.
1* DROP TRIGGER BFORE_UPDATE_ROW
SQL> /
Trigger dropped.
1* DROP TRIGGER AFTER_UPDATE_ROW
SQL> /
Trigger dropped.
1* DROP TRIGGER AFTER_UPDATE_TAB
SQL> /
Trigger dropped.
SQL> SELECT TRIGGER_NAME FROM USER_TRIGGERS;
no rows selected

DELETION:
SQL> SELECT * FROM TRIG_DELETE;
no rows selected

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

528

SQL> CREATE OR REPLACE TRIGGER BFORE_DELETE_ROW


2 BEFORE DELETE ON EMP_D FOR EACH ROW
3 BEGIN
4 INSERT INTO TRIG_DELETE
5 VALUES
6 ('BFORE DELETE ROW LVL',SYSTIMESTAMP);
7 END;
8 /
Trigger created.
1 CREATE OR REPLACE TRIGGER BFORE_DELETE_TAB
2 BEFORE DELETE ON EMP_D
3 BEGIN
4 INSERT INTO TRIG_DELETE
5 VALUES
6 ('BFORE DELETE TAB LVL',SYSTIMESTAMP);
7* END;
SQL> /
Trigger created.
1 CREATE OR REPLACE TRIGGER AFTER_DELETE_TAB
2 AFTER DELETE ON EMP_D
3 BEGIN
4 INSERT INTO TRIG_DELETE
5 VALUES
6 ('AFTER DELETE TAB LVL',SYSTIMESTAMP);
7* END;
SQL> /
Trigger created.

1 CREATE OR REPLACE TRIGGER AFTER_DELETE_ROW


I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

529

2 AFTER DELETE ON EMP_D FOR EACH ROW


3 BEGIN
4 INSERT INTO TRIG_DELETE
5 VALUES
6 ('AFTER DELETE ROW LVL',SYSTIMESTAMP);
7* END;
SQL> /
Trigger created.
SQL> SELECT TRIGGER_NAME FROM USER_TRIGGERS;
TRIGGER_NAME
-----------------------------AFTER_DELETE_ROW
AFTER_DELETE_TAB
BFORE_DELETE_ROW
BFORE_DELETE_TAB
SQL> DELETE FROM EMP_D
2 WHERE EMPNO=7788;
0 rows deleted.
SQL> SELECT * FROM TRIG_DELETE;
ACTION
---------------------------------------------------------------------------------------------------TDATE
--------------------------------------------------------------------------BFORE DELETE TAB LVL
19-SEP-05 01.22.59.000001 AM
AFTER DELETE TAB LVL
19-SEP-05 01.22.59.000001 AM
HERE NO ROWS ARE DELETED BCOZ TABLE LEVEL TRIGGERS FIRED.
SQL> DELETE FROM TRIG_DELETE;
2 rows deleted.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

530

SQL> DELETE FROM EMP_D


2 WHERE EMPNO=7566;
1 row deleted.
SQL> SELECT * FROM TRIG_DELETE;
ACTION
---------------------------------------------------------------------------------------------------TDATE
--------------------------------------------------------------------------BFORE DELETE TAB LVL
19-SEP-05 01.23.57.000000 AM
BFORE DELETE ROW LVL
19-SEP-05 01.23.57.000000 AM
AFTER DELETE ROW LVL
19-SEP-05 01.23.57.000000 AM
AFTER DELETE TAB LVL
19-SEP-05 01.23.57.000000 AM
SQL> DELETE FROM TRIG_DELETE;
4 rows deleted.
SQL> DELETE FROM EMP_D
2 ;
12 rows deleted.
SQL> SELECT * FROM TRIG_DELETE;
ACTION
---------------------------------------------------------------------------------------------------TDATE
--------------------------------------------------------------------------BFORE DELETE TAB LVL
19-SEP-05 01.24.57.000000 AM
BFORE DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

531

AFTER DELETE ROW LVL


19-SEP-05 01.24.57.000000 AM
BFORE DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
AFTER DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
BFORE DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
AFTER DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
BFORE DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
AFTER DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
BFORE DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
AFTER DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
BFORE DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
ACTION
---------------------------------------------------------------------------------------------------TDATE
--------------------------------------------------------------------------AFTER DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
BFORE DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
AFTER DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
BFORE DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
AFTER DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

532

BFORE DELETE ROW LVL


19-SEP-05 01.24.57.000000 AM
AFTER DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
BFORE DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
AFTER DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
BFORE DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
AFTER DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
BFORE DELETE ROW LVL
ACTION
---------------------------------------------------------------------------------------------------TDATE
--------------------------------------------------------------------------19-SEP-05 01.24.57.000000 AM
AFTER DELETE ROW LVL
19-SEP-05 01.24.57.000000 AM
AFTER DELETE TAB LVL
19-SEP-05 01.24.57.000000 AM
26 rows selected.
REF CURSORS:
A PL/SQL PROGRAM CANNOT PASS A CURSOR AS A PARAMETER TO ANOTHER
PROGRAM. A PL/SQL PROGRAM CAN ONLY OPEN THE CURSOR AND PROCESS THE
CORRESPONDING INFORMATION WITHIN THE PROGRAM ITSELF.
TO WORK AROUND THE FUNCTIONAL LIMITATIONS OF CURSORS A PROGRAM CAN
INSTEAD DECLARE TWO DIFFERENT CURSOR TYPES AND CORRESPONDING CURSOR
VARIABLES.
CURSOR CAN BE DECLARED AS EITHER STRONG OR WEAK.
THESE TYPES OF CURSOR DECLARATIONS ARE USED TO PASS A CURSOR AS A
PARAMETER TO A PROGRAM OR A PACKAGE.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

533

WHETHER A CURSOR IS STRONG OR WEAK DEPENDS UPON THE WAY IT IS DECLARED.


FOR EXAMPLE , THE CURSOR TYPE DECLARED BELOW IS A STRONG CURSOR TYPE
I.E., THE CURSOR TYPES DECLARATION INCLUDES A RETURN CLAUSE THAT
SPECIFIES A SHAPE OR SET OF ATTRIBUTES FOR THE CURSOR TYPE.
A STRONG CURSOR TYPE CAN ONLY RETURN THE DATA TYPE SPECIFIED IN THE
RETURN TYPE. THEREFORE, A STRONG CURSOR TYPE RESTRICTSTHE DEFINITION OF
SUBSEQUENT CURSOR VARIABLES THAT USE THE TYPE.
TYPE CUR_EMP IS REF CURSOR RETURN EMP.EMPNO%TYPE;
EMP_CURSOR1 CUR_EMP; ---------------- CURSOR VARIABLE.
EMP_CURSOR2 CUR_EMP; ---------------- CURSOR VARIABLE.
EMP_CURSOR3 CUR_EMP; ---------------- CURSOR VARIABLE.
THE FOLLOWING CURSOR TYPE IS WEAK BECAUSE IT DOES NOT INCLUDE A SHAPE
SPECIFICATION i.e., THERE IS NO RETURN CLAUSE.\
A PROGRAM CAN USE THE WEAK CURSOR TYPE TO DECLARE A CURSOR VARIABLE
WITH AN Y SHAPE.
A WEAK CURSOR TYPE CAN RETURN ANY DATATYPE AS THERE IS NO RETURN
CLAUSE.
SINCE THERE IS NO RETURN VALUE FOR THE CURSOR , THE CURSOR VARIABLE IS
SHAPE INDEPENDENT.
THIS ADDS FLEXIBILITY TO THE CURSOR VARIABLES.
FOR EXAMPLE:
TYPE CUR_EMP IS REF CURSOR;
SQL> CREATE OR REPLACE PACKAGE DEPT_DATA AS
2 TYPE DEPTCURTYP IS REF CURSOR RETURN DEPT%ROWTYPE;
3 PROCEDURE OPEN_DEPT_CV(DEPT_CV IN OUT DEPTCURTYP);
4 END DEPT_DATA;
5 /
Package created.
SQL> CREATE OR REPLACE PACKAGE BODY DEPT_DATA AS
2 PROCEDURE OPEN_DEPT_CV(DEPT_CV IN OUT DEPTCURTYP) IS
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
3
4
5
6
7

534

BEGIN
OPEN DEPT_CV FOR SELECT * FROM DEPT;
END OPEN_DEPT_CV;
END DEPT_DATA;
/

Package body created.


WHEN U DECLARE A CURSOR VARIABLE AS THE FORMAL PARAMETER OF A
SUBPROGRAM THAT OPENS THE CURSOR VARIABLE. YOU MUST SPECIFY THE IN OUT
MODE. THAT WAY,THE SUBPROGRAM CAN PASS A AN OPEN CURSOR BACK TO THE
CALLER.
DECLARE A VARIABLE OF TYPE REFCURSOR AS SHOWN BELOW.

VARIABLE VARDEPTCV REFCURSOR

EXECUTE THE PACKAGE WITH THE SPECIFIED PROCEDURE ALONG WITH


THE CURSOR AS SHOWN BELOW:
SQL> EXECUTE DEPT_DATA.OPEN_DEPT_CV(:VARDEPTCV);
PL/SQL procedure successfully completed.
SQL> PRINT VARDEPTNO
SQL> PRINT VARDEPTCV
DEPTNO
DNAME
LOC
---------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS
BOSTON
ALTERNATIVELY, YOU CAN USE THE SET AUTOPRINT ON COMMAND BEFORE
EXECUTING THE PACKAGE, TODISPLAY THE QUERY RESULTS AUTOMATICALLY. USE
THE SET AUTOPRINT OFF COMMAND TO PUT AUTOPRINT OFF.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

535

THE PROCEDURE CAN BE EXECUTED MULTIPLE TIMES USING THE SAME OR A


DIFFERENT REFCURSOR BIND VARIABLE AS SHOWN BELOW:
SQL> VARIABLE PCV REFCURSOR
SQL> SET AUTOPRINT ON
SQL> EXECUTE DEPT_DATA.OPEN_DEPT_CV(:PCV);
PL/SQL procedure successfully completed.
DEPTNO
DNAME
LOC
---------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS
BOSTON
SQL> SET AUTOPRINT OFF
ALTERNATIVELY, YOU CAN USE A STANDALONE PROCEDURE TO OPEN THE CURSOR
VARIABLE.
SIMPLE DEFINE THE REFCURSOR TYPE IN A SEPARATE PACKAGE, THEN REFERENCE
THAT TYPE IN THE STANDALONE PROCEDURE.
FOR INSTANCE , IF YOU CREATE THE FOLLOWING (BODILESS) PACKAGE, U CAN
CREATE STANDALONE PROCEDURE THAT REFERENCE THE TYPES IT DEFINES:
SQL> CREATE OR REPLACE PACKAGE CV_TYPES AS
2 TYPE GENERICCURTYPE IS REFCURSOR;
3 TYPE EMPCURTYP IS REF CURSOR RETURN EMP%ROWTYPE;
4 TYPE DEPTCURTYP IS REF CURSOR RETURN DEPT%ROWTYPE;
5 END CV_TYPES;
6 /
Warning: Package created with compilation errors.
SQL> SHOW ERRORS
Errors for PACKAGE CV_TYPES:
LINE/COL ERROR
-------- ----------------------------------------------------------------2/24 PLS-00103: Encountered the symbol "REFCURSOR" when expecting one
of the following:
( array limited new private range record VARRAY_ char_base
number_base decimal date_base clob_base blob_base bfile_base
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

536

table ref object fixed varying opaque


The symbol "range" was substituted for "REFCURSOR" to continue.
1 CREATE OR REPLACE PACKAGE CV_TYPES AS
2 TYPE GENERICCURTYPE IS REF CURSOR;
3 TYPE EMPCURTYP IS REF CURSOR RETURN EMP%ROWTYPE;
4 TYPE DEPTCURTYP IS REF CURSOR RETURN DEPT%ROWTYPE;
5* END CV_TYPES;
SQL> /
Package created.

IN THE FOLLOWING EXAMPLE , YOU CREATE A STANDLONE PROCEDURE THAT


REFERENCES THE REF CURSOR TYPE EMPCURTYP, WHICH IS DEFINED IN THE
PACKAGE CV_TYPES:
SQL> CREATE PROCEDURE OPEN_EMP_CV
2 (EMP_CV IN OUT CV_TYPES.EMPCURTYP) AS
3 BEGIN
4 OPEN EMP_CV FOR SELECT * FROM EMP;
5 END OPEN_EMP_CV;
6 /
Procedure created.
SQL> VARIABLE P REFCURSOR
SQL> EXECUTE OPEN_EMP_CV(:P);
PL/SQL procedure successfully completed.
SQL> PRINT P
EMPNO
ENAME
JOB
MGR HIREDATE
DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369
SMITH
CLERK
7902 17-DEC-80
800
7499
ALLEN
SALESMAN 7698 20-FEB-81
1600
7521
WARD
SALESMAN 7698 22-FEB-81
1250
7566
JONES
MANAGER 7839 02-APR-81
2975
7654
MARTIN
SALESMAN 7698 28-SEP-81
1250
7698
BLAKE
MANAGER 7839 01-MAY-81
2850
7782
CLARK
MANAGER 7839 09-JUN-81
2450
7788
SCOTT
ANALYST
7566 19-APR-87
3000
7839
KING
PRESIDENT
17-NOV-81
5000
7844
TURNER
SALESMAN 7698 08-SEP-81
1500
I Soft Solutions ,Bang-54.

SAL

COMM
20

300
500

30
30

1400

30

20

30
10
20
10
30

STRUCTURED QUERY LANGUAGE

ORACLE
7876
7900
7902
7934

ADAMS
JAMES
FORD
MILLER

CLERK
CLERK
ANALYST
CLERK

537

7788 23-MAY-87
7698 03-DEC-81
7566 03-DEC-81
7782 23-JAN-82

1100
950
3000
1300

20
30
20
10

14 rows selected.

SQL> CREATE OR REPLACE PACKAGE EMP_DATA AS


2 TYPE GENERICCURTYP IS REF CURSOR;
3 TYPE EMPCURTYP IS REF CURSOR RETURN EMP%ROWTYPE;
4 PROCEDURE OPEN_EMP_CV(EMP_CV IN OUT EMPCURTYP, CHOICE IN NUMBER);
5 END EMP_DATA;
6 /
Package created.
SQL> CREATE OR REPLACE PACKAGE BODY EMP_DATA AS
2 PROCEDURE OPEN_EMP_CV(EMP_CV IN OUT EMPCURTYP, CHOICE IN NUMBER)
3 IS
4 BEGIN
5 IF CHOICE = 1 THEN
6 OPEN EMP_CV FOR
7 SELECT * FROM EMP WHERE COMM IS NOT NULL;
8 ELSIF CHOICE = 2 THEN
9 OPEN EMP_CV FOR
10 SELECT * FROM EMP WHERE SAL > 2500;
11 ELSIF CHOICE = 3 THEN
12 OPEN EMP_CV FOR
13 SELECT * FROM EMP WHERE DEPTNO=20;
14 END IF;
15 END OPEN_EMP_CV;
16 END EMP_DATA;
17 /
Package body created.
SQL> VARIABLE EMPCUR REFCURSOR
SQL> SET AUTOPRINT ON
SQL> EXECUTE EMP_DATA.OPEN_EMP_CV(:EMPCUR,3);
PL/SQL procedure successfully completed.
EMPNO
ENAME
JOB
MGR HIREDATE
DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369
SMITH
CLERK
7902 17-DEC-80
800
7566
JONES
MANAGER 7839 02-APR-81
2975
7788
SCOTT
ANALYST 7566 19-APR-87
3000
I Soft Solutions ,Bang-54.

SAL

COMM
20
20
20

STRUCTURED QUERY LANGUAGE

ORACLE
7876
7902

ADAMS
FORD

CLERK
ANALYST

538

7788 23-MAY-87
7566 03-DEC-81

1100
3000

20
20

SQL> EXECUTE EMP_DATA.OPEN_EMP_CV(:EMPCUR,2);


PL/SQL procedure successfully completed.
EMPNO
ENAME
JOB
MGR HIREDATE
DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7566
JONES
MANAGER 7839 02-APR-81
7698
BLAKE
MANAGER 7839 01-MAY-81
7788
SCOTT
ANALYST 7566 19-APR-87
7839
KING
PRESIDENT
17-NOV-81
7902
FORD
ANALYST 7566 03-DEC-81

SAL
2975
2850
3000
5000
3000

COMM
20
30
20
10
20

SQL> EXECUTE EMP_DATA.OPEN_EMP_CV(:EMPCUR,1);


PL/SQL procedure successfully completed.
EMPNO ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
7521 WARD
SALESMAN
7698 22-FEB-81
1250
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
7844 TURNER SALESMAN
7698 08-SEP-81
1500

COMM
300
500
1400
0

DEPTNO
30
30
30
30

FOR MORE FLEXIBILITY , YOU CAN PASS A CURSOR VARIABLE AND SELECTOR TO A
STORED PROCEDURE THAT EXECUTES QUERIES WITH DIFFERENT RETURN TYPES.
SQL> CREATE OR REPLACE PACKAGE EMP_DATA AS
2 TYPE GENERICCURTYP IS REF CURSOR;
3 TYPE EMPCURTYP IS REF CURSOR RETURN EMP%ROWTYPE;
4 PROCEDURE OPEN_CV(GENERIC_CV IN OUT GENERICCURTYP, CHOICE IN
NUMBER);
5 END EMP_DATA;
6 /
Package created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

539

SQL> CREATE OR REPLACE PACKAGE BODY EMP_DATA AS


2 PROCEDURE OPEN_CV(GENERIC_CV IN OUT GENERICCURTYP, CHOICE IN
NUMBER)
3 IS
4 BEGIN
5 IF CHOICE=1 THEN
6 OPEN GENERIC_CV FOR SELECT * FROM EMP;
7 ELSIF CHOICE = 2 THEN
8 OPEN GENERIC_CV FOR SELECT * FROM DEPT;
9 ELSIF CHOICE=3 THEN
10 OPEN GENERIC_CV FOR SELECT * FROM SALGRADE;
11 END IF;
12 END OPEN_CV;
13 END EMP_DATA;
14 /
Package body created.
SQL> VARIABLE CUR REFCURSOR
SQL> SET AUTOPRINT ON
SQL> EXECUTE EMP_DATA.OPEN_CV(:CUR,3);
PL/SQL procedure successfully completed.
GRADE
LOSAL HISAL
---------- ---------- ---------1
700
1200
2
1201
1400
3
1401
2000
4
2001
3000
5
3001
9999
SQL> EXECUTE EMP_DATA.OPEN_CV(:CUR,2);
PL/SQL procedure successfully completed.
DEPTNO DNAME
LOC
---------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS
BOSTON

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

540

SQL> EXECUTE EMP_DATA.OPEN_CV(:CUR,1);


PL/SQL procedure successfully completed.
EMPNO
ENAME
JOB
MGR HIREDATE
SAL
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369
SMITH CLERK
7902 17-DEC-80
800
7499
ALLEN
SALESMAN 7698 20-FEB-81
1600
7521
WARD
SALESMAN 7698 22-FEB-81
1250
7566
JONES
MANAGER 7839 02-APR-81
2975
7654
MARTIN SALESMAN 7698 28-SEP-81
1250
7698
BLAKE
MANAGER 7839 01-MAY-81
2850
7782
CLARK
MANAGER 7839 09-JUN-81
2450
7788
SCOTT ANALYST 7566 19-APR-87
3000
7839
KING
PRESIDENT
17-NOV-81
5000
7844
TURNER SALESMAN 7698 08-SEP-81
1500
7876
ADAMS
CLERK
7788 23-MAY-87
1100
7900
JAMES CLERK
7698 03-DEC-81
950
7902
FORD
ANALYST
7566 03-DEC-81
3000
7934
MILLER CLERK
7782 23-JAN-82
1300

COMM

DEPTNO

20
300
500

30
30
20

1400

30
30
10
20
10
30
20

0
30

20
10

14 rows selected.
ORACLE 9I FEATURES:
ORACLE OFFERS A COMPREHENSIVE HIGH-PERFORMANCE INFRASTRUCTURE FOR EBUSSINESS.
ORACLE 9I INCLDES EVERYTHING NEEDED TO DEVELOP, DEPLOY AND MANAGE
INTERNET APPLICATIONS.
IN ORACLE 9I THERE ARE TWO PRODUCTS, THEY ARE
ORACLE 9I APPLICATION SERVER.
ORACLE 9I DATABASE SERVER.
BOTH PROVIDE
APPLICATIONS.

COMPLETE AND

SIMPLE

INFRASTRUCTURE

FOR

INTERNET

THE ORACLE 9I APPLICATION SERVER RUNS ALL YOUR APPLICATIONS.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

541

THE ORACLE 9I DATABASE STORES ALL YOUR DATA.


BASIC SELECT STATEMENT:

SELECT *| { [DISTINCT] COLUMN|EXPRESION [ALIAS],..} FROM TABLE_NAME;

WRITING SQL STATEMENTS:

SQL STATEMENTS ARE NOT CASE SENSITIVE.


CAN BE ON ONE OR MORE LINES.
KEYWORDS CANNOT BE ABBRIVATED OR SPLIT ACROSS LINES.
CLAUSES ARE USUALLY PLACED ON SEPARATE LINES.

CHARACTER STRINGS AND DATE VALUES ARE ENCLOSED IN SINGLE QUATATION


MARKS.
CHARACTER VALUES ARE CASE SENSITIVE AND DATE VALUES ARE FORMAT
SENSITIVE.
THE DEFAULT DATE FORMAT IS
DD-MON-YY,DD-MM-YY,DD-MM-RR.
COLUMN HEADING DEFAULTS:
ISQL*PLUS:
DEFAULT HEADING JUSTIFICATION CENTRE.
HEADING DISPLAY UPPERCASE.
SQL*PLUS:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

542

CHRACTER AND DATE COLUMNS HEADINGS LEFT JUSTIFIED.


NUMBER COLUMNS HEADINGS ARE RIGHT JUSTIFIED.
DEFAULT HEADING DISPLAY- UPPERCASE

ISQL*PLUS:
AN ENVIRONMENT.
ORACLE PROPRIETARY.
COMMANDS DO NOT ALLOW MANIPULATION OF VALUES IN DATABASE.
RUNS ON BROWSER.
CENTALLY LOADED , DOES NOT HAVE TO BE IMPLEMENTED ON EACH MACHINE.
ARITHEMITIC EXPRESSIONS:

OPERATOR.

DESCRIPTION.

ADD.

SUBTRACT.

MULTIPLY.

DIVIDE.

OPERATOR PRECEDENCE:
*

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

543

COMPARISION OPERATORS:
= EQUAL TO.
> GRATER THAN.
> = GRATER THAN OR EQUAL TO.
< LESS THAN.
< = LESS THAN OR EQUAL TO.
<> NOT EQUAL TO.

BETWEEN .. AND.

BETWEEN TWO VALUES(INCLUSIVE).

IN(SET)

MATCH ANY OF A LIST OF VALUES.

LIKE

MATCH A CHARACTER PATTERN.

IS NULL

IS A NULL VALUE.

LOGICAL CONDITIONS:
AND

RETURN TRUE IF BOTH


CONDITIONS ARE TRUE.

OR

RETURN TRUE IF EITHER COMPONENT


CONDITION IS TRUE.

NOT

RETURNS TRUE IF
CONDITION IS FALSE.

THE

COMPONENT

FOLLOWING

RULES OF PRECENDENCE:

ORDER EVALUATED.

OPERATOR.

ARITHEMITIC OPERATORS.

CONCATENATION OPERATOR.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

544

COMPARISION OPERATORS.

IS[NOT] NULL, LIKE[NOT] IN.

[NOT] BETWEEN.

NOT LOGICAL CONDITION.

AND LOGICAL CONDITION.

OR LOGICAL CONDITION.

SQL FUNCTIONS:
SQL FUNCTIONS ARE OF TWO TYPES.
SINGLE-ROW-FUNCTIONS.
MULTIPLE-ROW-FUNCTIONS.
SINGLE-ROW-FUNCTIONS.
CHARACTER.
NUMBER.
DATE.
CONVERSION.
GENERAL.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

545

CHRACTER FUNCTIONS:
CASE MANIPULATION FUNCTIONS:
LOWER.
UPPER.
INITCAP.

CHRACTER MANIPULATION FUNCTIONS:


CONCAT.
SUBSTR.
LEGTH.
INSTR.
LPAD/RPAD.
TRIM.
REPLACE.
NUMBER FUNCTIONS:
ROUND.
TRUNC.
MOD.
DATE FUNCTIONS:
MONTHS_BETWEEN.
ADD_MONTHS.
NEXT_DAY.
LAST_DAY.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

546

ROUND.
TRUNC.
VALID ORACLE DATE BETWEEN
JAN 1 , 4712 BC TO DEC 31 9999 AD

ARITHEMITIC WITH DATES:


DATE + NUMBER

DATE.

DATE NUMBER

DATE.

DATE DATE

NO OF DAYS.

DATE+ NUMBER/24

DATE.(ADD A NUMBER OF HOURS TO DATE).

CONVERSION FUNCTIONS:
DATA TYPE CONVERSIONS:

IMPLICIT DATA-TYPE CONVERSION.


EXPLICIT DATA-TYPE CONVERSION.

IMPLICIT DATA-TYPE CONVERSIONS:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

547

FOR ASSIGNMENT , THE ORACLE SERVER CAN AUTOMATICALLY CONVERT THE


FOLLOWING.
FROM

TO

VARCHAR2 OR CHAR

NUMBER.

VARCHAR2 OR CHAR

DATE.

NUMBER

VARCHAR2.

DATE.

VARCHAR2.

FOR
EXPRESSION
EVALUATION,
THE
AUTOMATICALLY CONVERT FOLLOWING.

ORACLE

FROM

SERVER

CAN

TO

VARCHAR2 OR CHAR

NUMBER.

VARCHAR2 OR CHAR

DATE.

EXPLICIT DATA-TYPE CONVERSIONS:


CHARACTER --------CHARACTER.

TO_NUMBER

---------

NUMBER

---------

TO_CHAR

---------

CHARACTER --------- TO_DATE --------- DATE --------- TO_CHAR --------- CHARACTER.

ELEMENTS OF THE DATE FORMAT MODEL:

YYYY

FULL YEAR IN NUMBER.

YEAR

YEAR SPELLED OUT.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

548

MM

TWO-DIGIT VALUE OF MONTH.

MONTH

FULL NAME OF THE MONTH.

MON

THREE-LETTER ABBREVATION OF THE MONTH.

DY

THREE-LETTER ABBREVATION OF THE WEEK.

DAY

FULL NAME OF THE DAY OF THE WEEK.

DD

NUMERIC DAY OF THE MONTH.

GENERAL FUNCTIONS:

NVL.
NVL2.
NULLIF.
COALESCE.
NVL(COMM,0);
NVL(HIREDATE,01-JAN-97);
NVL(JOB_ID,NO JOB YET);
GROUP FUNCTIONS:
AVG.
COUNT.
MAX.
MIN.
STDDEV.
VARIANCE.
SELECT COLUMN . [COLUMN],GROUP FUNCTION FROM TABLE
[WHERE CONDITION]

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

549

[GROUP BY GROUP BY EXPRESSION]


[ HAVING GROUP CONDITION]
[ORDER BY COLUMN];

TYPES OF SUBQUERIES:
SINGLE ROW SUBQUERIES:
QUERIES THAT RETURNS ONLY ONE ROW FROM THE INNER SELECT STATEMENT.
MULTIPLE ROW SUBQUERIES:
QUERIES THAT RETURN MORE THAN ONE-ROW FROM THE INNER SELECT
STATEMENTS.
DATA BASE OBJECTS:
TABLES.
VIEWS.
SEQUENCES.
INDEXES.
SYNONYM.

TABLE NAMES AND COLUMN NAMES:


MUST BEGIN WITH A LETTER.
MUST BE 1 TO 30 CHARACTER LONG.
MUST CONTAIN ONLY
A-Z, a-z,0-9,-,$ and #.
MUST NOT DUPLICATE THE NAME OF ANOTHER OBJECT OWNED BY SAME USER.
MUST NOT BE AN ORACLE SERVER RESERVED WORD.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

550

AUTOMATIC COMMIT:

WHEN EVER DDL,DCL STATEMENTS ISSUED.


WHEN EVER ISQL*PLUS,SQL*PLUS EXITED NORMALLY, WITHOUT EXPLICITLY
ISSUSING COMMIT OR ROLLBACK.
AUTOMATIC ROLLBACK:
ABNORMAL TERIMINATION OF ISQL*PLUS OR SYSTEM FAILURE.
TABLES IN THE ORACLE DATABASE:
USER TABLES:
ARE COLLECTION OF TABLES CREATED AND MAINTAINED BY THE USER.
CONTAINS USER INFORMATION.
DATA DICTIONARY:
IS COLLECTION OF TABLES CREATED AND MAINTAINED BY THE ORACLE SERVER.
CONTAIN DATABASE INFORMATION.
USER TABLES ARE TABLES CREATED BY THE USER, SUCH AS EMP. THERE ARE
ANOTHER COLLECTION OF TABLES AND VIEWS IN THE ORACLE DATABASE KNOWN
AS THE DATA DICTIONARY. THIS COLLECTION IS CREATED AND MAINTAINED BY THE
ORACLE SERVER AND CONTAINS INFORMATION ABOUT THE DATABASE.
ALL DATA DICTIONARY TABLES ARE OWNED BY THE SYS USER. THE BASE TABLES
ARE RARELY ACCESSED BY THE USER BECAUSE THE INFORMATION IN THEM IS NOT
EASY TO UNDERSTAND.
INFORMATION STORED IN THE DATA DICTIONARY INCLUDES NAMES OF THE ORACLE
SERVER USERS, PRIVILEGES GRANTED TO USERS, DATABASE OBJECT NAMES, TABLES
CONSTRAINTS AND AUDITING INFORMATION.
THERE ARE FOUR CATEGORIES OF DATA DICTIONARY VIEWS; EACH CATEGORY HAS A
DISTINCT PREFIX THAT REFLECTS ITS INTENDED USE.
PREFIX

I Soft Solutions ,Bang-54.

DESCRIPTION

STRUCTURED QUERY LANGUAGE

ORACLE
USER_

551

THESE VIEWS CONTAIN


OBJECTS
OWNED BY THE USER.

INFORMATION

ABOUT

ALL_

THESE VIEWS CONTAINS INFORMATION ABOUT ALL OF


THE TABLES(OBJECT TABLES AND RELATIONAL TABLES)
ACCESSIBLE TO THE USER.

DBA_

THESE VIEWS ARE RESTRICTED VIEWS, WHICH CAN BE


ACCESSED ONLY BY PEOPLE WHO HAVE BEEN ASSIGNED
THE DBA ROLE.

V$

THESE VIEWS ARE DYNAMIC PERFORMANCE VIEWS,


DATABASE SERVER PERFORMANCE, MEMORY , AND
LOCKING.

QUERYING THE DATA DICTIONARY:


SEE THE NAMES OF TABLES OWNED BY THE USER.
SELECT * FROM USER_TABLES;
VIEW DISTINCT OBJECT_TYPES OWNED BY THE USER.
SELECT DISTINCT OBJECT_TYPE FROM USER_OBJECTS.
VIEW TABLES, VIEWS,SYNONYMS AND SEQUENCES OWNED BY THE
USER.
SELECT * FROM CATALOG;

USER_CATALOG HAS A SYNONYM CALLED CAT.


YOU CAN USE THIS SYNONYM INSTEAD OF USER_CATALOG IN SQL STATEMENT.
SELECT * FROM CAT;

DATATYPES:

DATA TYPE

DESCRIPTION

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

552

VARCHAR2(SIZE)

VARIABLE-LENGTH CHARACTER DATA( A MAXIMUM SIZE


MUST BE SPECIFIED: MINIMUM SIZE IS 1:MAXIMUM SIZE
IS 4000).

CHAR

FIXED LENGTH CHARACTER DATA OF LENGTH SIZE


BYTES (DEFAULT AND MINIMUM SIZE IS 1; MAXIMUM
SIZE IS 2000).

NUMBER(P,S)

NUMBER HAVING PRECISION P AND SCALE S(PRECISION IS


THE TOTAL NUMBER OF DECIMAL DIGITS, AND THE
SCALE IS THE NUMBER OF DIGITS TO THE RIGHT OF THE
DECIMAL POINT; THE PRECISION CAN RANGE FROM 1 TO
38 AND SCALE CAN RANGE FROM -84 TO 127).

DATE

DATE AND TIME VALUES TO THE NEAREST SECOND


BETWEEN JANUARY 1, 4712 B.C., AND A.D. DECEMBER 31,
9999.

LONG

VARIABLE LENGTH CHARACTER DATA UP TO 2 GB.

CLOB

CHRACTER DATA UP TO 4 GIGABYTES.

RAW(SIZE)

RAW BINARY DATA OF LENGTH SIZE( A MAXIMUM SIZE


MUST BE SPECIFIED. MAXIMUM SIZE IS 2000).

LONG RAW

RAW BINARY DATA OF VARIABLE LENGTH UP TO 2 GB.

BLOB

BINARY DATA UP TO 4 GB.

BFILE

BINARY DATA STORED IN AN EXTERNAL FILE:UP TO 4 GB.

ROWID

HEXADECIMAL STRING REPRESENTING THE UNIQUE


ADDRESS OF A ROW IN ITS TABLE. THIS DATA TYPE IS
PRIMARILY FOR VALUES RETURNED BY THE ROWID
PSEUDOCOLUMN.

A LONG COLUMN IS NOT COPIED WHEN A TABLE IS CREATED USING ASUBQUERY.


A LONG COLUMN CANNOT BE INCLUDED IN A GROUP BY OR ORDER BY CLAUSE.
ONLY ONE LONG COLUMN CAN BE USED PER TABLE.
NO CONSTRAINT CAN BE DEFINED ON A LONG COLUMN.
YOU MAY WANT TO USE A CLOB COLUMN RATHER THAN A LONG COLUMN.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

553

DATETIME DATA TYPES:


DATETIME ENHANCEMENTS WITH ORACLE 9I:
TIMESTAMP.

DATE WITH FRACTIONAL SECONDS.

THIS IS EXTENSION OF THE DATE DATA TYPE.


IT STORES THE YEAR, MONTH,AND DAY OF THE DATE DATA TYPE PLUS HOUR,
MINUTE, AND SECOND VALUES AS WELL AS THE FRACTIONAL SECOND VALUE.
THE TIME STAMP DATA TYPE IS SPECIFIED AS FOLLOWS.
TIMESTAMP[(FRACTIONAL_SECONDS_PRECISION)]
FRACTIONAL_SECONDS_PRECISION OPTIONALLY SPECIFIES THE NUMBER OF
DIGITS IN THE FRACTIONAL PART OF THE SECOND DATETIME FIELD AND CAN BE
A NUMBER IN THE RANGE 0 TO 9. THE DEFAULT IS 6.
CASCADE:
SQL> CREATE TABLE EMP_D
2 AS
3 SELECT * FROM EMP;
Table created.
SQL> CREATE TABLE DEPT_D
2 AS
3 SELECT * FROM DEPT;
Table created.
SQL> ALTER TABLE DEPT_D
2 ADD CONSTRAINT DEPT_D_PK PRIMARY KEY(DEPTNO);
Table altered.
SQL> ALTER TABLE EMP_D
2
ADD CONSTRAINT EMP_D_FK FOREIGN
DEPT_D(DEPTNO);

KEY(DEPTNO)

REFERENCES

Table altered.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

554

1 ALTER TABLE DEPT_D


2* DISABLE CONSTRAINT DEPT_D_PK
SQL> /
ALTER TABLE DEPT_D
*
ERROR at line 1:
ORA-02297: cannot disable constraint (SCOTT.DEPT_D_PK) - dependencies exist
SQL> ALTER TABLE DEPT_D
2 DROP CONSTRAINT DEPT_D_PK;
DROP CONSTRAINT DEPT_D_PK
*
ERROR at line 2:
ORA-02273: this unique/primary key is referenced by some foreign keys
SQL> ALTER TABLE DEPT_D
2 DISABLE CONSTRAINT DEPT_D_PK CASCADE;
Table altered.

SQL> ALTER TABLE DEPT_D


2 ENABLE CONSTRAINT DEPT_D_PK;
Table altered.
SQL> ALTER TABLE DEPT_D
2 DISABLE CONSTRAINT DEPT_D_PK;
Table altered.
SQL> ALTER TABLE DEPT_D
2 ENABLE CONSTRAINT DEPT_D_PK;
Table altered.
1 ALTER TABLE DEPT_D
2* ENABLE CONSTRAINT DEPT_D_PK CASCADE;
SQL> /
ENABLE CONSTRAINT DEPT_D_PK CASCADE;
*
ERROR at line 2:
ORA-00933: SQL command not properly ended

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

555

ENABLING A PRIMARY KEY CONSTRAINT THAT WAS DISABLED WITH CASCADE


OPTION DOES NOT ENABLE ANY FOREIGN KEYS THAT ARE DEPENDENT UPON
THE PRIMARY KEY.
CASCADING CONSTRAINTS:

THE CASCADE CONSTRAINTS CLAUSE IS USED ALONG WITH THE DROP COLUMN
CLAUSE.
THE CASCADE CONSTRAINTS CLAUSE DROPS ALL REFERENTIAL INTEGRITY
CONSTRAINTS THAT REFERTO THE PRIMARY AND UNIQUE KEYS DEFINED ON THE
DROPPED COLUMNS.
THE CASCADE CONSTRAINTS CLAUSE ALSO DROPS ALL MULTICOLUMN
CONSTRAINTS DEFINED ON THE DROPPED COLUMNS.
SQL> CREATE TABLE TEST1
2 (PK NUMBER(10) CONSTRAINT TEST1_PK PRIMARY KEY,
3 FK NUMBER(10),
4 COL1 NUMBER(10),
5 COL2 NUMBER(10),
6 CONSTRAINT TEST1_FK FOREIGN KEY(FK) REFERENCES TEST1(PK),
7 CONSTRAINT TEST1_CK1 CHECK(PK > 0 AND COL1 > 0),
8 CONSTRAINT TEST1_CK2 CHECK(COL2 > 0));
Table created.
SQL> ALTER TABLE TEST1
2 DROP COLUMN PK;
DROP COLUMN PK
*
ERROR at line 2:
ORA-12992: cannot drop parent key column
SQL> ALTER TABLE TEST1
2 DROP COLUMN COL1;
DROP COLUMN COL1
*
ERROR at line 2:
ORA-12991: column is referenced in a multi-column constraint
SQL> ALTER TABLE TEST1
2 DROP (PK);

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

556

DROP (PK)
*
ERROR at line 2:
ORA-12992: cannot drop parent key column
SQL> ALTER TABLE TEST1
2 DROP (COL1);
DROP (COL1)
*
ERROR at line 2:
ORA-12991: column is referenced in a multi-column constraint
SQL> ALTER TABLE TEST1
2 DROP (PK) CASCADE CONSTRAINTS;
Table altered.
THE ABOVE STATEMENT DROPS COLUMN PK, THE PRIMARY KEY
CONSTRAINT,THE FOREIGN KEYCONSTRAINT AND CHECK CONSTRAINT.
SQL> DESC TEST1;
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------FK
NUMBER(10)
COL1
NUMBER(10)
COL2
NUMBER(10)

1 CREATE TABLE TEST2


2 (PK NUMBER(10) CONSTRAINT TEST2_PK PRIMARY KEY,
3 FK NUMBER(10),
4 COL1 NUMBER(10),
5 COL2 NUMBER(10),
6 CONSTRAINT TEST2_FK FOREIGN KEY(FK) REFERENCES TEST2(PK),
7 CONSTRAINT TEST2_CK1 CHECK(PK > 0 AND COL1 > 0),
8* CONSTRAINT TEST2_CK2 CHECK(COL2 > 0))
9 /
Table created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

557

SQL> ALTER TABLE TEST2


2 DROP (PK,FK,COL1);
Table altered.
SQL> DESC TEST2
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------COL2
NUMBER(10)
IN THE ABOVE STATEMENT WE ARE DROPING ALL THE COLUMNS THAT ARE
REFERENCED BY CONSTRAINTS,HERE THERE IS NO USE OF THE CASCADE
CONSTRAINTS.
USER_CONSTRAINTS:

1 CREATE TABLE EMP_DU


2 (EMPNO NUMBER(10) CONSTRAINT PAVAN_PK PRIMARY KEY,
3 ENAME VARCHAR2(10) CONSTRAINT PAVAN_UK UNIQUE,
4 JOB

VARCHAR2(10) CONSTRAINT PAVAN_NN NOT NULL,

5 SAL

NUMBER(10) CONSTRAINT PAVAN_CK CHECK(SAL > 1000),

6* DEPTNO NUMBER(10) CONSTRAINT PAVAN_FK REFERENCES DEPT(DEPTNO))


SQL> /
Table created.

1 SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,SEARCH_CONDITION
2 FROM USER_CONSTRAINTS
3* WHERE TABLE_NAME='EMP_DU'
SQL> /
CONSTRAINT_NAME
C
------------------------------ SEARCH_CONDITION
-------------------------------------------------------------------------------I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
PAVAN_NN
"JOB" IS NOT NULL

PAVAN_CK
SAL > 1000

PAVAN_PK

PAVAN_UK

PAVAN_FK

558

INTEGRITY CONSTRAINTS:
MAINTAINING SECURITY AND INTEGRITY OF A DATABASE IS THE MOST
IMPORTANT FACTOR IN JUDGING THE SUCCESS OF A SYSTEM.
INTEGRITY CONSTRAINT IS A MECHANISM USED BY ORACLE TO PREVENT
INVALID DATA ENTRY INTO THE TABLE.
INTEGRITY CONSTRAINTS ARE DEVIDED IN TO THREE CATEGORIES:
1.DOMAIN INTEGRITY CONSTRAINTS.
2.ENTITY INTEGRITY CONSTRAINTS.
3.REFERENTIAL INTEGRITY CONSTRAINTS.

DOMAIN INTEGRITY CONSTRAINTS.


NOT NULL

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

559

CHECK
BOTH FALL UNDER THIS CATEGORY.

ENTITY INTEGRITY CONSTRAINTS.


ENTITY INTEGRITY CONSTRAINTS ARE OF TWO TYPES:
UNIQUE CONSTRAINT.
PRIMARY KEY CONSTRAINT.
REFERENTIAL INTEGRITY CONSTRAINTS.
REFERENTIAL INTEGRITY CONSTRAINT ENFORCES RELATIONSHIP BETWEEN
TABLES.
IT DESIGNATES A COLUMN OR COMBINATION OF COLUMNS AS A FOREIGN KEY.
THE FOREIGN KEY ESTABLISHES A RELATIONSHIP WITH A SPECIFIED PRIMARY
KEY OR UNIQUE KEY IN ANOTHER TABLE, CALLED THE REFERENCED KEY.
IN THIS RELATION SHIP , THE TABLE CONTAINING THE FOREIGN KEY IS CALLED
THE CHILD TABLE AND THE TABLE CONTAINING THE REFERENCED KEY IS
CALLED THE PARENT TABLE.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

560

TRIGGERS:

DML TRIGGERS:
CREATE [OR REPLACE ] TRIGGER TRIGGER_NAME
{ BEFORE | AFTER|
{ INSERT|DELETE|UPDATE|UPDATE OF COLUMN LIST} ON TABLE NAME
[FOR EACH ROW]
[WHEN (..)]
[DECLARE..]
BEGIN
EXECUTABLE STATEMENETS
[EXCEPTION..]
END[TRIGGER_NAME];
SQL> CREATE TABLE DML_EX
2 (ACTION VARCHAR2(10),
3 TDATE
TIMESTAMP);
Table created.
1 CREATE OR REPLACE TRIGGER BFORE_INSERT
2 BEFORE INSERT ON EMP
3 BEGIN
4 INSERT INTO DML_EX
5 VALUES
6 ('BFOREINSERT',SYSTIMESTAMP);
7* END;
8 /
Trigger created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

561

1 CREATE OR REPLACE TRIGGER BFORE_INSERT_ROW


2 BEFORE INSERT ON EMP FOR EACH ROW
3 BEGIN
4 INSERT INTO DML_EX
5 VALUES
6 ('BFOREINSERTROW',SYSTIMESTAMP);
7* END;
8 /
Trigger created.

1 CREATE OR REPLACE TRIGGER AFTER_INSERT


2 AFTER INSERT ON EMP
3 BEGIN
4 INSERT INTO DML_EX
5 VALUES
6 ('AFTERINSERT',SYSTIMESTAMP);
7* END;
SQL> /
Trigger created.
1 CREATE OR REPLACE TRIGGER AFTER_INSERT_ROW
2 AFTER INSERT ON EMP FOR EACH ROW
3 BEGIN
4 INSERT INTO DML_EX
5 VALUES
6 ('AFTERINSERTROW',SYSTIMESTAMP);
7* END;
8 /
Trigger created.
1 CREATE OR REPLACE TRIGGER BEFORE_UPDATE
2 BEFORE UPDATE ON EMP
3 BEGIN
4 INSERT INTO DML_EX
5 VALUES
6 ('BEFOREUPDATE',SYSTIMESTAMP);
7* END;
8 /

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

562

Trigger created.

1 CREATE OR REPLACE TRIGGER BEFORE_UPDATE_ROW


2 BEFORE UPDATE ON EMP FOR EACH ROW
3 BEGIN
4 INSERT INTO DML_EX
5 VALUES
6 ('BEFOREUPDATEROW',SYSTIMESTAMP);
7* END;
8 /
Trigger created.
1 CREATE OR REPLACE TRIGGER AFTER_UPDATE
2 AFTER UPDATE ON EMP
3 BEGIN
4 INSERT INTO DML_EX
5 VALUES
6 ('AFTERUPDATE',SYSTIMESTAMP);
7* END;
SQL> /
Trigger created.
1 CREATE OR REPLACE TRIGGER AFTER_UPDATE_ROW
2 AFTER UPDATE ON EMP FOR EACH ROW
3 BEGIN
4 INSERT INTO DML_EX
5 VALUES
6 ('AFTERUPDATEROW',SYSTIMESTAMP);
7* END;
8 /
Trigger created.
1 CREATE OR REPLACE TRIGGER BEFORE_DELETE
2 BEFORE DELETE ON EMP
3 BEGIN
4 INSERT INTO DML_EX
5 VALUES
6 ('BEFOREDELETE',SYSTIMESTAMP);
7* END;
SQL> /
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

563

Trigger created.
1 CREATE OR REPLACE TRIGGER BEFORE_DELETE_ROW
2 BEFORE DELETE ON EMP FOR EACH ROW
3 BEGIN
4 INSERT INTO DML_EX
5 VALUES
6 ('BEFOREDELETEROW',SYSTIMESTAMP);
7* END;
8 /
Trigger created.
1 CREATE OR REPLACE TRIGGER AFTER_DELETE
2 AFTER DELETE ON EMP
3 BEGIN
4 INSERT INTO DML_EX
5 VALUES
6 ('AFTERDELETE',SYSTIMESTAMP);
7* END;
SQL> /
Trigger created.
1 CREATE OR REPLACE TRIGGER AFTER_DELETE_ROW
2 AFTER DELETE ON EMP FOR EACH ROW
3 BEGIN
4 INSERT INTO DML_EX
5 VALUES
6 ('AFTERDELETEROW',SYSTIMESTAMP);
7* END;
8 /
Trigger created.
SQL> SELECT * FROM DML_EX;
no rows selected
SQL> INSERT INTO EMP
2 (EMPNO,DEPTNO)
3 VALUES
4 (1,10);
INSERT INTO EMP
*
ERROR at line 1:
ORA-01401: inserted value too large for column
ORA-06512: at "SCOTT.BFORE_INSERT", line 2
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

564

ORA-04088: error during execution of trigger 'SCOTT.BFORE_INSERT'


SQL> ALTER TABLE DML_EX
2 MODIFY ACTION VARCHAR2(50);
Table altered.
SQL> INSERT INTO EMP
2 (EMPNO,DEPTNO)
3 VALUES
4 (1,10);
1 row created.

SQL> SELECT * FROM DML_EX;


ACTION
-------------------------------------------------TDATE
--------------------------------------------------------------------------BFOREINSERT
08-SEP-05 06.59.01.000000 AM
BFOREINSERTROW
08-SEP-05 06.59.01.000000 AM
AFTERINSERTROW
08-SEP-05 06.59.01.000000 AM
AFTERINSERT
08-SEP-05 06.59.01.000000 AM
SQL> DELETE FROM DML_EX;
4 rows deleted.
SQL> DELETE FROM EMP WHERE EMPNO=1;
1 row deleted.
SQL> SELECT * FROM DML_EX;
ACTION
-------------------------------------------------TDATE
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

565

--------------------------------------------------------------------------BEFOREDELETE
08-SEP-05 07.00.11.000001 AM
BEFOREDELETEROW
08-SEP-05 07.00.11.000001 AM
AFTERDELETEROW
08-SEP-05 07.00.11.000001 AM
AFTERDELETE
08-SEP-05 07.00.11.000001 AM
SQL> DELETE FROM DML_EX;
4 rows deleted.
SQL> UPDATE EMP
2 SET SAL = SAL+0
3 WHERE EMPNO=7788;
1 row updated.
SQL> SELECT * FROM DML_EX;
ACTION
-------------------------------------------------TDATE
--------------------------------------------------------------------------BEFOREUPDATE
08-SEP-05 07.01.36.000001 AM
BEFOREUPDATEROW
08-SEP-05 07.01.36.000001 AM
AFTERUPDATEROW
08-SEP-05 07.01.36.000001 AM
AFTERUPDATE
08-SEP-05 07.01.36.000001 AM
SQL> DELETE FROM DML_EX;
4 rows deleted.
SQL> SELECT * FROM DML_EX;
no rows selected
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

566

SQL> UPDATE EMP


2 SET SAL = SAL+0;
14 rows updated.
SQL> SELECT * FROM DML_EX;
ACTION
-------------------------------------------------TDATE
--------------------------------------------------------------------------BEFOREUPDATE
08-SEP-05 07.02.26.000001 AM
BEFOREUPDATEROW
08-SEP-05 07.02.26.000001 AM
AFTERUPDATEROW
08-SEP-05 07.02.26.000001 AM
BEFOREUPDATEROW
08-SEP-05 07.02.26.000001 AM
AFTERUPDATEROW
08-SEP-05 07.02.26.000001 AM
BEFOREUPDATEROW
08-SEP-05 07.02.26.000001 AM
AFTERUPDATEROW
08-SEP-05 07.02.26.000001 AM
BEFOREUPDATEROW
08-SEP-05 07.02.26.000001 AM
AFTERUPDATEROW
08-SEP-05 07.02.26.000001 AM
BEFOREUPDATEROW
08-SEP-05 07.02.26.000001 AM
AFTERUPDATEROW
08-SEP-05 07.02.26.000001 AM
BEFOREUPDATEROW
08-SEP-05 07.02.26.000001 AM
ACTION
-------------------------------------------------I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

567

TDATE
--------------------------------------------------------------------------AFTERUPDATEROW
08-SEP-05 07.02.26.000001 AM
BEFOREUPDATEROW
08-SEP-05 07.02.26.000001 AM
AFTERUPDATEROW
08-SEP-05 07.02.26.000001 AM
BEFOREUPDATEROW
08-SEP-05 07.02.26.000001 AM
AFTERUPDATEROW
08-SEP-05 07.02.26.000001 AM
BEFOREUPDATEROW
08-SEP-05 07.02.26.000001 AM
AFTERUPDATEROW
08-SEP-05 07.02.26.000001 AM
BEFOREUPDATEROW
08-SEP-05 07.02.26.000001 AM
AFTERUPDATEROW
08-SEP-05 07.02.26.000001 AM
BEFOREUPDATEROW
08-SEP-05 07.02.26.000001 AM
AFTERUPDATEROW
08-SEP-05 07.02.26.000001 AM
BEFOREUPDATEROW
ACTION
-------------------------------------------------TDATE
--------------------------------------------------------------------------08-SEP-05 07.02.26.000001 AM
AFTERUPDATEROW
08-SEP-05 07.02.26.000001 AM
BEFOREUPDATEROW
08-SEP-05 07.02.26.000001 AM

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

568

AFTERUPDATEROW
08-SEP-05 07.02.26.000001 AM
BEFOREUPDATEROW
08-SEP-05 07.02.26.000001 AM
AFTERUPDATEROW
08-SEP-05 07.02.26.000001 AM
AFTERUPDATE
08-SEP-05 07.02.26.000001 AM
30 rows selected.
1* SELECT COUNT(*) FROM EMP
SQL> /
COUNT(*)
---------14

DDL TRIGGERS:
CREATE [OR REPLACE ] TRIGGER TRIGGER_NAME
{BEFORE |AFTER|{DDL EVENT} ON {DATABASE|SCHEMA}
DECLARE
VARIABLE DECLARATIONS.
BEGIN

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

569

.SOME CODE.
END;
WHERE DDL_EVENT:
CREATE
ALTER
DROP
COMMENT.
GRANT.
REVOKE.
RENAME.
TRUNCATE.

SQL> CREATE TABLE CREATE_DDL_CREA


2 (ACTION VARCHAR2(20),
3 TDATE TIMESTAMP);
Table created.

1 CREATE OR REPLACE TRIGGER CREATE_DDL_BFORE


2 BEFORE CREATE ON SCHEMA
3 BEGIN
4 INSERT INTO CREATE_DDL_CREA
5 VALUES
6 ('CREATING',SYSTIMESTAMP);
7* END;
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

570

8 /
Trigger created.
1 CREATE OR REPLACE TRIGGER CREATE_DDL_AFTER
2 AFTER CREATE ON SCHEMA
3 BEGIN
4 INSERT INTO CREATE_DDL_CREA
5 VALUES
6 ('CREATED',SYSTIMESTAMP);
7* END;
8 /
Trigger created.
1 CREATE OR REPLACE TRIGGER CREATE_DDL_BFORE
2 BEFORE CREATE ON DATABASE
3 BEGIN
4 INSERT INTO CREATE_DDL_CREA
5 VALUES
6 ('CREATING DATABASE',SYSTIMESTAMP);
7* END;
8 /
BEFORE CREATE ON DATABASE
*
ERROR at line 2:
ORA-01031: insufficient privileges
SQL> CONN
Enter user-name: SYS AS SYSDBA
Connected.
SQL> GRANT DBA TO SCOTT;
Grant succeeded.
SQL> CONN
Enter user-name: SCOTT
Connected.

SQL> CREATE OR REPLACE TRIGGER CREATE_DDL_BFORE


2 BEFORE CREATE ON DATABASE
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

571

3 BEGIN
4 INSERT INTO CREATE_DDL_CREA
5 VALUES
6 ('CREATING DATABASE',SYSTIMESTAMP);
7 END;
8 /
CREATE OR REPLACE TRIGGER CREATE_DDL_BFORE
*
ERROR at line 1:
ORA-04095: trigger 'CREATE_DDL_BFORE' already exists on another table, cannot replace it
1 CREATE OR REPLACE TRIGGER CREATE_DDL_BFORE_DATA
2 BEFORE CREATE ON DATABASE
3 BEGIN
4 INSERT INTO CREATE_DDL_CREA
5 VALUES
6 ('CREATING DATABASE',SYSTIMESTAMP);
7* END;
8 /
Trigger created.
1 CREATE OR REPLACE TRIGGER CREATE_DDL_ATER_DATA
2 AFTER CREATE ON DATABASE
3 BEGIN
4 INSERT INTO CREATE_DDL_CREA
5 VALUES
6 ('CREATED DATABASE',SYSTIMESTAMP);
7* END;
SQL> /
Trigger created.
SQL> CREATE TABLE B
2 (EMPNO NUMBER(10));
Table created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

572

SQL> SELECT * FROM CREATE_DDL_CREA;


ACTION
TDATE
-------------------- --------------------------------------------------------------------------CREATING
08-SEP-05 07.17.57.000000 AM
CREATING DATABASE 08-SEP-05 07.17.57.000000 AM
CREATED
08-SEP-05 07.17.57.000000 AM
CREATED DATABASE 08-SEP-05 07.17.57.000000 AM

DATABASE EVENT TRIGGERS:

DATABASE EVENT TRIGGERS FIRE WHENEVER DATABASE-WIDE EVENTS OCCUR.


THERE ARE FIVE DATABASE EVENT TRIGGERS:
STARTUP.
FIRES WHEN THE DATABASE IS OPENED.
SHUTDOWN
FIRES WHEN THE DATABASE IS SHUTDOWN NORMALLY.
SERVERERROR
FIRES WHEN AN ORACLE ERROR IS RAISED.
LOGON
FIRES WHEN AN ORACLE SESSION BEGINS.
LOGOFF
FIRES WHEN ANORACLE SESSION TERMINATES NORMALLY.
CREATE [OR REPLACE] TRIGGER TRIGGER_NAME
{BEFORE|AFTER{DATABASE EVENT} ON {DATABASE|SCHEMA}
DECLARE

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

573

VARIABLE DECLARATIONS.
BEGIN
SOME CODE
END.

NO BEFORE STARTUP TRIGGERS.


NOAFTER SHUTDOWN TRIGGERS.
NOBEFORE LOGON TRIGGERS.
NOAFTERLOGOFF TRIGGERS.
NOBEFORESERVERERROR.
TABLE : BASIC UNIT OF STORAGE. COMPOSED OF ROWS AND COLUMNS.
VIEW : LOGICALLY REPRESENTS SUBSETS OF DATA FROM ONE OR MORE TABLES.
SEQUENCE:GENERATES PRIMARY KEY VALUES.
INDEX: IMPROVES THE PERFORMANCE OF SOME QUERIES.
SYNONYM : ALTERNATIVE NAME FOR AN OBJECT.
INLINEVIEW:
INLINE VIEW IS BASICALLY A SUBQUERY WITH AN ALIAS(CORRELATION NAME) THAT
YOU CAN USE LIKE A VIEW INSIDE A SQL STATEMENT.
IT IS NOT A SCHEMA OBJECT LIKE NORMAL VIEW.
QUERY DISPLAYS EMPLOYEE NAMES,SALARIES,DEPARTMENT NUMBERS AND
MAXIMUM SALARIES FOR ALL THE EMPLOYEES WHO EARN LESS THAN THE MAX
SAL IN THEIR DEPARTMENT.
SQL> SELECT A.ENAME,A.SAL,A.DEPTNO,B.MAXSAL
2 FROM EMP A,(SELECT DEPTNO,MAX(SAL) MAXSAL FROM EMP GROUP BY DEPTNO)
B
3 WHERE A.DEPTNO=B.DEPTNO

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

574

4 AND A.SAL < B.MAXSAL ORDER BY ENAME;


ENAME
SAL
---------- ---------- ---------- ---------ADAMS
1100
ALLEN
1600
30
CLARK
2450
10
JAMES
950
30
JONES
2975
20
MARTIN
1250
MILLER
1300
10
SMITH
800
20
TURNER
1500
WARD
1250
30

DEPTNO
20
2850
5000
2850
3000
30
5000
3000
30
2850

MAXSAL

3000

2850
2850

10 rows selected.
SQL> SELECT ENAME,SAL,DEPTNO,MAXSAL
2 FROM EMP A
3 WHERE SAL < (SELECT MAX(SAL)
4
SQL> ED
Wrote file afiedt.buf
1 SELECT ENAME,SAL,DEPTNO
2 FROM EMP A
3 WHERE SAL < (SELECT MAX(SAL) FROM EMP B
4* WHERE A.DEPTNO=B.DEPTNO)
5 ORDER BY ENAME;
ENAME
SAL
---------- ---------- ---------ADAMS
1100
ALLEN
1600
CLARK
2450
JAMES
950
JONES
2975
MARTIN
1250
MILLER
1300
SMITH
800
TURNER
1500
WARD
1250

DEPTNO
20
30
10
30
20
30
10
20
30
30

10 rows selected.
TOP-N ANALYSIS:

TOP-N QUERIES ASK FOR THE N LARGEST OR SMALLEST VALUES OF A COLUMN.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

575

FOR EXAMPLE:
-

WHAT ARE THE TEN BEST SELLING PRODUCTS.


WHAT ARE THE TEN WORST SELLING PRODUCTS.

BOTH LARGEST VALUES AND SMALLEST VALUES SETS ARE CONSIDERED


TOP-N QUERIES.

PERFORMING TOP-N ANALYSIS:

THE HIGH-LEVEL STRUCTURE OF A TOP-N ANALYSIS QUERY IS:


SELECT [COLUMN_LIST],ROWNUM
FROM (SELECT [COLUMN_LIST] FROM TABLE ORDER BY TOP-N_COLUMN)
WHERE ROWNUM < = N;

A SUBQERY OR AN INLINE VIEW TO GENERATE THE SORTED LIST OF DATA. THE


SUBQERY OR THE INLINE VIEW INCLUDES THE ORDER BY CLAUSE TO ENSURE THAT
THE RANKING IS IN THE DESIRED ORDER. FOR RESULTS RETRIVING THE LARGEST
VALUES,A DESC PARAMETER IS NEEDED.
AN OUTER QUERY TO LIMIT THE NUMBER OF ROWS IN THE FINAL RESULT SET.
THE OUTER QUERY INCLUDES THE FOLLOWING COMPONENTS:
THE ROWNUM PSEDOCOLUMN, WHICH ASSIGNS A SEQUENTIAL VALUE STARTING
WITH 1 TO EACH OF THE ROWS RETURNED FROM THE SUBQUERY.
A WHERE CLAUSE, WHICH SPECIFIES THE N ROWS TO BE RETURNED. THE OUTER
WHERE CLAUSE MUST USE A < OR < = OPERATOR.
SELECT ROWNUM AS RANK, ENAME,SAL

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

576

FROM (SELECT ENAME,SAL FROM EMP ORDER BY SAL DESC)


WHERE ROWNUM < = 3.

USING A SEQUENCE:

CACHING SEQUENCE VALUES IN MEMORY GIVES FASTER ACCESS TO THOSE VALUES.


GAPS IN SEQUENCE VALUES CAN OCCUR WHEN:
A ROLLBACK OCCURS.
THE SYSTEM CRASHES.
A SEQUENCE IS USED IN ANOTHER TABLE.
IF THE SEQUENCE WAS CREATED WITH NOCACHE, VIEW THE NEXT AVAILABLE
VALUE, BY QUERYING THE USER_SEQUENCES TABLE.
DATABASE LINKS:
A DATABASE LINK CONNECTION ALLOWS LOCAL USERS TO ACCESS DATA ON A
REMOTE DATABASE.
A DATABASE LINK IS A POINTER THAT DEFINES A ONE-WAY COMMUNICATION PATH
FROM AN ORACLE DATABASE SERVER TO ANOTHER DATABASE SERVER.
THE LINK POINTER IS ACTUALLY DEFINED AS AN ENTRY IN A DATA DICTIONARY
TABLE.
TO ACCESS THE LINK,YOU MUST BE CONNECTED TO THE LOCAL DATABASE THAT
CONTAINS THE DATA DICTIONARY ENTRY.
A DATABASE LINK CONNECTION IS ONE-WAY IN THE SENSE THAT A CLIENT
CONNECTED TO LOCAL DATABASE A CAN USE A LINK STORED IN DATABASE A
TO ACCESS INFORMATION IN REMOTE DATABASE B, BUT USERS CONNECTED TO
DATABASE B CANNOT USE THE SAME LINK TO ACCESS DATA IN DATABASE A.
IF LOCAL USERS ON DATABASE B WANT TO ACCESS DATA ON DATABSE A , THEY MUST
DEFINE A LINK THAT IS STORED IN THE DATA DICTIONARY OF DATABASE B.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

577

A DATABASE LINK CONNECTION GIVES LOCAL USERS ACCESS TO DATA ON REMOTE


DATABASE. FOR THIS CONNECTION TO OCCUR, EACH DATABASE IN THE
DISTRIBUTED SYSTEM MUST HAVE A UNIQUE GLOBAL DATABASE NAME.
THE GLOBAL DATABASE NAME UNIQUELY IDENTIFIES A DATABASE SERVER IN A
DISTRIBUTED SYSTEM.
THE GREAT ADVANTAGE OF DATABASE LINKS IS THAT THEY ALLOW USERS TO
ACCESS ANOTHER USERS OBJECTS IN A REMOTE DATABASE SO THAT THEY ARE
BOUNDED BY THE PRIVILEGE SET OF THE OBJECTS OWNER.
IN OTHER WORDS , A LOCAL USER CAN ACCESS A REMOTE DATABASE WITHOUT
HAVING TO BE A USER ON THE REMOTE DATABASE.
NOTE:
TYPICALLY, THE DBA IS RESPONSIBLE FOR CREATING THE DATABASE LINK. THE
DICTIONARY VIEW USER_DB_LINKS CONTAINS INFORMATION ON LINKS TO WHICH A
USER HAS ACCESS.
THE EXAMPLE SHOWS A USER SCOTT ACCESSING THE EMP TABLE ON THE REMOTE
DATABASE WITH THE GLOBAL NAME HQ.ACME.COM.

CREATE THE DATABASE LINK:


CREATE PUBLIC DATABASE LINK HQ.ACME.COM
USING SALES;
DATABASE LINK CREATED.
WRITE SQL STATEMENTS THAT USE THE DATABASE LINK:
SELECT * FROM FRED.EMP@HQ.ACME.COM.
THE USING CLAUSE IDENTIFIES THE SERVICE NAME OF A REMOTE DATABASE.
ONCE THE DATABASE LINK IS CREATED, YOU CAN WRITE SQL STATEMENTS AGAINST
THE DATA IN THE REMOTE SITE. IF A SYNONYM IS SET UP, YOU CAN WRITE SQL
STATEMENTS USING THE SYNONYM.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

578

CREATE PUBLIC SYNONYM HQ_EMP FOR EMP@HQ.ACME.COM;


SELECT * FROM HQ_EMP;
YOU CANNOT GRANT PRIVILEGES ON REMOTE OBJECTS.
CORRELATED SUBQUERIES:

CORRELATED SUBQUERIES ARE USED FOR ROW-BY-ROW PROCESSING.


EACH SUBQUERY IS EXECUTED ONCE FOR EVERY ROW OF THE OUTER QUERY.
CORRELATED SUBQUERIES EXECUTION:

1. GET A CANDIDATE ROW(FETCHED BY THE OUTER QUERY).


2. EXECUTE THE INNER QUERY USING THE VALUE OF THE CANDIDATE ROW.
3. USER THE VALUES RESULTING FROM THE INNER QUERY TO QUALIFY OR
DISQUALIFY THE CANDIDATE.
4. REPEAT UNTIL NO CANDIDATE ROW REMAINS.

NESTED SUBQUERY EXECUTION:

THE INNER QUERY EXECUTES FIRST AND FINDS A VALUE.


THE OUTER QUERY EXECUTES ONCE,USING THE VALUE FROM THE INNER QUERY.
THE ORACLE SERVER PERFORMS A CORRELATED SUBQUERY WHEN THE SUBQUERY
REFERENCES A COLUMN FROM A TABLE REFERRED TO IN THE PARENT STATEMENT.
A CORRELATED SUBQUERY IS EVALUATED ONCE FOR EACH ROW PROCESSED
BY THE PARENT STATEMENT.
THE PARENT STATEMENT CAN BE A SELECT,UPDATE OR DELETE STATEMENT.
FIND ALL EMPLOYEES WHO EARN MORE THAN THE AVERAGE SALARY IN THEIR IN
THEIR DEPARTMENETS.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

579

SELECT ENAME,SAL,DEPTNO FROM EMP A


WHERE SAL < (SELECT AVG(SAL) FROM EMP B WHERE B.DEPTNO=A.DEPTNO);

CORRELATED UPDATE:

SQL> CREATE TABLE EMP_D


2 AS
3 SELECT * FROM EMP;
Table created.
SQL> DESC EMP_D
Name
Null? Type
----------------------------------------------------- -------- -----------------------------------EMPNO
NUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NUMBER(2)
SQL> ALTER TABLE EMP_D
2 ADD DNAME VARCHAR2(11);
Table altered.
SQL> UPDATE EMP_D E
2 SET DNAME=(SELECT DNAME FROM DEPT D
3 WHERE E.DEPTNO=D.DEPTNO);
14 rows updated.
SQL> SELECT EMPNO,ENAME,DEPTNO,DNAME FROM EMP_D;
EMPNO ENAME
DEPTNO DNAME
---------- ---------- ---------- ----------7369 SMITH
20 RESEARCH
7499 ALLEN
30 SALES
7521 WARD
30 SALES

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER

580

20 RESEARCH
30 SALES
30 SALES
10 ACCOUNTING
20 RESEARCH
10 ACCOUNTING
30 SALES
20 RESEARCH
30 SALES
20 RESEARCH
10 ACCOUNTING

14 rows selected.
CORRELATED DELETE:

SQL> CREATE TABLE EMP_PRESENT


2 AS
3 SELECT * FROM EMP;
Table created.
SQL> CREATE TABLE EMP_PAST
2 AS
3 SELECT * FROM EMP;
Table created.
SQL> DELETE FROM EMP_PAST
2 WHERE EMPNO IN (7369,7782,7839,7844,7788);
5 rows deleted.

SQL> SELECT * FROM EMP_PAST;


EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
300
7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
7566 JONES
MANAGER
7839 02-APR-81
2975
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
1400

I Soft Solutions ,Bang-54.

DEPTNO
30
30
20
30

STRUCTURED QUERY LANGUAGE

ORACLE

581

7698 BLAKE
MANAGER
7839 01-MAY-81
7876 ADAMS
CLERK
7788 23-MAY-87
7900 JAMES
CLERK
7698 03-DEC-81
7902 FORD
ANALYST
7566 03-DEC-81
7934 MILLER CLERK
7782 23-JAN-82

2850
1100
950
3000
1300

30
20
30
20
10

9 rows selected.
SQL> SELECT * FROM EMP_PRESENT;
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80
800
20
7499 ALLEN
SALESMAN
7698 20-FEB-81
1600
300
30
7521 WARD
SALESMAN
7698 22-FEB-81
1250
500
30
7566 JONES
MANAGER
7839 02-APR-81
2975
20
7654 MARTIN SALESMAN
7698 28-SEP-81
1250
1400
30
7698 BLAKE
MANAGER
7839 01-MAY-81
2850
30
7782 CLARK
MANAGER
7839 09-JUN-81
2450
10
7788 SCOTT ANALYST
7566 19-APR-87
3000
20
7839 KING
PRESIDENT
17-NOV-81
5000
10
7844 TURNER SALESMAN
7698 08-SEP-81
1500
0
30
7876 ADAMS
CLERK
7788 23-MAY-87
1100
20
7900 JAMES
CLERK
7698 03-DEC-81
950
30
7902 FORD
ANALYST
7566 03-DEC-81
3000
20
7934 MILLER CLERK
7782 23-JAN-82
1300
10
14 rows selected.
SQL> DELETE FROM EMP_PRESENT E
2 WHERE EMPNO=
3 (SELECT EMPNO FROM EMP_PAST M WHERE M.EMPNO=E.EMPNO);
9 rows deleted.
SQL> SELECT * FROM EMP_PRESENT;
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------7369 SMITH
CLERK
7902 17-DEC-80 800
20
7782 CLARK
MANAGER
7839 09-JUN-81 2450
10
7788 SCOTT ANALYST
7566 19-APR-87 3000
20
7839 KING
PRESIDENT
17-NOV-81 5000
10
7844 TURNER SALESMAN
7698 08-SEP-81
500
0
30
CONTROLLING USER ACCESS:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

582

IN A MULTI USER ENVIRNOMENT, YOU WANT TO MAINTAIN SECURITY OF THE


DATABASE ACCESS AND USE. WITH THE ORACLE SERVER DATABASE SECURITY , YOU
CAN DO THE FOLLOWING:
CONTOL DATABASE ACCESS.
GIVE ACCESS TO SPECIFIC OBJECTS IN THE DATABASE.
DATABASE SECURITY CAN BE CLASSIFIED INTO TWO CATEGORIES:
SYSTEM SECURITY.
DATA SECURITY.
SYSTEM SECURITY COVERS ACCESS AND USE OF THE DATABASE AT SYSTEM
LEVEL,SUCH AS USERNAME AND PASSWORD,DISK SPACE ALLOCATED TO USERS, AND
SYSTEM OPERATIONS ALLOWED BY THE USER.
DATABASE SECURITY COVERS ACCESS AND USE OF THE DATBASE OBJECTS AND THE
ACTIONS THAT THOSE USERS CAN HAVE ON THE OBJECTS.
PRIVILEGES ARE THE RIGHT TO EXECUTE PARTICULAR SQL STATEMENTS.THE
DATABASE ADMINISTRATOR IS A HIGH LEVEL USER WITH THE ABILITY TO GRANT
USERS ACCESS TO THE DATABASE AND ITS OBJECTS. THE USERS REQUIRE SYSTEM
PRIVILEGES TO GAIN ACCESS TO THE DATABASE AND OBJECT PRIVILEGES TO
MANIPULATE THE CONTENT OF THE OBJECTS IN THE DATABASE. USERS CAN ALSO BE
GIVEN THE PRIVILEGE TO GRANT ADDITIONAL PRIVILEGES TO OTHER USERS OR
ROLES, WHICH ARE NAMED GROUPS OF RELATED PRIVILEGES.
SCHEMA:
A SCHEMA IS A COLLECTION OF OBJECTS,SUCH AS TABLES,VIEWS, AND SEQUENCES.
THE SCHEMA IS OWNED BY A DATABASE USER AND HAS THE SAME NAME AS THAT
USER.
PRIVILEGES: 1.SYSTEM PRIVILEGS. 2. OBJECT PRIVILEGES.

SYSTEM PRIVILEGES:
GAIN ACCESS TO THE DATABASE. SYSTEM PRIVILEGES TYPICALLY ARE PROVIDED BY
THE DATABASE ADMINISTRATOR.THE DBA HAS HIGH LEVEL SYSTEM PRIVILEGES:
CREATE USERS,REMOVE TABLES,BACK UP TABLES.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

583

OBJECT PRIVILEGES:MANIPULATES THE CONTENTS OF THE DATABASE OBJECTS.


CREATING USERS:

THE DBA CREATES USERS BY USING THE CREATE USER STATEMENT.


SQL> CREATE USER PAVAN
2 IDENTIFIED BY GAYATRI;
User created.
AT THIS POINT USER DOES NOT HAVE ANY PRIVILEGES.THE DBA THEN GRANT THE
NUMBER OF PRIVILEGES TO THAT USER.THESE PRIVILEGES DETERMINE WHAT THE
USER CAN DO AT THE DATABASE LEVEL.
ONCE A USER IS CREATED, THE DBA CAN GRANT SPECIFIC SYSTEM PRIVILEGES TO
USER.AN APPLICATION DEVELOPER MAY HAVE THE FOLLOWING SYSTEM
PRIVILEGES.
CREATE SESSION
CREATE TABLE
CREATE SEQUENCE
CREATE VIEW
CREATE PROCEDURE.

SQL> GRANT CREATE SESSION,CREATE


VIEW,CREATE PROCEDURE TO PAVAN;
Grant succeeded.

TABLE,CREATE

SEQUENCE,CREATE

GRANTING PRIVILEGES WITH THE PERMISSION TO GRANT TO OTHER


USERS:
SQL> GRANT CREATE SESSION,CREATE
VIEW,CREATE PROCEDURE TO PAVAN
WITH ADMIN OPTION:

TABLE,CREATE

SEQUENCE,CREATE

Grant succeeded.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

584

THE DBA CREATES USER ACCOUNT YOU CAN CHANGE THE PASSWORD.
SQL> ALTER USER PAVAN
2 IDENTIFIED BY GAYATRI;
User altered.
ROLES:
A ROLE IS A NAMED GROUP OF RELATED PRIVILEGES THAT CAN BE GRANTED TO THE
USER.THIS METHOD MAKES GRANTING AND REVOKING PRIVILEGES EASIER TO
PERFORM AND MAINTAIN.FIRST,THE DBA MUST CREATE ROLE.THEN THE DBA CAN
ASSIGN PRIVILEGES TO THE ROLE AND USERS TO THE ROLE.
SQL> CREATE ROLE MANAGER;
Role created.
SQL> GRANT CREATE SESSION,CREATE
VIEW,CREATE PROCEDURE TO MANAGER;
Grant succeeded.

TABLE,CREATE

SEQUENCE,CREATE

SQL> GRANT MANAGER TO SCOTT,SATISH;


Grant succeeded.
ORACLE PREDIFINES SEVERAL OTHER ROLES,WHICH INCLUDES COMMON SYSTEM
PRIVILEGES.THE PREDIFINED ORACLE USER SYSTEM IS AUTOMATICALLY GRANTED
ALL THESE ROLES.
CONNECT: ALTER SESSION,CREATE CLUSTER,CREATE DATABASE LINK,
CREATE SEQUENCE,CREATE SESSION,CREATE SYNONYM,CREATE TABLE,
CREATE VIEW.
RESOURCE:CREATE CLUSTER,CREATE SEQUENCE,CREATE INDEX TYPE,
CREATE OPERATOR,CREATE PROCEDURE,CREATE TYPE,
CREATE TRIGGER,CREATE TABLE.
DBA : ALL SYSTEM PRIVILEGS WITH ADMIN OPTION PLUS EXP_FULL_DATABASE AND
IMP_FULL_DATABASE.
OBJECT PRIVILEGES:
AN OBJECT PRIVILEGES IS A PRIVILEGE OR RIGHT TO PERFORM A PARTICULAR
ACTION ON A SPECIFIC TABLE,VIEW,SEQUENCE OR PROCEDURE.
OBJECT
PRIVILEGE
ALTER

TABLE
YES

I Soft Solutions ,Bang-54.

VIEW

SEQUENCE

PROCEDURE

YES

STRUCTURED QUERY LANGUAGE

ORACLE
DELETE
EXECUTE
INDEX
INSERT
REFERENCES
SELECT
UPDATE

YES

585

YES
YES

YES
YES
YES
YES
YES

YES
YES
YES

YES

OBJECT PRIVILEGES VARY FROM OBJECT TO OBJECT. AN OWNER HAS ALL THE
PRIVILEGES ON THE OBJECT.AN OWNER CAN GIVE SPECIFIC PRIVILEGES ON THAT
OWNERS OBJECT.
SQL> GRANT SELECT ON EMP TO PAVAN,GAYATRI;
Grant succeeded.
GIVING SPECIFIC COLUMNS PERMISSION:

SQL> GRANT UPDATE(DNAME,LOC)


2 ON DEPT
3 TO PAVAN,GAYATRI;
Grant succeeded.
GIVING PERMISSION ON TABLE WITH GRANT OPTION:

SQL> GRANT SELECT,INSERT


2 ON DEPT
3 TO GAYATRI
4 WITH GRANT OPTION;
Grant succeeded.
GIVING PERMISSION ON TABLE TO ALL USERS:

SQL> GRANT SELECT ON EMP


2 TO PUBLIC;
Grant succeeded.
GIVING ALL THE PRIVILEGES ON TABLE TO USER:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

586

SQL> GRANT ALL ON EMP TO GAYATRI;


Grant succeeded.
REVOKEING PERMISSIONS:

SQL> REVOKE SELECT ON EMP FROM PAVAN,GAYATRI;


Revoke succeeded.

IF YOU WANT TO REVOKE COLUMN SPECIFIC PERMISSIONS WE HAVE TO


REVOKE FROM TABLE NOT FROM COLUMN.

SQL> REVOKE UPDATE(DNAME,LOC)


2 ON DEPT
3 FROM PAVAN,GAYATRI;
REVOKE UPDATE(DNAME,LOC)
*
ERROR at line 1:
ORA-01750: UPDATE/REFERENCES may only be REVOKEd from the whole table, not by column
SQL> REVOKE UPDATE ON DEPT
2 FROM PAVAN,GAYATRI;
Revoke succeeded.
SQL> REVOKE SELECT,INSERT
2 ON DEPT
3* FROM GAYATRI;
Revoke succeeded.
YOU CANNOT REVOKE PRIVILEGES THAT YOU HAD NOT GRANT BEFORE.
SQL> REVOKE SELECT,INSERT
*
ERROR at line 1:
ORA-01927: cannot REVOKE privileges you did not grant
SQL> REVOKE SELECT ON EMP
2 FROM PUBLIC;
Revoke succeeded.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

587

SQL> REVOKE ALL ON EMP FROM GAYATRI;


Revoke succeeded.

DESCRIBE TABLES OWNED BY THE USER:

SELECT * FROM USER_TABLES;

VIEW DISTINCT OBJECT TYPES OWNED BY THE USER:

SELECT DISTINCT OBJECT_TYPE FROM USER_OBJECTS;


VIEW TABLES,VIEWS,SYNONYMS AND SEQUENCES OWNED BY THE
USER:

SELECT * FROM USER_CATALOG;


USER_CATALOG HAS A SYNONYM CALLED CAT.
TABLES IN THE ORACLE DATABASE:
USER TABLES:

COLLECTION OF TABLES CREATED AND MANTAINED BY THE USER.


CONTAINS USER INFORMATION.
DATA DICTIONARY:
COLLECTION OF TABLES CREATED AND
SERVER,CONTAINS DATABASE INFORMATION.

I Soft Solutions ,Bang-54.

MAINTAINED

BY

THE

ORACLE

STRUCTURED QUERY LANGUAGE

ORACLE

588

ALL THE DATA DICTIONARY TABLES ARE OWNED BY THE SYS USER. THE BASE
TABLES ARE RARELY ACCESSED BY THE USER BECAUSE THE INFORMATION IN THEM
IS NOT EASY TO UNDERSTAND.THEREFORE,USER TYPICALLY ACCESS DATA
DICTIONARY VIEWS BECAUSE THE INFORMATION IS PRESENTED IN A FORMAT THAT
IS EASY TO UNDERSTAND.INFORMATION STORED IN THE DATA DICTIONARY INCLUDE
NAMES OF THE ORACLE SERVER USERS,PRIVILEGES GRANTED TO USERS.DATABASE
OBJECT NAMES,TABLE CONSTRAINTS, AND AUDITING INFORMATION.
THERE ARE FOUR CATEGORIES OF DATA DICTIONARY VIEWS:
USER_
USER.

THESE VIEWS CONTAIN INFORMATION ABOUT OBJECTS OWNED BY THE

ALL_
THESE VIEWS CONTAIN INFORMATION ABOUT ALL THE TABLES ACCESSIBLE
TO THE USER.
DBA_
THESE VIEWS ARE RESTRICTED VIEWS. ONLY DBA OR ROLE DBA WHO HAS
CAN ACCESS THESE.
V$_ THESE VIEWS CONTAINS INFORMATION ABOUT DYNAMIC PERFORMANCE
VIEWS,DATABASE SERVER PERFORMANCE AND LOCKING.
PL/SQL SECURITY:
USERS MANIPULATE ORACLE TABLE DATA VIA SQL OR PL/SQL SENTENCES.
AN ORACLE TRANSACTION CAN BE MADE UP OF A SINGLE SQL SENTENCE OR
SEVERAL SQL SENTENCES.
THIS GIVE RISE TO SINGLE QUERY TRASACTIONS AND MULTIPLE QUERY
TRANSACTIONS.(I.E., SQT AND MQT).
THESE TRANSACTIONS (WHETHER SQT OR MQT) ACCESS AN ORACLE TABLE(S).SINCE
ORACLE WORKS ON A MULTI-USER PLATFORM ,IT IS MORE THAN LIKELY THAT
SEVERAL PEOPLE WILL ACCESS DATA EITHER FOR VIEWING OR FOR MANIPULATING
(INSERTING,UPDATING AND DELETING RECORDS) FROM THE SAME TABLES AT THE
SAME TIME VIA DIFFERENT SQL STATEMENTS.
THE ORACLE TABLE IS THEREFORE A GLOBAL RESOURCE. i.e., IT IS SHARED BY
SEVERAL USERS.
TABLES(i.e.. GLOBAL RESOURCE) CONTAIN VALUABLE DATA ON WHICH BUSSINESS
DECISIONS ARE BASED. THERE IS A DEFINITE NEED TO ENSURE THAT THE INTEGRITY
OF DATA IN A TABLE IS MAINTAINED EACH TIME THAT ITS DATA IS ACCESSED.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

589

THE ORACLE ENGINE HAS TO ALLOW SIMULTANEOUS ACCESS TO TABLE DATA


WITHOUT CAUSING DAMAGE TO THE DATA.
THE TECHNIQUE EMPLOYED BY THE ORACLE ENGINE TO PROTECT TABLE DATA
WHEN SEVERAL PEOPLE ARE ACCESSING IT IS CALLED CONCURRENCY CONTROL.
ORACLE USES A METHOD CALLED LOCKING TO IMPLEMENT CONCURRENCY
CONTROL WHEN MULTIPLE USERS ACCESS A TABLE TO MANIPULATE ITS DATA AT
THE SAME TIME.
LOCKS ARE MECHANISMS USED TO ENSURE DATA INTEGRITY WHILE ALLOWING
MAXIMUM CONCURRENT ACCESS TO DATA.
ORACLES LOCIING IS FULLY AUTOMATIC AND REQUIRES NO USER INTERVENTION.
THE ORACLE ENGINE AUTO MATICALLY LOCKS TABLE DATA WHILE EXECUTING SQL
STATEMENTS.
THIS TYPE OF LOCKING IS CALLED IMPLICIT LOCKING.
IMPLICIT LOCKING:
SINCE THE ORACLE ENGINE HAS FULLY AUTOMATIC LOCKING STRATEGY, IT HAS TO
DECIDE ON TWO ISSUES:
TYPE OF LOCK IS TO BE APPLIED.
LEVEL OF LOCK TO BE APPLIED.
TYPES OF LOCKS:
THE TYPE OF LOCK TO BE PLACED ON A RESOURCE DEPENDS ON THE OPERATION
BEING PERFORMED ON THAT RESOURCE.
OPERATIONS ON TABLES CAN BE DISTINCTLY GROUPED INTO THE
FOLLOWING TWO CATEGORIES:
READ OPERATIONS : SELECT STATEMENTS.
WRITE OPERATIONS: INSERT, UPDATE,DELETE STATEMENTS.
SINCE READ OPERATIONS MAKE NO CHANGES TO DATA IN A TABLE AND ARE MEANT
ONLY FOR VIEWING PURPOSES,SIMULTANEOUS READ OPERATIONS CAN BE
PERFORMED ON A TABLE WITHOUT ANY DANGER TO THE TABLES DATA.
HENCE,THE ORACLE ENGINE PLACES A SHARED LOCK ON A TABLE WHEN ITS DATA IS
BEING VIEWED.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

590

ON THE OTHER HAND, WRITE OPERATIONS CAUSE A CHANGE IN TABLE DATA i.e., ANY
INSERT,UPDATE OR DELETE STATEMENT AFFECTS TABLE DATA DIRECTLY AND
HENCE,SIMULTANEOUS WRITE OPERATIONS CAN ADVERSLY AFFECT TABLE DATA
INTEGRITY.
SIMULTANEOUS WRITE OPERATION WILL CAUSE LOSS OF DATA CONSISTENCY
IN THE TABLE.
HENCE ORACLE ENGINE PLACES AN EXCLUSIVE LOCK ON TABLE OR SPECIFIC
SECTIONS OF THE TABLESS RESOURCES WHEN DATA IS BEGING WRITTEN TO A
TABLE.
THE RULES OF LOCKING:
DATA BEING CHANGED CANNOT BE READ.
WRITERS WAIT FOR OTHER WRITERS, IF THEY ATTEMPT TO UPDATE THE SAME ROWS
AT THE SAME TIME.
THE TWO TYPES OF LOCKS SUPPORTED BY ORACLE ARE:
SHARED LOCKS:
SHARED LOCKS ARE PLACED
OPERATION(SELECT) IS PERFORMED.

ON

RESOURCES

WHENEVER

READ

MULTIPLE SHARED LOCKS CAN BE SIMULTANEOUSLY SET ON A RESOURCE.

EXCLUSIVE LOCKS:
EXCLUSIVE LOCKS ARE PLACED ON RESOURCES WHENEVER WRITE OPERATIONS
(INSERT,UPDATE AND DELETE) ARE PERFORMED.
ONLY ONE EXCLUSIVE LOCK CAN BE PLACED ON A RESOURCE AT A TIME.
i.e., THE FIRST USER WHO ACQURIES AN EXCLUSIVE LOCK WILL CONTINUE TO HAVE
THE SOLE OWNERSHIP OF THE RESOURCE, AND NO OTHER USER CAN ACQUIRE AN
EXCLUSIVE LOCK ON THAT RESOURCE.
ORACLE PROVIDES THE FOLLOWING THREE LEVELS OF LOCKING:
ROW LEVEL.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

591

PAGE LEVEL.
TABLE LEVEL.

THE ORACLE ENGINE DECIDES ON THE LEVEL OF LOCK TO BE USED BY THE


PRESENCE OR ABSENCE OF A WHERE CONDITION IN A SQL STATEMENT.
IF THE WHERE CLAUSE EVALUATES TO ONLY ONE ROW IN THE TABLE, A ROW LEVEL
LOCK IS USED.
IF THE WHERE CLAUSE EVALUATES TO A SET OF DATA, A PAGE LEVEL LOCK IS USED.
IF THERE IS NO WHERE CLAUSE,(i.e., THE QUERY ACCESSES THE ENTIRE TABLE,) A
TABLE LEVEL LOCK IS USED.
ALTHOUGH THE ORACLE ENGINE HAS A DEFAULT LOCKING STRATERGY IN
COMMERCIAL APPLICATIONS, EXPLICIT USER DEFINED LOCKING OFTEN REQUIRED.
IF TWO CLIENT COMPUTERS(CLIENT A AND CLIENT B) ARE ENTERING SALES ORDERS,
EACH TIME A SALES ORDER IS PREPARED, THE QUANTITY ON HAND OF THE
PRODUCT FOR WHICH THE ORDER IS BEING GENERATED NEEDS TO BE UPDATED IN
THE PRODUCT_MASTER TABLE.
NOW, IF THE CLIENT A FIRES AN UPDATE COMMAND ON A RECORD IN THE
PRODUCT_MASTER TABLE, THEN ORACLE WILL IMPLICITLY LOCK THE RECORD SO
THAT NO FURTHER DATA MANIPULATION CAN BE DONE BY ANY OTHER USER TILL
THE LOCK IS RELEASED.
THE LOCK WILL BE RELEASED ONLY WHEN CLIENT A FIRES A COMMIT OR
ROLLBACK.
IN THE MEANTIME , IF CLIENT B TRIES TO VIEW THE SAME RECORD, THE ORACLE
ENGINE WILL DISPLAY THE OLD SET FOR VALUES FOR THE RECORD AS THE
TRANSACTION FOR THAT RECORD HAS BEEN COMPLETED BY CLIENT A.
THIS LEADS TO WRONG INFORMATION BEING DISPLAYED TO CLIENT B.
IN SUCH CASES, CLIENT A MUST EXPLICITLY LOCK THE RECORD SUCH THAT, NO
OTHER USER CAN ACCESS THE RECORD EVEN FOR VIEWING PURPOSES TILL CLIENT
AS TRANSACTION IS COMPLETED.
A LOCK SO DEFINED IS CALLED EXPLICIT LOCK. USER DEFINED EXPLICIT LOCKING
ALWAYS OVERRIDES ORACLES DEFAULT LOCKING STRATEGY.
EXPLICIT LOCKING:

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

592

THE TECHNIQUE OF LOCK TAKEN ON A TABLE OR ITS RESOURCES BY A USER IS


CALLED EXPLICIT LOCKING.
WHO CAN LOCK EXPLICITLY:
USER CAN LOCK TABLES THEY OWN OR ANY TABLES ON WHICH THEY HAVE BEEN
GRANTED TABLE PRIVILEGES(SUCH AS SELECT,INSERT,UPDATE,DELETE).
ORACLE PROVIDES FACILITIES BY WHICH DEFAULT LOCKING STRATEGY CAN BE
OVERRIDEN.
TABLES OR ROWS CAN BE EXPLICITLY LOCKED BY USING EITHER THE SELECT FOR
UPDATE STATEMENT, OR LOCK TABLE STATEMENT.
THE SELECT . FOR UPDATE STATEMENT.
TWO CLIENT MACHINES CLIENT A AND CLIENT B ARE RECORDING THE
TRANSACTIONS PERFORMED IN A BANK FOR A PARTICULAR ACCOUNT NUMBER
SIMULTANEOUSLY.
CLIENT A FIRES THE FOLLOWING SELECT STATEMENT:
CLIENT A > SELECT * FROM ACCT_MSTR WHERE ACC_NO = SB9 FOR UPDATE.
ORACLE LOCKS THE RECORD SB9. IT RELEASES WHEN A COMMIT OR ROLLBACK IS
FIRED BY CLIENT A.
NOW CLIENT B FIRES THE SELECT STATEMENT, WHICH POINTS TO RECORD SB9,
WHICH IS ALREADY LOCKED BY CLIENT A.
CLIENT B> SELECT * FROM ACCT_MSTR WHERE ACC_NO = SB9 FOR UPDATE;
THE ORACLE ENGINE WILL ENSURE THAT CLIENT BS SQL STATEMENT WAITS FOR
THE LOCK TO BE RELEASED ON ACC_MSTR BY A COMMIT OR ROLLBACK STATEMENT
FIRED BY CLIENT A FOREVER.
IN ORDER TO AVOID UNNECESSARY WAITING TIME, A NOWAIT OPTION CAN BE USED
TO INFORM THE ORACLE ENGINE TO TERIMINATE THE SQL STATEMENT IF THE
RECORD HAS BEEN LOCKED.
IF THIS HAPPENS THE ORCLE ENGINE TERIMINATES THE RUNNING DML AND COMES
UP WITH A MESSAGE INDICATING THAT THE RESOURCE IS BUSY.
IF CLIENT B FIRES THE FOLLOWING SELECT STATEMENT NOW WITH NOWAIT CLAUSE.
CLIENT B> SELECT * FROM ACCT_MSTR WHERE ACC_NO = SB9 FOR UPDATE
NOWAIT;

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

593

OUTPUT:
SINCE CLIENT A HAS ALREADY LOCKED RECORD SB9 WHEN CLIENT B TRIES TO
ACQUIRE A SHARED LOCK ON THE SAME RECORD THE ORACLE ENGINE DIPLAYS THE
FOLLOWING MESSAGE.
SQL> 00054: RESOURCE BUSY AND ACQUIRE WITH NOWAIT SPECIFIED.
USING LOCK TABLE STATEMENT:
LOCK TABLE < TABLE NAME> [, < TABLE NAME].
IN { ROW SHARE|ROW EXCLUSIVE |SHARE UPDATE|SHARE|SHARE ROW EXCLUSIVE |
EXCLUSIVE}
[NO WAIT]

TABLE PARTITIONS:
TABLES CAN BE PARTITIONED AND STORED IN DIFFERENT LOCATIONS AS PER
REQUIREMENT.
A SINGLE LOGICAL TABLE CAN BE SPILT IN TO A NUMBER OF PHYSICALLY SEPARATE
PIECES BASED ON RANGES OF KEY VALUES.
EACH OF THE PARTS OF THE TABLE IS CALLED A PARTITION.
ALTHOUGH THE PARTITIONS ARE HELD AND MANAGED INDEPENDENTLY, THEY CAN
BE QUERIED AND UPDATED BY REFERENCE TO THE NAME OF THE LOGICAL TABLE.
ORACLE PROVIDES PARTITION TRANSPARENCY. THE APPLICATION COULD BE
UNAWARE OF THE FACT THAT THE TABLE HAS BEEN PARTITIONED.
THERE IS A DIFFERENCE BETWEEN A TABLE , WHICH HAS A SINGLE PARTITION, AND A
TABLE THAT HAS NO PARTITIONS. A NON-PARTITIONED TABLE CANNOT PARTITIONED
LATER.EACH PARTITION IS STORED IN A DIFFERENT SEGMENT AND HAS DIFFERENT
PHYSICAL ATTRIBUTES.
TABLE PARTITIONS CAN BE STORED IN DIFFERENT TABLE SPACES.
ORACLE PROVIDES PARTITION INDEPENDENCE.
WE CAN ACCESS AND MANIPULATE DATA IN ONE PARTITION EVEN IF SOME OR ALL
OF THE OTHER PARTITION ARE UNAVAILABLE.
THIS IS MAJOR BENEFIT FOR ADMINISTRATORS AND USERS.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

594

THIS MEANS THAT THEY CAN PERFORM MAINTENANCE OPERATIONS IN A PIECE


MEAL FASHION AGAINST INDIVIDUAL PARTITIONS WHILE THE REST OF THE DATA
REMAINS AVAILABLE FOR USE.
ADVANTAGES:
IT REDUCES THE POSSIBILITY OF DATA CORRUPTION INMULTIPLE PARTITIONS.
BACK UP AND RECOVERY OF EACH PARTITION CAN BE DONE INDEPENDENTLY.
CONTROLLING THE MAPPING OF PARTITIONS TO DISK DRIVES(IMPORTANT FOR
BALANCING I/O LOAD) IS POSSIBLE.
PARTITIONED TABLES CANNOT CONTAIN ANY COLUMNS WITH LONG OR LONG RAW
DATATYPES, LOB DATATYPES (BLOB,CLOB,NCLOB, OR BFILE) OR OBJECT TYPES.
THERE ARE TWO PRIMARY REASONS FOR PARTITIONING A TABLE.
DISK SPACE.
PROCESSING TIME.
CREATE TABLE TABLE_NAME
(COL1 DATATYPE,
COL 2 DATATYPE,
.
) PARTITION BY RANGE (COL_NAME)
(PARTITION < PARTITION_NAME> VALUES LESS THAN <VALUE>,
PARTITION < PARTITION_NAME > VALUE LESS THAN < VALUE>);

1 CREATE TABLE ANGEL


2 (EMPNO NUMBER(10) CONSTRAINT ANGEL_PK PRIMARY KEY,
3 ENAME VARCHAR2(10),
4 JOB VARCHAR2(10))
5 PARTITION BY RANGE (EMPNO)
6* (PARTITION EM1 VALUES LESS THAN (10),
PARTITION EM2 VALUES LESS THAN (20))

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

595

SQL> /
Table created.

SQL> INSERT INTO ANGEL


2 VALUES
3 (1,'PAVAN','MANAGER');
1 row created.
1 INSERT INTO ANGEL
2 VALUES
3* (2,'KUMAR','MANAGER')
SQL> /
1 row created.
1 INSERT INTO ANGEL
2 VALUES
3* (11,'SMITH','MANAGER')
SQL> /
1 row created.
1 INSERT INTO ANGEL
2 VALUES
3* (12,'ALLEN','CLERK')
SQL> /
1 row created.
1 INSERT INTO ANGEL
2 VALUES
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

596

3* (10,'ARYA','CLERK')
SQL> /
1 row created.
SQL> COMMIT;
Commit complete.
SQL> SELECT * FROM ANGEL PARTITION(EM1);
EMPNO ENAME
JOB
---------- ---------- ---------1 PAVAN
MANAGER
2 KUMAR
MANAGER
SQL> SELECT * FROM ANGEL PARTITION(EM2);
EMPNO ENAME
JOB
---------- ---------- ---------11 SMITH MANAGER
12 ALLEN
CLERK
10 ARYA
CLERK

1 CREATE TABLE ANGEL2


2 (ORDERNO VARCHAR2(10) CONSTRAINT ANGEL2_PK PRIMARY KEY,
3 ODATE DATE,
4 VENCODE VARCHAR2(10))
5 PARTITION BY RANGE (ORDERNO,VENCODE)
6 (PARTITION OM1 VALUES LESS THAN ('O010','VO10'),
7 PARTITION OM2 VALUES LESS THAN ('O020','V020'),
8* PARTITION OM3 VALUES LESS THAN (MAXVALUE,MAXVALUE))
SQL> /
Table created.
SQL> INSERT INTO ANGEL2

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

597

2 VALUES
3 ('O001','23-FEB-99','V001');
1 row created.
1 INSERT INTO ANGEL2
2 VALUES
3* ('O002','23-FEB-99','V002')
SQL> /
1 row created.
1 INSERT INTO ANGEL2
2 VALUES
3* ('O015','23-FEB-99','V002')
SQL> /
1 row created.

1 INSERT INTO ANGEL2


2 VALUES
3* ('O025','23-FEB-99','V002')
SQL> /
1 row created.
1 INSERT INTO ANGEL2
2 VALUES
3* ('O026','23-FEB-99','V002')
SQL> /
1 row created.
I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

598

1 INSERT INTO ANGEL2


2 VALUES
3* ('O027','23-FEB-99','V002')
SQL> /
1 row created.
SQL> COMMIT;
Commit complete.

1* SELECT * FROM ANGEL2 PARTITION(OM1)


SQL> /
ORDERNO ODATE VENCODE
---------- --------- ---------O001
23-FEB-99 V001
O002
23-FEB-99 V002
1* SELECT * FROM ANGEL2 PARTITION(OM2)
SQL> /
ORDERNO ODATE VENCODE
---------- --------- ---------O015
23-FEB-99 V002
1* SELECT * FROM ANGEL2 PARTITION(OM3)
SQL> /
ORDERNO ODATE VENCODE
---------- --------- ---------O025
23-FEB-99 V002
O026
23-FEB-99 V002
O027
23-FEB-99 V002
HERE THE VALUES O025,O026,O027 ARE GREATER THAN FIRST AND SECOND
PARTITION, BUT VENCODE VALUE IS FALLS IN THE FIRST PARTITION. EVEN THEN IT

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

599

FALLS IN THIRD PARTITION BECAUSE THE LEFT PREFIX OF THE PARTITION BOUND
TAKES PRECEDENCE.
MAINTAINING PARTITIONS:
MOVING PARTITIONS.
ADDING PARTITIONS.
DROPPING PARTITIONS.
SPLITTING PARTITIONS.
EXCHANGING TABLE PARTITIONS.
MOVING PARTITIONS:
SQL> ALTER TABLE ANGEL2
2 MOVE PARTITION OM1 TABLESPACE PAVAN_TAB;
Table altered.

SQL> SELECT * FROM ANGEL2 PARTITION(OM1);


ORDERNO ODATE VENCODE
---------- --------- ---------O001
23-FEB-99 V001
O002
23-FEB-99 V002
ADDING PARTITIONS:
SQL> ALTER TABLE ANGEL
2 ADD PARTITION EM3 VALUES LESS THAN (30);
Table altered.
SPLITTING PARTITIONS:
SQL> ALTER TABLE ANGEL
2 SPLIT PARTITION EM3 AT(25) INTO (PARTITION EM11, PARTITION EM12);

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

600

Table altered.
SQL> INSERT INTO ANGEL
2 VALUES
3 (21,'FORD','MANAGER');
1 row created.
1 INSERT INTO ANGEL
2 VALUES
3* (22,'DON','MANAGER')
SQL> /
1 row created.
1 INSERT INTO ANGEL
2 VALUES
3* (26,'FRANK','MANAGER')
SQL> /
1 row created.
1 INSERT INTO ANGEL
2 VALUES
3* (28,'SCOTT','MANAGER')
SQL> /
1 row created.
SQL> COMMIT;
Commit complete.
SQL> SELECT * FROM ANGEL PARTITION(EM3);
SELECT * FROM ANGEL PARTITION(EM3)
*
ERROR at line 1:
ORA-02149: Specified partition does not exist

1* SELECT * FROM ANGEL PARTITION(EM11)


SQL> /
EMPNO ENAME
JOB
---------- ---------- ---------I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE
21 FORD
22 DON

601

MANAGER
MANAGER

1* SELECT * FROM ANGEL PARTITION(EM12)


SQL> /
EMPNO ENAME
JOB
---------- ---------- ---------26 FRANK
MANAGER
28 SCOTT MANAGER
SQL> ALTER TABLE ANGEL
2 DROP PARTITION EM3;
DROP PARTITION EM3
*
ERROR at line 2:
ORA-02149: Specified partition does not exist
SQL> ALTER TABLE ANGEL
2 DROP PARTITION EM2;
Table altered.
SQL> SELECT * FROM ANGEL PARTITION(EM2);
SELECT * FROM ANGEL PARTITION(EM2)
*
ERROR at line 1:
ORA-02149: Specified partition does not exist

CREATING PARTITIONS IN DIFFERENT TABLE SPACES:

SQL> CREATE TABLE ANGEL3


2 (EMPNO NUMBER(10) PRIMARY KEY,
3 ENAME VARCHAR2(10),
4 JOB VARCHAR2(10))
5 PARTITION BY RANGE(EMPNO)
6 (PARTITION EM1 VALUES LESS THAN (10) TABLESPACE PAVAN_TAB,
7 PARTITION EM2 VALUES LESS THAN (20) TABLESPACE PAVAN1_TAB);

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

602

Table created.
EXCHANGING TABLE PARTITIONS

SQL> CREATE TABLE ANGEL4


2 (EMPNO NUMBER(10) PRIMARY KEY,
3 ENAME VARCHAR2(10),
4 JOB VARCHAR2(10))
5 PARTITION BY RANGE(EMPNO)
6 (PARTITION EM1 VALUES LESS THAN (10),PARTITION EM2 VALUES LESS THAN (20));
Table created.
SQL> INSERT INTO ANGEL4
2 VALUES
3 (1,'PAVAN','MANAGER');
1 row created.
1 INSERT INTO ANGEL4
2 VALUES
3* (2,'KUMAR','MANAGER')
SQL> /
1 row created.

1 INSERT INTO ANGEL4


2 VALUES
3* (11,'SMITH','MANAGER')
SQL> /
1 row created.

1 INSERT INTO ANGEL4


2 VALUES
3* (12,'FORD','MANAGER')
SQL> /
1 row created.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

603

1 INSERT INTO ANGEL4


2 VALUES
3* (13,'FRANK','MANAGER')
SQL> /
1 row created.
SQL> COMMIT;
Commit complete.
SQL> CREATE TABLE EXCHANGE_PAR
2 (EMPNO NUMBER(10) PRIMARY KEY,
3 ENAME VARCHAR2(10),
4 JOB VARCHAR2(10));
Table created.
SQL> INSERT INTO EXCHANGE_PAR
2 VALUES
3 (17,'SCOTT','CLERK');
1 row created.
1 INSERT INTO EXCHANGE_PAR
2 VALUES
3* (18,'KING','CLERK')
SQL> /
1 row created.
1 INSERT INTO EXCHANGE_PAR
2 VALUES
3* (19,'JULI','CLERK')
SQL> /
1 row created.
SQL> COMMIT;
Commit complete.

SQL> SELECT * FROM ANGEL4 PARTITION(EM1);


I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

604

EMPNO ENAME
JOB
---------- ---------- ---------1 PAVAN
MANAGER
2 KUMAR
MANAGER
1* SELECT * FROM ANGEL4 PARTITION(EM2)
SQL> /
EMPNO ENAME
JOB
---------- ---------- ---------11 SMITH MANAGER
12 FORD
MANAGER
13 FRANK
MANAGER
SQL> SELECT * FROM EXCHANGE_PAR;
EMPNO ENAME
JOB
---------- ---------- ---------17 SCOTT
CLERK
18 KING
CLERK
19 JULI
CLERK
SQL> ALTER TABLE
EXCHANGE_PAR;

ANGEL4

EXCHANGE

PARTITION

EM2

WITH

TABLE

Table altered.
SQL> SELECT * FROM ANGEL4 PARTITION(EM2);
EMPNO ENAME
JOB
---------- ---------- ---------17 SCOTT
CLERK
18 KING
CLERK
19 JULI
CLERK
SQL> SELECT * FROM EXCHANGE_PAR;
EMPNO ENAME
JOB
---------- ---------- ---------11 SMITH MANAGER
12 FORD
MANAGER
13 FRANK
MANAGER
EXCHANGING TABLE PARTITIONS IS USED CONVERT A PARTITION INTO A NONPARTITIONED TABLE,AND A TABLE INTO A PARTITION OF A PARTITIONED TABLE BY
EXCHANGING THEIR DATA SEGMENTS.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

ORACLE

605

EXCHANGING TABLE PARTITIONS IS MOST USEFUL WHN AN APPLICATION USING


NON-PARTITIONEDTABLES NEED TO BE CONVERTED INTO PARTITIONS OF A
PARTICULAR TABLE.

I Soft Solutions ,Bang-54.

STRUCTURED QUERY LANGUAGE

Das könnte Ihnen auch gefallen