Sei sulla pagina 1di 606

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 OF STRUCTURED QUERY LANGUAGE (SQL) AND


SQL*PLUS:

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.
THE CREATE TABLE STATEMENT.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
2

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.

DELETING DATA IN A TABLE:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
3

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.
DEFINING NULL VALUE.
NVL FUNCTION.
DEFINING A COLUMN ALIASES..
CONCATENATION OPERATOR.
DISTINCT FUNCTION.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
4

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.

JOINS:

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

SET OPERATORS:

UNION ALL.
UNION.
INTERSECT.
MINUS.

GROUP FUNCTIONS AND GROUP BY CLAUSE:

WHAT ARE GROUP FUNCTIONS.


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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
5

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.
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
6

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:

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
7

PL SQL: (PROCEDURAL LANGUAGE AND STRUCTURED QUERY


LANGUAGE):

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:

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
8

%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.
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
9

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,
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
10

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.
DBMS_LOB.
CREATION OF EXTERNAL TABLES.

WORKING WITH COLLECTIONS:

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

DEVELOPMENT AND EXECUTION ENVIRONMENTS:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
11

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.

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 JOB MG HIREDATE SAL COM DEPTN


E R M O
100 PAVAN CHAIRM 01-JAN- 30000 10000 10
AN 2005
101 GAYAT P.S 100 01-JAN- 10000 1000 10
RI 2005
102 BALAJI MANAGE 100 01-JAN- 10000 1000 10
R 2005
103 SMITH MANAGE 100 01-JAN- 10000 1000 10
R 2005

IN ORACLE WE USE TABLES TO STORE DATA.


TABLE CONTAINS COLUMNS AND ROWS.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
12

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).
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
13

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 Null? Type

EMPNO NUMBER(10)
ENAME VARCHAR2(10)
JOB VARCHAR2(10)
MGR NUMBER(10)
HIREDATE DATE
SAL NUMBER(10)
COMM NUMBER(10)
DEPTNO 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.

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);

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
14

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
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 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

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
15

SQL> SELECT * FROM EMPLOYEE_INFO

2 WHERE EMPNO=100;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


--------- ---------- ---------- --------- --------- --------- --------- ---------
100 PAVAN CHAIRMAN 01-JAN-05 30000 10000 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;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
16

2 SET SAL= SAL+1000


3 WHERE EMPNO=100;

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 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.

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
103 SMITH MANAGER 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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
17

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.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
18

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:

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
19

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 SAL COMM DEPTNO


100 PAVAN CHAIRMAN 01-JAN-05 32000 10000 10
101 GAYATRI P.S 100 01-JAN-05 12000 1000 10

I Soft Solutions ,Bang-54. 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 DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7900 JAMES CLERK 7698 03-DEC-81 950 30

TO GET EMPLOYEES WITH THIRD LETTER I:

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

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
23

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
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 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 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.

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
---------

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
25

ANALYST
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
26

3* (NULL,'KUMAR')
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")

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
27

SQL> INSERT INTO EMPLOYEE


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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
31

EMPNO ENAME
---------- ----------
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
32

2 VALUES
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
33

2 (EMPNO NUMBER(10) CONSTRAINT EMPLOYEE_PK PRIMARY KEY,


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),

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
34

CONSTRAINT BANK_CHEK CHECK(BALANCE >=1000));

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));

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
35

Table created.

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
37

Table created.

SQL> SELECT * FROM EMP1;

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.

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
38

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
1 PAVAN MANAGER 7369 01-DEC-81 1000 1000 50
2 KUMAR MANAGER 7369 01-DEC-81 1000 1000 60
3 GAYATRI MANAGER 7369 01-DEC-81 1000 1000 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
39

ACCEPT THAT NUMBER TO ENTER IN TO EMP1 TABLE DEPTNO COLUMN OTHERWISE


RAISE ERROR.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
40

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


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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
41

ALTER TABLE BANK

ADD CONSTRAINT BANK_CH CHECK(BALANCE >=1000) ;

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 FROM


USER_CONSTRAINTS

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 FROM


USER_CONS_COLUMNS

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
42

1 SELECT CONSTRAINT_NAME,COLUMN_NAME,TABLE_NAME FROM


USER_CONS_COLUMNS
2* WHERE TABLE_NAME='EMPLOYEE'
SQL> /

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
43

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.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
44

ALTER TABLE EMPLOYEE


DISABLE CONSTRAINT EMPLOYEE_PK;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
45

1 KUMAR
1 GAYATRI

SQL> DELETE FROM EMPLOYEE


2 WHERE ENAME IN ('KUMAR','GAYATRI');

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 :

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
46

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

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);

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
47

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
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


---------- -------------- -------------

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
48

20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

SQL> SELECT * FROM EMP100;

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
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

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
49

SQL> SELECT * FROM DEPT100;

DEPTNO DNAME LOC


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

SQL> SELECT * FROM EMP100;

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 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7788 SCOTT ANALYST 7566 19-APR-87 3000
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000

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));

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
50

SQL> CREATE TABLE EMP1


2 AS
3 SELECT * FROM EMP;

Table created.

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)

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
51

JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
ADDRESS VARCHAR2(10)
ADDRESS1 VARCHAR2(10)
ADDRESS2 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
52

DROPING COLUMNS:

SQL> ALTER TABLE EMP1


2 DROP COLUMN ADDRESS;

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), MIN(SAL),AVG(SAL),SUM(SAL),STDDEV(SAL),VARIANCE(SAL)


FROM EMP;

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
53

SELECT USER FROM DUAL;

SELECT USERID FROM DUAL;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
54

SQL> SELECT COUNT(DISTINCT(JOB)) FROM EMP;

COUNT(DISTINCT(JOB))
--------------------
5

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
55

23*23
----------
529

SQL> SELECT 2*2 FROM DUAL;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
56

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
1500 1800 1200 450000 5
1100 1400 800 330000 3.66666667
950 1250 650 285000 3.16666667
3000 3300 2700 900000 10
1300 1600 1000 390000 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 SAL COMM


DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7839 KING PRESIDENT 17-NOV-81 5000 10

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
57

1* SELECT * FROM EMP WHERE MGR IS NOT NULL


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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
58

1300 2500

14 rows selected.

HERE BY PUTTING PARANTHESIS THAT OUT IS CORRECT.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
59

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
60

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
61

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.

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
62

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
63

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


SQL> /

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
64

JAMES CLERK
FORD ANALYST
MILLER CLERK

14 rows selected.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
65

14 rows selected.

1* SELECT ENAME||' JOB NAME IS '||JOB FROM EMP


SQL> /

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
66

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


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 DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
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
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10

12 rows selected.

1* SELECT * FROM EMP WHERE SAL >= 1000


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
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
67

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
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10

12 rows selected.

1* SELECT * FROM EMP WHERE SAL <> 1000


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
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 EMP WHERE SAL =950


SQL> /

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7900 JAMES CLERK 7698 03-DEC-81 950 30

SQL> SELECT * FROM EMP WHERE SAL BETWEEN 1000 AND 2000;

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
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
68

7934 MILLER CLERK 7782 23-JAN-82 1300 10

6 rows selected.

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

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 DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7788 SCOTT ANALYST 7566 19-APR-87 3000 20

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


---------- ---------- --------- ---------- --------- ---------- ---------- ----------

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
69

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:

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 DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
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
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

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 DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7876 ADAMS CLERK 7788 23-MAY-87 1100 20

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
70

7934 MILLER CLERK 7782 23-JAN-82 1300 10

AND TRUE FALSE


TRUE TRUE FALSE
FALSE FALSE FALSE
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 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.
OR TRUE FALSE
TRUE TRUE TRUE
FALSE TRUE FALSE

SORTING BY COLUMN ALIAS:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
71

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;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
72

14 rows selected.

1* SELECT EMPNO,ENAME,JOB,SAL,(SAL+NVL(COMM,0)*12) ANSAL FROM EMP ORDER


BY ANSAL DESC
SQL> /

EMPNO ENAME JOB SAL ANSAL


---------- ---------- --------- ---------- ----------
7654 MARTIN SALESMAN 1250 18050
7521 WARD SALESMAN 1250 7250
7499 ALLEN SALESMAN 1600 5200
7839 KING PRESIDENT 5000 5000
7788 SCOTT ANALYST 3000 3000
7902 FORD ANALYST 3000 3000
7566 JONES MANAGER 2975 2975
7698 BLAKE MANAGER 2850 2850
7782 CLARK MANAGER 2450 2450
7844 TURNER SALESMAN 1500 1500
7934 MILLER CLERK 1300 1300
7876 ADAMS CLERK 1100 1100
7900 JAMES CLERK 950 950
7369 SMITH CLERK 800 800

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
73

THERE ARE FIVE TYPES OF JOINS EXISTS IN ORACLE.

CARTESIAN PRODUCT

EQUI-JOIN

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
74

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 LOC


---------- ---------- ---------- -------------- -------------
7934 MILLER 10 RESEARCH DALLAS
7369 SMITH 20 SALES CHICAGO
7499 ALLEN 30 SALES CHICAGO
7521 WARD 30 SALES CHICAGO
7566 JONES 20 SALES CHICAGO
7654 MARTIN 30 SALES CHICAGO
7698 BLAKE 30 SALES CHICAGO
7782 CLARK 10 SALES CHICAGO
7788 SCOTT 20 SALES CHICAGO
7839 KING 10 SALES CHICAGO
7844 TURNER 30 SALES CHICAGO
7876 ADAMS 20 SALES CHICAGO
7900 JAMES 30 SALES CHICAGO
7902 FORD 20 SALES CHICAGO
7934 MILLER 10 SALES CHICAGO
7369 SMITH 20 OPERATIONS BOSTON
7499 ALLEN 30 OPERATIONS BOSTON
7521 WARD 30 OPERATIONS BOSTON
7566 JONES 20 OPERATIONS BOSTON
7654 MARTIN 30 OPERATIONS BOSTON
7698 BLAKE 30 OPERATIONS BOSTON
7782 CLARK 10 OPERATIONS BOSTON
7788 SCOTT 20 OPERATIONS BOSTON
7839 KING 10 OPERATIONS BOSTON
7844 TURNER 30 OPERATIONS BOSTON
7876 ADAMS 20 OPERATIONS BOSTON
7900 JAMES 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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
75

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
76

FROM EMP E,DEPT D

WHERE E.DEPTNO=D.DEPTNO;

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


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 NON-
EQUIJOIN,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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
77

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
7654 MARTIN 1250 2
7934 MILLER 1300 2
7499 ALLEN 1600 3
7844 TURNER 1500 3
7566 JONES 2975 4
7698 BLAKE 2850 4
7782 CLARK 2450 4
7788 SCOTT 3000 4
7902 FORD 3000 4
7839 KING 5000 5

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(+)

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
78

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;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
79

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.

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
80

Table created.

SQL> CREATE TABLE DEPT1


2 AS
3 SELECT * FROM DEPT;

Table created.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
81

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
1 PAVAN 50
2 KUMAR 60
3 GAYATRI 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
82

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
83

3 SELECT * FROM EMP;

Table created.

SQL> UPDATE EMPLOYEE


2 SET SAL =1000, JOB = 'MANAGER';

14 rows updated.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
84

DEFAULT:

SQL> CREATE TABLE EMPLOYEE


2 (EMPNO NUMBER(10),
3 ENAME VARCHAR2(10),
4 DEPTNO NUMBER(10) DEFAULT 10);

Table created.

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
85

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
86

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.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
87

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
88

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

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
89

JOB
---------
MANAGER
PRESIDENT
CLERK
CLERK
MANAGER
ANALYST
CLERK
ANALYST

8 rows selected.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
90

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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
91

CLERK

8 rows selected.

SQL> SELECT DISTINCT(JOB) FROM EMP WHERE DEPTNO IN (10,20); - THIS IS UNION.

JOB
---------
ANALYST
CLERK
MANAGER
PRESIDENT

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
92

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:

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)

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
93

---------- ----------
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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
94

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
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)


---------- --------- ----------

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
95

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:

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
96

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:
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
97

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;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
98

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;

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')
---------------------------------------

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
99

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;

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
100

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.

SQL> SELECT * 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
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> 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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
101

SQL> START PAVAN


IT EXECUTES THE QUERY THAT IS THERE IN FILE PAVAN.

SQL> SELECT * 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
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> @PAVAN
IT EXECUTES THE QUERY THAT IS THERE IN FILE PAVAN.

SQL> SELECT * 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
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

SQL> RUN PAVAN

IT EXECUTES THE QUERY THAT IS THERE IN FILE PAVAN.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
102

1* SELECT * FROM EMP

SQL> SELECT * 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
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> EDIT PAVAN

IT OPENS THE FILE FOR EDITING.

DIFFERENCE BETWEEN SQL AND SQL*PLUS:

SQL : STRUCTURED QUERY LANGUAGE.

SQL SQL*PLUS
IS A LANGUAGE FOR COMMUNICATING WITH RECOGNIZES SQL STATEMENTS AND SENDS
THE ORACLE SERVER TO ACCESS DATA. THEM TO THE SERVER.
IS BASED ON AMERICAN NATIONAL IS THE ORACLE PROPRIETARY INTERFACE FOR
STANDARDS INSTITUTE. EXECUTING SQL STATEMENTS.
MANIPULATES DATA AND TABLE DEFINITIONS DOES NOT ALLOWMANIPULATION OF VALUES
IN THE DATABASE. IN THE DATABASE.

OPERATORS PRECEDENCE:

ORDER EVALUATED OPERATOR


1 ALL COMPARISON OPERATORS

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
103

2 NOT
3 AND
4 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;

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


---------- ---------- ----------

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
104

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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
105

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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
106

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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
107

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

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 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> 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
108

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


---------- ---------- ----------
7782 CLARK 2450
7698 BLAKE 2850
7566 JONES 2975
7788 SCOTT 3000
7902 FORD 3000
7839 KING 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')

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
109

new 1: INSERT INTO DEPT_DUP VALUES (50,'COMPUTERS NAME','NEW YORK')

1 row created.

SQL STATEMENTS:

SELECT DATA RETRIVAL

INSERT DATA MANIPULATION LANGUAGE


UPDATE (DML STATEMENTS)
DELETE

CREATE DATA DEFINITION LANGUAGE


ALTER (DDL STATEMENTS)
DROP
RENAME
TRUNCATE

COMMIT TRANSACTION CONTROL


ROLLBACK
SAVEPOINT
GRANT DATA CONTROL LANGUAGE
REVOKE (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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
110

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
40 OPERATIONS 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)

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
111

SQL> SELECT MAX(SAL) FROM EMP;

MAX(SAL)
----------
5000

SQL> SELECT * FROM EMP WHERE SAL = 5000;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7839 KING PRESIDENT 17-NOV-81 5000 10

SQL> SELECT * FROM EMP WHERE SAL = (SELECT MAX(SAL) FROM EMP);

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7839 KING PRESIDENT 17-NOV-81 5000 10

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

SQL> /

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
112

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);

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
113

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 = 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)

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
114

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
115

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 DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
116

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

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 DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20

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 /

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
117

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 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 < 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> /

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
118

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
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

13 rows selected.

1 SELECT * FROM EMP


2* WHERE SAL > SOME (SELECT SAL FROM EMP)
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
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

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 /

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
119

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7900 JAMES CLERK 7698 03-DEC-81 950 30

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 DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7900 JAMES CLERK 7698 03-DEC-81 950 30

3RD 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* )))
6 /

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7876 ADAMS CLERK 7788 23-MAY-87 1100 20

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 DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7876 ADAMS CLERK 7788 23-MAY-87 1100 20

4TH LEAST:

1 SELECT * FROM EMP


2 WHERE SAL = (SELECT MIN(SAL) FROM EMP

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
120

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 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 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);

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
121

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 < ALL (SELECT MAX(SAL) FROM EMP))
SQL> /

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
122

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

>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 COMM DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
123

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

13 rows selected.

2ND LEAST:

1 SELECT * FROM EMP


2 WHERE SAL = (SELECT MIN(SAL) FROM EMP
3* WHERE SAL > ALL (SELECT MIN(SAL) FROM EMP))
SQL> /

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7900 JAMES CLERK 7698 03-DEC-81 950 30

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 DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7876 ADAMS CLERK 7788 23-MAY-87 1100 20

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
124

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);

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 DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7839 KING PRESIDENT 17-NOV-81 5000 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7566 JONES MANAGER 7839 02-APR-81 2975 20
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
125

7782 CLARK MANAGER 7839 09-JUN-81 2450 10


7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7934 MILLER CLERK 7782 23-JAN-82 1300 10
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7369 SMITH CLERK 7902 17-DEC-80 800 20

14 rows selected.

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
126

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 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.

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 DNAME


---------- ---------- ---------- --------------
7369 SMITH 20 RESEARCH
7499 ALLEN 30 SALES
7521 WARD 30 SALES
7566 JONES 20 RESEARCH

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
127

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

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 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.

JOIN-USING:

SQL> SELECT E.EMPNO,E.ENAME,D.LOC FROM

2 EMP E JOIN DEPT D

3 USING(DEPTNO);

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
128

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


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)

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
129

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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
130

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 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.

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

FROM EMP RIGHT OUTER JOIN DEPT

ON EMP.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
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;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
132

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

40 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
133

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.

SQL> SELECT * FROM EMP2;

EMPNO ENAMEJOB 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> INSERT INTO EMP2


2 VALUES
3 (1,'PAVAN','MANAGER',123,'01-DEC-05',1000,100,50);

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
134

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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
135

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

1 PAVAN 50
2 KUMAR 60
3 GAYATRI 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
136

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
7839 KING 10 10 ACCOUNTING NEW YORK
7782 CLARK 10 10 ACCOUNTING NEW YORK
7902 FORD 20 20 RESEARCH DALLAS
7876 ADAMS 20 20 RESEARCH DALLAS
7788 SCOTT 20 20 RESEARCH DALLAS
7566 JONES 20 20 RESEARCH DALLAS
7369 SMITH 20 20 RESEARCH DALLAS
7900 JAMES 30 30 SALES CHICAGO
7844 TURNER 30 30 SALES CHICAGO
7698 BLAKE 30 30 SALES CHICAGO
7654 MARTIN 30 30 SALES CHICAGO
7521 WARD 30 30 SALES CHICAGO
7499 ALLEN 30 30 SALES CHICAGO
1 PAVAN 50
2 KUMAR 60
3 GAYATRI 70
40 OPERATIONS BOSTON

18 rows selected.

FULL OUTER JOIN IN PRIOR TO ORACLE 9I

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
137

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 LOC


---------- ---------- ---------- -------------- -------------
1 PAVAN 50
2 KUMAR 60
3 GAYATRI 70
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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
138

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
7934 MILLER 10 10 ACCOUNTING NEW YORK

40 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
139

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 /

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
140

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).

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}];

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
141

IN SYNTAX:

SEQUENCE_NAME SEQUENCE NAME

INCREMENT BY N SPECIFIES THE INTERVAL BETWEEN SEQUENCE NUMBERS


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

STARTWITH N SPECIFIES THE FIRST SEQUENCE NUMBER TO BE


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

MAXVALUE N SPECIFIES MAXVALUE THE SEQUENCE CAN


GENERATE.

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)
CACHE N | NO CACHE SPECIFIES HOW MANY VALUES THE ORACLE SERVER
PREALLOCATES AND KEEP IN MEMORY.(BY DEFAULT
ORACLE SERVER CACHES 20 VALUES)

CREATION OF SEQUENCE:

SQL> CREATE SEQUENCE DEPT_DUP_SEQ

2 INCREMENT BY 10

3 START WITH 10

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
142

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;

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')

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
143

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:

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
144

---------- -------------- -------------


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
----------
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
145

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;

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
146

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

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
147

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

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
148

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)
--------------
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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
149

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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
150

------
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;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
151

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
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
152

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

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
153

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
TURNER 08TH-SEP-81
ADAMS 23RD-MAY-87
JAMES 03RD-DEC-81
FORD 03RD-DEC-81
MILLER 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
154

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
FORD THIRD-DEC-81
MILLER 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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
155

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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
156

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

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
157

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
30 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 /

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
158

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 ()
4 /

SUM(SAL)
----------
29025

CUBE:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
159

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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
160

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 ()
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
161

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 GR_JOB


---------- --------- ---------- ---------- ----------
10 CLERK 1300 0 0
10 MANAGER 2450 0 0
10 PRESIDENT 5000 0 0
10 8750 0 1
20 ANALYST 6000 0 0
20 CLERK 1900 0 0
20 MANAGER 2975 0 0
20 10875 0 1
30 CLERK 950 0 0
30 MANAGER 2850 0 0
30 SALESMAN 5600 0 0
30 9400 0 1
0 0
0 1
29025 1 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 GR_JOB


---------- --------- ---------- ---------- ----------
10 CLERK 1300 0 0
10 MANAGER 2450 0 0
10 PRESIDENT 5000 0 0

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
162

10 8750 0 1
20 ANALYST 6000 0 0
20 CLERK 1900 0 0
20 MANAGER 2975 0 0
20 10875 0 1
30 CLERK 950 0 0
30 MANAGER 2850 0 0
30 SALESMAN 5600 0 0
30 9400 0 1
ANALYST 6000 1 0
CLERK 4150 1 0
MANAGER 8275 1 0
PRESIDENT 5000 1 0
SALESMAN 5600 1 0
0 0
0 1
1 0
29025 1 1

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 AVG(SAL)


---------- --------- ---------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 ANALYST 3000
20 CLERK 950
20 MANAGER 2975
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 1400

ANALYST 7566 3000


CLERK 7698 950
CLERK 7782 1300
CLERK 7788 1100
CLERK 7902 800

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
163

MANAGER 7839 2758.33333


PRESIDENT 5000
SALESMAN 7698 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 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
ANALYST 7566 6000
CLERK 7698 950
CLERK 7782 1300
CLERK 7788 1100
CLERK 7902 800
MANAGER 7839 8275
PRESIDENT 5000
SALESMAN 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)

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
164

---------- --------- ----------


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> /

DEPTNO JOB MANAGER_NO SUM(SAL)


---------- --------- ---------- ----------
10 CLERK 7782 1300
10 MANAGER 7839 2450
10 PRESIDENT 5000
10 8750
20 ANALYST 7566 6000
20 CLERK 7788 1100
20 CLERK 7902 800
20 MANAGER 7839 2975
20 10875

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
165

30 CLERK 7698 950


30 MANAGER 7839 2850
30 SALESMAN 7698 5600
30 9400
29025

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
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)

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
166

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
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
167

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
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

31 rows selected.

THE ABOVE QUERY IS COMBINATION OF BELOW QUERIES:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
168

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
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)


---------- ---------- ----------

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
169

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.

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
170

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
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
171

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
172

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


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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
173

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.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
174

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');

NAME
----------
DIPU
DEEPU
DIPA

SQL> SELECT SOUNDEX(NAME),NAME,SOUNDEX('DEEP') FROM MYFRIENDS;

SOUN NAME SOUN


---- ---------- ----
N300 NEETA D100
M300 MITA D100
D100 DIPU D100
D100 DEEPU D100
D100 DIPA D100
A540 ANIL D100
S540 SUNIL D100

7 rows selected.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
175

GENERATING PRIMARY KEY NUMBERS USING ROW NUM AND


SEQUENCES:

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.

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> /

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
176

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;

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

3 WHEN 'CLERK' THEN 1.15 *SAL

4 WHEN 'SALESMAN'THEN 1.20 *SAL

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
177

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.

DECODE:

1 SELECT EMPNO,ENAME,SAL,

2 DECODE (JOB,'MANAGER' ,1.10 *SAL,

3 'CLERK' ,1.15 *SAL,

4 'SALESMAN' ,1.20 *SAL,

5 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
178

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.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
179

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 ONE ONE OR MORE
CONTAINS FUNCTIONS NO YES
CONTAINS GROUPS OF DATA NO YES
DML THROUGH VIEW YES NOT ALWAYS

CREATION OF THE VIEW:

CREATE [ OR REPLACE [FORCE\NOFORCE] VIEW VIEW_NAME

[(ALIAS[,ALIAS..)]

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 CREATES THE VIEW ONLY OF THE BASE TABLES EXIST.(THIS IS


DEFAULT).

VIEW NAME OF THE VIEW.

ALIAS ALIAS NAME FOR COLUMNS SELECTED BY QUERY, THEY


SHOULD MATCH.

SUBQUERY SELECT SATETMENT.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
180

WITH CHECK OPTION SPECIFIES THAT ONLY ROWS ACCESSIBLE TO THE VIEW
CAN BE INSERTED OR UPDATED.

CONSTRAINT NAME OF CONSTRAINT.

WITH READ ONLY ENSURES THAT NO DML OPERATIONS CAN BE PERFORMED ON


THIS VIEW.

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.

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 COMM DEPTNO

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
181

---------- ---------- --------- ---------- --------- ---------- ---------- ----------


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

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 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
1 PAVAN MANAGER 7369 01-DEC-91 1000 100 10

SQL> SELECT * FROM EMP_DUP WHERE DEPTNO=10;

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
1 PAVAN MANAGER 7369 01-DEC-91 1000 100 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)

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
182

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.
SQL * PLUS: IT SEES THE SELECT
STATEMENT HERE.
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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
183

View created.

SQL> DESC EMPVU1_10


Name Null? Type
----------------------------------------------------- -------- ------------------------------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)

SQL> SELECT VIEW_NAME,TEXT FROM USER_VIEWS WHERE


VIEW_NAME='EMPVU1_10';

VIEW_NAME
------------------------------
TEXT
--------------------------------------------------------------------------------
EMPVU1_10
SELECT EMPNO,ENAME FROM EMP_DUP
WHERE DEPTNO=10

SQL> UPDATE EMPVU10


2 SET SAL = 1000;

4 rows updated.

SQL> SELECT * FROM EMP_DUP WHERE DEPTNO=10;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


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

SQL> SELECT * FROM EMPVU10;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


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

1 DELETE FROM EMPVU10


2* WHERE JOB='MANAGER'
SQL> /

2 rows deleted.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
184

SQL> SELECT * FROM EMPVU10;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7839 KING PRESIDENT 17-NOV-81 1000 10
7934 MILLER CLERK 7782 23-JAN-82 1000 10

1 SELECT * FROM EMP_DUP


2* WHERE DEPTNO=10
SQL> /

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7839 KING PRESIDENT 17-NOV-81 1000 10
7934 MILLER CLERK 7782 23-JAN-82 1000 10

MODIFYING VIEW:

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
185

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
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
186

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.

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
187

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;

EMPNO ENAME JOB DEPTNO


---------- ---------- --------- ----------
7369 SMITH CLERK 20
7566 JONES MANAGER 20
7788 SCOTT ANALYST 20
7876 ADAMS CLERK 20
7902 FORD ANALYST 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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
188

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

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 C
------------------------------ -
EMP_DUPVU20_VIEWCHECK 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
189

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
*
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 C
------------------------------ -
EMP_DUP30VU_READONLY 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
190

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)
MINSAL NUMBER
MAXSAL NUMBER
AVGSAL 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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
191

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
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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
192

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
30 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
193

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 ()
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
194

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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
195

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 ()
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 /

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
196

DEPTNO JOB SUM(SAL) GR_DEPTNO GR_JOB


---------- --------- ---------- ---------- ----------
10 CLERK 1300 0 0
10 MANAGER 2450 0 0
10 PRESIDENT 5000 0 0
10 8750 0 1
20 ANALYST 6000 0 0
20 CLERK 1900 0 0
20 MANAGER 2975 0 0
20 10875 0 1
30 CLERK 950 0 0
30 MANAGER 2850 0 0
30 SALESMAN 5600 0 0
30 9400 0 1
0 0
0 1
29025 1 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 GR_JOB


---------- --------- ---------- ---------- ----------
10 CLERK 1300 0 0
10 MANAGER 2450 0 0
10 PRESIDENT 5000 0 0
10 8750 0 1
20 ANALYST 6000 0 0
20 CLERK 1900 0 0
20 MANAGER 2975 0 0
20 10875 0 1
30 CLERK 950 0 0
30 MANAGER 2850 0 0
30 SALESMAN 5600 0 0
30 9400 0 1
ANALYST 6000 1 0
CLERK 4150 1 0
MANAGER 8275 1 0
PRESIDENT 5000 1 0
SALESMAN 5600 1 0
0 0
0 1
1 0
29025 1 1

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
197

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 AVG(SAL)


---------- --------- ---------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 ANALYST 3000
20 CLERK 950
20 MANAGER 2975
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 1400

ANALYST 7566 3000


CLERK 7698 950
CLERK 7782 1300
CLERK 7788 1100
CLERK 7902 800
MANAGER 7839 2758.33333
PRESIDENT 5000
SALESMAN 7698 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 SUM(SAL)


---------- --------- ---------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 ANALYST 6000
20 CLERK 1900

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
198

20 MANAGER 2975
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
ANALYST 7566 6000
CLERK 7698 950
CLERK 7782 1300
CLERK 7788 1100
CLERK 7902 800
MANAGER 7839 8275
PRESIDENT 5000
SALESMAN 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
199

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> /

DEPTNO JOB MANAGER_NO SUM(SAL)


---------- --------- ---------- ----------
10 CLERK 7782 1300
10 MANAGER 7839 2450
10 PRESIDENT 5000
10 8750
20 ANALYST 7566 6000
20 CLERK 7788 1100
20 CLERK 7902 800
20 MANAGER 7839 2975
20 10875
30 CLERK 7698 950
30 MANAGER 7839 2850
30 SALESMAN 7698 5600
30 9400
29025

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
200

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
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
201

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
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)


---------- --------- ---------- ----------

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
202

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
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

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
203

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
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
204

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 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));

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
205

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
206

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
207

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:

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
208

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;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
209

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:

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)

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
210

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
20 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),

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
211

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,
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
212

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;

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
213

1* DELETE FROM HIREDATE_HIS_81_1


SQL> /

5 rows deleted.

1* DELETE FROM HIREDATE_HIS_87_1


SQL> /

1 row deleted.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
214

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
20 23-MAY-87 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),

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
215

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.

SQL> SELECT * FROM SALES_INFO;

EMPLOYEE_ID WEEK SALES


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

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


---------- ---------- ---------- ------

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
216

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
217

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


---------- ---------- ----------
ALLEN 1600 30
JONES 2975 20
BLAKE 2850 30

SCOTT 3000 20
KING 5000 10
FORD 3000 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
218

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
7782 CLARK MANAGER 10
7788 SCOTT ANALYST 20
7839 KING PRESIDENT 10
7902 FORD ANALYST 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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
219

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);

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
220

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

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)

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
221

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
222

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
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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
223

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.

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 IS HERE.ALL SQL STATEMENTS AND PROCEDURAL


CONSTRUCTS.

EXCEPTION

EXCEPTION SECTION HERE.ERRORS HANDLING STATEMENTS GOES HERE.

END;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
224

DECLARE AND EXCEPTION IS OPTIONAL.THAT IS EVERY PL/SQL BLOCK SHOULD


HAVE BEGIN AND END.

DECLARING PL/SQL VARIABLES:

DECLARE

V_HIREDATE DATE;

V_DEPTNO NUMBER(10) NOT NULL := 10;

V_LOC VARCHAR2(10) := NEW YORK;

V_COMM CONSTANT NUMBER :=1400;

V_SAL NUMBER(10) DEFAULT 1000;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
225

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:

V_ENAME VARCHAR2(10);

V_JOB EMP.JOB%TYPE;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
226

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

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>>

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
227

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';

10 DBMS_OUTPUT.PUT_LINE(V_DEPTNO || ' ' || 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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
228

SQL> /

8750

PL/SQL procedure successfully completed.

INSERTING DATA:

BEGIN

INSERT INTO DEPT VALUES(50,COMPUTERS,MIAMI);

END;

UPDATING DATA:

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
229

CONDITIONAL IF STATEMENTS:

IF BOOLEAN_EXPRESSION1 THEN

SEQUENCE_STATEMENTS;

ELSIF BOOLEAN_EXPRESSION1 THEN

SEQUENCE_STATEMENTS;

ELSE

SEQUENCE_STATEMENTS;

END IF;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
230

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
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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
231

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 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
*

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
232

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.

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%');

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
233

13 WHEN 'SALESMAN' THEN

14 DBMS_OUTPUT.PUT_LINE(V_JOB);

15 DBMS_OUTPUT.PUT_LINE('HIS SALARY INCREASES 20%');(HERE NO ELSE


STATEMENT).

16 END CASE;

17* END;

SQL> /
Enter value for employee_number: 7788

DECLARE
*
ERROR at line 1:
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
234

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
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);

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
235

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%
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
FALSE TRUE
NULL NULL

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
236

ITERATIVECONTROL:

LOOP STATEMENTS

LOOPS REPEAT A STATEMENT OR SEQUENCE OF STATEMENTS MULTIPLE


TIMES.
THERE ARE THREE LOOPS TYPES:

BASIC LOOP

FOR LOOP

WHILE LOOP

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;

9 END IF;

10 END LOOP;

11* END;

SQL> /

0
1
2
3

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
237

4
5
6
7
8
9
10

PL/SQL procedure successfully completed.

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 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
238

3 DBMS_OUTPUT.PUT_LINE(I);

4 END LOOP;

5* END;

SQL> /
1
2
3
4
5
6
7
8
9
10

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
239

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> /

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
240

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.
THE ORACLE ENGINE
SQL %ISOPEN 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
SQL%FOUND 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
SQL%NOTFOUND 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
SQL%ROWCOUNT 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)

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
241

SQL> DECLARE

2 V_DEPTNO EMP.DEPTNO%TYPE :=10;

3 BEGIN

4 DELETE FROM EMP

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
242

1 BEGIN

2 DELETE FROM DEPT1

3 WHERE DEPTNO=10;

4 IF SQL%FOUND THEN

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
243

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.

CLOSE THE CURSOR.

EXPLICIT CURSOR ATTRIBUTES:

%ROWCOUNT 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.
%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.
%NOTFOUND 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.
%IS OPEN 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
244

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 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
245

SLOVING THE ABOVE PROBLEM WITH CURSORS:

1 DECLARE

2 CURSOR C IS SELECT ENAME,JOB,SAL FROM EMP

3 WHERE DEPTNO=&DEPARTMENT_NO;

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 SAL


--------- ---------- ---------

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
246

7782 CLARK 2450


7839 KING 5000
7934 MILLER 1300

1 DECLARE

2 V_EMPNO EMP.EMPNO%TYPE;

3 V_ENAME EMP.ENAME%TYPE;

4 V_SAL 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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
247

WORKINGWITH %ISOPEN CURSOR ATTRIBUTE:

1 DECLARE

2 V_EMPNO EMP.EMPNO%TYPE;

3 V_ENAME EMP.ENAME%TYPE;

4 V_SAL 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 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 3

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
248

PL/SQL procedure successfully completed.

WORKING WITH %FOUND CURSOR ATTRIBUTE:

SQL> DECLARE

2 V_EMPNO EMP.EMPNO%TYPE;

3 V_ENAME EMP.ENAME%TYPE;

4 V_SAL 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 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' || ' ' || V_NO_ROWS);

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
249

21 END IF;

22 CLOSE EMP_CURSOR;

23 END;

24 /

7782 CLARK 2450


7839 KING 5000
7934 MILLER 1300
NO OF ROWS AFFECTED 3

PL/SQL procedure successfully completed.

WORKINGWITH%NOTFOUNDCURSOR ATTRIBUTE:

SQL> DECLARE

2 V_EMPNO EMP.EMPNO%TYPE;

3 V_ENAME EMP.ENAME%TYPE;

4 V_SAL 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 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
250

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' || ' ' || V_NO_ROWS);

21 END IF;

22 CLOSE EMP_CURSOR;

23 END;

24 /

7782 CLARK 2450


7839 KING 5000
7934 MILLER 1300

NO OF ROWS AFFECTED 3

PL/SQL procedure successfully completed.

WORKING WITH WHILE LOOP IN CURSORS:

1 DECLARE

2 V_EMPNO EMP.EMPNO%TYPE;

3 V_ENAME EMP.ENAME%TYPE;

4 V_SAL 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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
251

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;

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;

21 /

7782 CLARK 2450


7839 KING 5000
7934 MILLER 1300

NO OF ROWS AFFECTED 3

PL/SQL procedure successfully completed.

WORKING WITH FOR LOOP IN CURSORS:

1 DECLARE

2 V_EMPNO EMP.EMPNO%TYPE;

3 V_ENAME EMP.ENAME%TYPE;

4 V_SAL 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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
252

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;

13 DBMS_OUTPUT.PUT_LINE('NO OF ROWS AFFECTED' || ' ' || V_NO_ROWS);

14* END;

15 /

7782 CLARK 2450


7839 KING 5000
7934 MILLER 1300

NO OF ROWS AFFECTED 3

PL/SQL procedure successfully completed.

8
9
PL/SQL procedure successfully completed.

EXCEPTION HANDLING:

1 DECLARE

2 V_EMPNO NUMBER(10);

3 V_ENAME VARCHAR2(10);

4 V_SAL NUMBER(10);

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
253

5 V_DEPTNO NUMBER(10);

6 BEGIN

7 V_DEPTNO := &DEPARTMENT_NO;

8 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;

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);

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
254

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);

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 SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
255

9 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');

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 SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL


9 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
256

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.

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.

1 DECLARE

2 V_DEPTNO NUMBER(10);

3 V_DNAME VARCHAR2(10);

4 V_LOC VARCHAR2(10);

5 BEGIN

6 V_DEPTNO := &DEPARTMENT_NO;

7 V_DNAME :='&DEPARTMENT_NAME';

8 V_LOC :='&LOC';

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
257

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
ORA-06512: at line 9

1 DECLARE

2 V_DEPTNO NUMBER(10);

3 V_DNAME VARCHAR2(10);

4 V_LOC VARCHAR2(10);

5 BEGIN

6 V_DEPTNO := &DEPARTMENT_NO;

7 V_DNAME :='&DEPARTMENT_NAME';

8 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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
258

1 DECLARE

2 V_DEPTNO NUMBER(10);

3 V_DNAME VARCHAR2(10);

4 V_LOC VARCHAR2(10);

5 BEGIN

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

8 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;

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

1 DECLARE

2 V_DEPTNO NUMBER(10);

3 V_DNAME VARCHAR2(10);

4 V_LOC VARCHAR2(10);

5 BEGIN

6 V_DEPTNO := &DEPARTMENT_NO;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
259

7 V_DNAME :='&DEPARTMENT_NAME';

8 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 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 /

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* (2,2000)
SQL> /

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 SELECT ACC_NO,CURRBAL INTO V_ACCNO,V_CURRBAL


9 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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
261

13 ELSE

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

15 END IF;

16 EXCEPTION

17 WHEN MORE_THAN_BAL THEN

18 DBMS_OUTPUT.PUT_LINE('ATTEMPTED TO WITH
19 DRAW MORE THAN THE CURRENT BALANCE'
20 || ' '|| V_CURRBAL ||' ' || ' FROM THE ACCOUNT NUMBER' || '
21 ' || 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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
262

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 SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL


9 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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
263

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');

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
264

15 DBMS_OUTPUT.PUT_LINE('THE DEPTNO '||V_DEPTNO ||'


16 ' || 'FETCHING MORE THAN ONE ROW');

15* 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 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 SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL


9 FROM EMP WHERE DEPTNO=V_DEPTNO;

9 DBMS_OUTPUT.PUT_LINE(V_EMPNO||V_ENAME||V_SAL);

10 EXCEPTION

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
265

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

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 SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL


9 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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
266

SQL> /

Enter value for department_no: 10

THE DEPTNO 10 FETCHING MORE THAN ONE ROW

PL/SQL procedure successfully completed.

SQL> /

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 ||' '

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
267

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);

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');

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
268

15 WHEN OTHERS THEN

16 V_ERRORCODE:=SQLCODE;

17 V_ERRORTEXT:=SQLERRM;

18 DBMS_OUTPUT.PUT_LINE(V_ERRORCODE || V_ERRORTEXT);

19* END;

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');

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
269

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);

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
270

16 DBMS_OUTPUT.PUT_LINE(V_ERRORCODE);

17 DBMS_OUTPUT.PUT_LINE(V_ERRORTEXT);

18* END;

19 /
Enter value for department_no: 10

-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);

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
271

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.

SQL> DECLARE

2 V_ACCNO NUMBER(10);

3 V_CURRBAL NUMBER(10);

4 V_WITHDRAWAMT NUMBER(10);

5 V_ERRORCODE NUMBER(10);

6 V_ERRORTEXT VARCHAR2(255);

7 MORE_THAN_BAL EXCEPTION;

8 BEGIN

9 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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
272

21 V_ERRORTEXT:=SQLERRM;

22 DBMS_OUTPUT.PUT_LINE(V_ERRORCODE);

23 DBMS_OUTPUT.PUT_LINE(V_ERRORTEXT);

24 END;

25 /

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
273

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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
274

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;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
275

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);
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
276

7876ADAMS
7902FORD

PL/SQL procedure successfully completed.

SQL> /
Enter value for deptno: 30
7499ALLEN
7521WARD
7654MARTIN
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
277

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
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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
278

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;
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 TYPE DEPT_RECORD IS RECORD

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
279

3 (
4 V_DEPTNO DEPT.DEPTNO%TYPE,
5 V_DNAME DEPT.DNAME%TYPE,
6 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;
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
280

1 DECLARE
2 TYPE DEPT_RECORD IS RECORD
3 (
4 V_DEPTNO DEPT.DEPTNO%TYPE,
5 V_DNAME DEPT.DNAME%TYPE,
6 V_LOC DEPT.LOC%TYPE);
7 DEPT_REC DEPT_RECORD;
8 BEGIN
9 SELECT DEPTNO,DNAME,LOC INTO DEPT_REC FROM DEPT;
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
281

USING %ROWTYPE:

1 DECLARE
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
283

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:
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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
284

13* END;
14 /
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.

SQL> ED
Wrote file afiedt.buf

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* END;
13 /
V_NUMBERS(1):10
V_NUMBERS(2):20
V_NUMBERS(3):30
V_NUMBERS(4):40
V_NUMBERS(5):50

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
285

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
286

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* 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);

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
287

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;
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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
288

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
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
289

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.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
290

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;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
291

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
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));

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
292

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;

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
293

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 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
294

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.

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 /

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
295

PAVAN
KUMAR
GAYATRI

PL/SQL procedure successfully completed.

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
296

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> /

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 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* END;
20 /
10ACCOUNTINGNEW YORK

PL/SQL procedure successfully completed.

1 DECLARE

2 CURSOR C IS SELECT * FROM DEPT;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
297

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 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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
298

SQL> SELECT * FROM EMP_DUP;

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.
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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
299

EMPNO ENAME JOB MGR HIREDATE SAL COMM


DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 1800 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.

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)

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
300

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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
301

SQL> PRINT G_DEPTNO

G_DEPTNO
----------
20

PROCEDURE WITH IN OUT PARAMETER:

1 CREATE OR REPLACE PROCEDURE BALAJI2

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
302

2 :G_EMPNO_SAL:=7369;
3* END;
SQL> /

PL/SQL procedure successfully completed.

SQL> EXECUTE BALAJI2(:G_EMPNO_SAL);

PL/SQL procedure successfully completed.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
303

6 INSERT INTO DEPT1

7 VALUES

8 (ADD_DEPT_SEQ.NEXTVAL,V_DNAME,V_LOC);

9* END;

SQL> /

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
304

SQL> CREATE OR REPLACE PROCEDURE LEAVE_EMP2

2 (V_EMPNO IN EMP.EMPNO%TYPE)

3 IS

4 PROCEDURE LOG_EXEC

5 IS

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 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
305

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> BEGIN

2 LEAVE_EMP2(7369);

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 COMM DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
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

13 rows selected.

SQL> CREATE OR REPLACE PROCEDURE RAISE_SALARY

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
306

2 (V_EMPNO IN EMP.EMPNO%TYPE)

3 IS

4 BEGIN

5 UPDATE EMP_DUP

6 SET SAL = SAL* 1.10

7 WHERE EMPNO=V_EMPNO;

8 END;

9 /

Procedure created.

SQL> SELECT * FROM EMP_DUP;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
307

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;

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 COMM DEPTNO


---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 880 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1760 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1375 500 30
7566 JONES MANAGER 7839 02-APR-81 3272.5 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1375 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 3135 30
7782 CLARK MANAGER 7839 09-JUN-81 2695 10
7788 SCOTT ANALYST 7566 19-APR-87 3300 20
7839 KING PRESIDENT 17-NOV-81 5500 10
7844 TURNER SALESMAN 7698 08-SEP-81 1650 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1210 20

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
308

7900 JAMES CLERK 7698 03-DEC-81 1045 30


7902 FORD ANALYST 7566 03-DEC-81 3300 20
7934 MILLER CLERK 7782 23-JAN-82 1430 10

14 rows selected.

DROPING A STORED PROCEDURE:

SQL> DROP PROCEDURE GAYATRI;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
309

Name Null? Type


----------------------------------------------------------------------- --------
------------------------------------------------
NAME VARCHAR2(30)
TYPE VARCHAR2(12)
LINE NUMBER
TEXT VARCHAR2(4000)

SQL> SELECT TEXT FROM USER_SOURCE


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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
310

1 SELECT TEXT FROM USER_SOURCE


2 WHERE NAME='BALAJI2'
3* ORDER BY LINE
SQL> /

TEXT
--------------------------------------------------------------------------------------------------------------------------
--------
PROCEDURE BALAJI2
(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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
311

3 WHERE NAME='LOG_EXECUTION'
4 ORDER BY LINE;

POS
---------------------------------------------------------------------------------
TEXT
--------------------------------------------------------------------------------------------------------------------------
--------
4/7
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"

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
312

STORED FUNCTIONS:

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 128
7521 WARD 1250 100
7566 JONES 2975 238
7654 MARTIN 1250 100
7698 BLAKE 2850 228
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

14 rows selected.

1 SELECT EMPNO FROM EMP

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
314

2 WHERE TAX(SAL) > (SELECT MAX(TAX(SAL)) FROM EMP


3* WHERE DEPTNO=30) ORDER BY TAX(SAL) DESC
4 /

EMPNO
----------
7839
7788
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 SAL COMM


DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7839 KING PRESIDENT 17-NOV-81 5000 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7566 JONES MANAGER 7839 02-APR-81 2975 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';

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
315

OBJECT_NAME
--------------------------------------------------------------------------------------------------------------------------
------
OBJECT_TYPE
------------------
GET_SAL
FUNCTION

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
316

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.

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 MUST RETURN A SINGLE VALUE.


VALUES

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
317

CREATING TRIGGERS:

TRIGGER TIMING:

-FOR TABLE : BEFORE,AFTER

-FOR VIEW : INSTEAD OF.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
318

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.

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 DNAME LOC


10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 COMPUTERS 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
319

SET SAL = SAL*1.1


WHERE DEPTNO=30;

BEFORE STATEMENT TRIGGER


EMPNO ENAME DEPTNO
7839 KING 30
BEFORE ROW TRIGGER

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')

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
320

6 THEN RAISE_APPLICATION_ERROR (-20500, 'YOU MAY ONLY INSERT INTO EMP

7 DURING BUSINESS HOURS');

8 END IF;

9 END;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
321

5 (TO_CHAR(SYSDATE,'HH24') NOT BETWEEN '08' AND '18')

6 THEN

7 IF DELETING

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
322

2 AS
3* SELECT * FROM DEPT
4 /

Table created.

1 CREATE TABLE AUDIT_DEPT_TABLE

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
323

2 AFTER DELETE OR INSERT OR UPDATE ON DEPT1

3 FOR EACH ROW

4 BEGIN

5 INSERT INTO AUDIT_DEPT_TABLE

6 VALUES

7 (USER,SYSTIMESTAMP,:NEW.DEPTNO,:OLD.DEPTNO,:NEW.DNAME,:OLD.DNAME,
8 :NEW.LOC,:OLD.LOC);

9* END;

SQL> /

Trigger created.

DATA OPERATION. OLD VALUE. NEW VALUE.


INSERT. NULL. INSERTED VALUE.
UPDATE. VALUE BEFORE VALUE AFTER UPDATE.
UPDATE.
DELETE. VALUE BEFORE DELETE. 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
324

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
---------- --------- ---------- ---------- ---------- ---------- ---------- ----------
SCOTT 09-JUN-05 10 ACCOUNTING
NEW YORK

SCOTT 09-JUN-05 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 09-JUN-05 50 COMPUTERS NEW


YORK

SCOTT 09-JUN-05 50 50 PAVAN COMPUTERS NEW


YORK NEW YORK

UPDATING WITHOUT WHERE CLAUSE:

SQL> UPDATE DEPT1


2 SET DEPTNO=1;

4 rows updated.

SQL> SELECT * FROM AUDIT_DEPT_TABLE;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
325

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 COMPUTERS NEW YORK

SCOTT 09-JUN-05 50 50 PAVAN COMPUTERS NEW YORK NEW


YORK

SCOTT 09-JUN-05 1 20 RESEARCH RESEARCH DALLAS


DALLAS

SCOTT 09-JUN-05 1 30 SALES SALES CHICAGO


CHICAGO

SCOTT 09-JUN-05 1 40 OPERATIONS OPERATIONS BOSTON


BOSTON

SCOTT 09-JUN-05 1 50 PAVAN PAVAN NEW YORK NEW


YORK

7 rows selected.

PROCEDURE VS TRIGGERS:

TRIGGER PROCEDURE

DEFINED WITH CREATE TRIGGER. DEFINED WITH CREATE PROCEDURE.

DATA DICTIONARY CONTAINS DATA DICTIONARY CONTAINS


SOURCE CODE. SOURCE CODE.
IMPLICITLY INVOKED. EXPLICTLY INVOKED.

COMMIT,SAVEPOINT,ROLL BACK COMMIT,SAVEPOINT,ROLL BACK


ARE NOT ALLOWED. ARE ALLOWED.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
326

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)
BASE_OBJECT_TYPE VARCHAR2(16)
TABLE_NAME VARCHAR2(30)
COLUMN_NAME VARCHAR2(4000)
REFERENCING_NAMES VARCHAR2(128)
WHEN_CLAUSE VARCHAR2(4000)
STATUS VARCHAR2(8)
DESCRIPTION VARCHAR2(4000)
ACTION_TYPE VARCHAR2(11)
TRIGGER_BODY 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'

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
327

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.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
328

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,

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
329

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'

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'

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
330

7 THEN RAISE_APPLICATION_ERROR

8 (-20002,'OPERATION NOT PERMITTED TABLES BEGINING WITH E LETTER');

9 END IF;

10 END;

11 /

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 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
331

6 (USER,SYSDATE,'LOGGGING ON');

7* END;

SQL> /

Trigger created.

1 CREATE OR REPLACE TRIGGER LOGOFF_TRIG

2 BEFORE LOGOFF ON SCHEMA

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
332

2 BEFORE LOGOFF ON DATABASE

3 BEGIN

4 INSERT INTO LOG_TRIG_TABLE1

5 VALUES

6 (USER,SYSTIMESTAMP,'LOGGGING OFF');

7* END;

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
333

STARTUP AND SHUTDOWN OF DATABASE:

CREATE TABLE START_SHUT_DBASE

(DATETIME TIMESTAMP(5));

Table created.

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);

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
334

9 END;

10 /

Trigger created.

A SPECIFIC ERROR OR ANY ERROR:

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
335

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

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
----------------------------------------------------------------------------------------------------

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
336

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 SCOTT 1


ORCL.US.ORACLE.COM
ORA-00942: table or view does not exist

15-JUN-05 12.09.54.00000 AM SCOTT 1


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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
337

4 WHEN (NEW.JOB='MANAGER')

5 BEGIN

6 INSERT INTO WHEN_MANAGER

7 VALUES

8 ('MANAGER',SYSTIMESTAMP);

9* END;

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> /

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
338

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* (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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
339

2 (USER VARCHAR2(10),

3* TDATE TIMESTAMP)
SQL> /

Table created.

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)

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
340

3 VALUES
4* (6,10)
SQL> /

1 row created.

SQL> SELECT * FROM LOG_TABLE;

US D
---------- ---------
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
341

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

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)

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
342

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:

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
343

SQL> EXECUTE GLOBALFIND_SAL;


800

PL/SQL procedure successfully completed.

OVERLOADING IN PACKAGES:

1 CREATE OR REPLACE PACKAGE OVERLOAD_DEPT IS

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
344

1 CREATE OR REPLACE PACKAGE BODY OVERLOAD_DEPT IS

2 PROCEDURE ADD_DEPT

3 (V_DEPTNO IN DEPT.DEPTNO%TYPE)

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
345

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)

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
346

70 IP LONDON

7 rows selected.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
347

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

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';

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
348

COLUMN_NAME DATA_TYPE

CUSTOMER_ID NUMBER
PERSON 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> /

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> /

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
349

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> /

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))

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
350

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
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
351

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.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
352

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?

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
353

2 (CUSTOMER_ID NUMBER PRIMARY KEY,

3 NAME VARCHAR2(10),

4 STREET VARCHAR2(10),

5 CITY VARCHAR2(10),

6 STATE VARCHAR2(10),

7* ZIP NUMBER(10))
SQL> /

Table created.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
354

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.

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

5 (NAME,ADDRESS_TY1(STREET,CITY,STATE,ZIP))

6 FROM CUSTOMER1;

View created.

SQL> SELECT * FROM CUSTOMER_VIEW;

no rows selected

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
355

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

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))

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
356

INSERTING VALUES THROUGH OBJECT VIEW:

1 INSERT INTO CUSTOMER_VIEW

2 VALUES

3* (4,PERSON_TY1('GAYAANGEL',

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
357

SQL> SELECT * FROM CUSTOMER1;

CUSTOMER_ID NAME STREET CITY STATE ZIP


----------- ---------- ---------- ---------- ---------- ----------
1 PAVAN RAMNAGAR NEW YORK AP 500044
2 GAYATRI RAMNAGAR HYD AP 500044
3 GAYATRIJI RAMNAGAR HYD AP 500044
4 GAYAANGELRAMNAGAR HYD AP 500044

SQL> SELECT * FROM CUSTOMER_VIEW;

CUSTOMER_ID
-----------
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))

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
358

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))
------------------------------------------------------------------------------------------
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
359

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;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
360

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.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
361

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');

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.');

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
362

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;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
363

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');

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
364

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||'"');

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
365

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'))
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
366

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
20 GAYATRI MANAGER
30 PRATHIMA MANAGER
40 SRIDEVI 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
367

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
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.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
368

NULLIF:

THE NULLIF FUNCTION COMPARES TWO EXPRESSIONS.

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 RESULT


---------- ---------- ---------- ----------
SMITH 5 5

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
369

ALLEN 5 8 5
WARD 4 8 4
JONES 5 7 5
MARTIN 6 8 6
BLAKE 5 7 5
CLARK 5 7 5
SCOTT 5 7 5
KING 4 9 4
TURNER 6 8 6
ADAMS 5 5
JAMES 5 5
FORD 4 7 4
MILLER 6 5 6

14 rows selected.

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 RETURNS THIS EXPRESSION IF THE PRECEDING EXPRESSIONS ARE


NULL.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
370

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


---------- ---------- ---------- ---------- ----------
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
7902 FORD 3000 3000
7876 ADAMS 1100 1100
7698 BLAKE 2850 2850
7782 CLARK 2450 2450
7788 SCOTT 3000 3000
7839 KING 5000 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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
371

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
7782 CLARK 2450 2450
7788 SCOTT 3000 3000
7839 KING 5000 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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
372

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;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
373

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:

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
374

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

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
375

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));

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
376

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
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
377

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.

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 20
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

14 rows selected.

SQL> CLEAR BREAK;


breaks cleared

SQL> SELECT * FROM EMP ORDER BY JOB;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
378

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

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')

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
379

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
380

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
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
381

HANUMAN SRI DEVI


HANUMAN SUNDARI

10 rows selected.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
382

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
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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
383

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.

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
384

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
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
385

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
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);

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
386

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
387

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
*
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
388

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
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
389

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);
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
390

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> /

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
391

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
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
392

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:

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
393

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> /
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 COUNTRY


---------- ---------- ---------- ---------- ----------
PAVAN GAYATRI HYD AP INDIA
PAVAN SRIDEVI HYD AP INDIA
PAVAN PRATHIMA HYD AP INDIA
KUMAR GAYATRI HYD AP INDIA
KUMAR SRIDEVI HYD AP INDIA
KUMAR PRATHIMA HYD AP INDIA
SRIRAM SHILPA HYD AP INDIA
SRIRAM SRIDEVI HYD AP INDIA
SRIRAM LALITHA HYD AP INDIA
RAVIKANTH USGIRL HYD AP INDIA
RAVIKANTH SRIDEVI HYD AP INDIA
RAVIKANTH LALITHA HYD AP INDIA

12 rows selected.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
394

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 /

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
395

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
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 /

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
396

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||'):' ||
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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
397

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);
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 '||

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
398

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
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);

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
399

12 V_NESTEDTABLE(26):=7;

13 BEGIN
14 V_VARRY.EXTEND(30);
15 EXCEPTION
16 WHEN SUBSCRIPT_OUTSIDE_LIMIT THEN
17 DBMS_OUTPUT.PUT_LINE(SQLCODE||SQLERRM);
18 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.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
400

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
401

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||')'||
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
402

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
403

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
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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
404

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
405

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
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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
406

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
------------------ -------
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
407

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';

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
408

; <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
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
409

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 CREATE OR REPLACE PROCEDURE LOCALPROC


2 AS
3 CURSOR C IS SELECT EMPNO,ENAME FROM EMP;
4 V_FORMATTEDNAME VARCHAR2(100);
5 FUNCTION FORMATNAME(P_EMPNO NUMBER,P_ENAME VARCHAR2)
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
410

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
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
411

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 /
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||')');

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
412

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 DECLARE
2 V_TEMPVAL NUMBER(10):=5;
3 -- TO SLOVE THE PROBLEM THAT WE ENCOUNTERED ABOVE.
4 -- FORWARD DECLARATION OF PROCEDURE B.
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)

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
413

B(1)
A(0)

PL/SQL procedure successfully completed.

OVERLOADING OF LOCAL SUBPROGRAMS:

1 DECLARE

2 -- OVERLOADING OF LOCAL SUBPROGRAMS

3 PROCEDURE LOCALPROC(P_PARAMETER IN NUMBER) IS


4 BEGIN
5 DBMS_OUTPUT.PUT_LINE(P_PARAMETER);
6 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
414

3 SELECT * FROM EMP;

Table created.

SQL> CREATE TABLE TEMP_TABLE

2 (V_EMPNO NUMBER);

Table created.

1 CREATE OR REPLACE PROCEDURE RAISE_SAL

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
415

6 RAISE_SAL(C1.EMPNO);

7 INSERT INTO TEMP_TABLE VALUES (C1.EMPNO);

8 END LOOP;

9 END;

10 /

Procedure created.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
416

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;
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
417

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;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
418

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
----------------------------------------------------------------------------------------------------
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
419

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;

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
420

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;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
421

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.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
422

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 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
423

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');

OBJECT_NAME
----------------------------------------------------------------------------------------------------
OBJECT_TYPE STATUS
------------------ -------
DEPENDER
PROCEDURE VALID

DEPENDEE
PACKAGE VALID

DEPENDEE
PACKAGE BODY 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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
424

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.

..

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

BEGIN
RAISE A;
RAISED EXCEPTION HERE.
HANDLED WHEN A THEN HERE
ONLY.
END;

END;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
426

PROPAGATION EXAMPLE:2

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
427

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 EXCEPTION
NO HANDLER.
THROWNTO WHEN A OTHERS
OUTER .. BLOCK.
END;

HERE EXCEPTION HANDLED.

EXCEPTION

WHEN B THEN

END;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
428

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 RAISE C;


HERENO HANDLER.
THROWN TOOUTER BLOCK. 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
429

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

END;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
430

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
431

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
432

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
433

DECLARE

ENABLING BEGIN A

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
434

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
435

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 ENABLE_EXEC
SYS_C002783

AAAH6PAABAAAPCAAAD D ENABLE_EXEC
SYS_C002783

1 DELETE FROM ENABLE_EXEC


2* WHERE ROWID IN (SELECT ROW_ID FROM EXCE_TAB)

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
436

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
437

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
438

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 SAL


---------- ---------- ----------
ANIL ACC 1500
SHANKER TATA 2000
JAYA CMC 1800
SUNIL CMC 1700
VIJAY TATA 5000
PRAKASH TATA 3000
AJAY ACC 8000

7 rows selected.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
439

SQL> SELECT * FROM EMP_ALL;

ENAME SAL
---------- ----------
SHANKER 2000
JAYA 1800
SUNIL 1700
VIJAY 5000
PRAKASH 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 SAL


---------- ---------- ----------
ANIL ACC 1500
SHANKER TATA 2000
JAYA CMC 1800
SUNIL CMC 1700
VIJAY TATA 5000
PRAKASH TATA 3000
AJAY ACC 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
440

ANIL 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
441

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
442

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
443

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
444

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
445

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 SINGLE-
BYTE 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
446

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
447

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
448

3 ECONOMY CLASS'
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
449

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
450

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
451

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
452

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;

10 OCCUR_VAR :=1;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
453

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;

4 BEGIN

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
454

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
455

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);

20* END;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
456

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
457

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
458

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
459

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
460

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
461

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
462

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;

SQL> /

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
463

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;

8 DIR_ALIAS_VAR VARCHAR2(25);

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
464

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
465

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
466

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;

3 FEXISTS_VAR INTEGER;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
467

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
468

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
469

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
470

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
471

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');

18 ELSE

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
472

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
473

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
474

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
475

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
476

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
477

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
478

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
479

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
480

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 SERVER


CLIENT BUSSINESS
USER TIER 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
481

CLIENT. FAT SERVER.


BUSSINESS SERVER.
USER TIER. LOGIC. 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. BUSSINESS LOGIC. SERVER.


USER BUSSINESS DATA SERVICES.
SERVICES. SERVICES.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
482

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
483

6 BEGIN

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
484

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
485

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
486

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
487

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
488

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
489

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 NO

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
490

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
491

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
492

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
493

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,

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
494

[(ARGUMENT[{IN|OUT|IN OUT}] TYPE]

{ 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
495

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
496

IF YOU ARE REPLACING THE ORIGINAL SOURCE CODE WITH NEW SET OF SOURCE
CODE, USE THE OR REPLACE OPTION.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
497

2 WHERE OBJECT_NAME='GAYATRI' AND OBJECT_TYPE='PROCEDURE';

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
498

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
499

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
500

DML STATEMENTS CAN BE INCLUDED DIRECTLY IN PL/SQL BLOCKS.THIS CAN BE


RECTIFIED,HOWEVER,
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))';

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
501

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 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))';

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
502

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 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
503

7
8
9
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
504

SQL> DESC NATIVE1


Name Null? Type
----------------------------------------------------- -------- ------------------------------------
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
505

8 --CREATE TABLE MY_EMPLOYEE


9 SQL_STMT := 'CREATE TABLE MY_EMPLOYEE ' ||
10 'AS SELECT * FROM EMP WHERE DEPTNO = ' || V_DEPTNO;
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
506

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);

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
507

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 ;
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
508

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 /
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
509

-------- -----------------------------------------------------------------
0/0 PL/SQL: Compilation unit analysis terminated
1/24 PLS-00201: identifier 'BOOK_TYPE' must be declared
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 /

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
510

1 row created.

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 DECLARE
2 MBOOK STUDENT.BOOKS_ISSUED%TYPE;
3 MNAME STUDENT.STUDENT_NAME%TYPE;
4 CURSOR C IS SELECT STUDENT_NAME,BOOKS_ISSUED FROM STUDENT;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
511

5 BEGIN
6 OPEN C;
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
512

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'))

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
513

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
514

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'))

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
515

FOR DELETING A ROW FROM THE NESTED TABLE USING THE CONDITION FROM THE
NESTED TABLE.

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
516

LINE/COL ERROR
-------- -----------------------------------------------------------------
1/32 PLS-00103: Encountered the symbol "BOOKS_TYPE" when expecting one
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> /

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
517

1 row created.

SQL> SELECT * FROM STUDENTS;

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
518

WHERE STUDENT_NO=100;

COMMIT;
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
519

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 CREATE OR REPLACE TRIGGER AFTER_INSERT_TAB


2 AFTER INSERT ON EMP_D
3 BEGIN

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
520

4 INSERT INTO TRIG_INSERT


5 VALUES
6 ('AFTER INSERT TAB LVL',SYSTIMESTAMP);
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
521

BFORE_INSERT_ROW
BFORE_INSERT_TAB

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
522

SQL> DESC USER_TRIGGERS


Name Null? Type
----------------------------------------------------- -------- ------------------------------------
TRIGGER_NAME VARCHAR2(30)
TRIGGER_TYPE VARCHAR2(16)
TRIGGERING_EVENT VARCHAR2(227)
TABLE_OWNER VARCHAR2(30)
BASE_OBJECT_TYPE VARCHAR2(16)
TABLE_NAME VARCHAR2(30)
COLUMN_NAME VARCHAR2(4000)
REFERENCING_NAMES VARCHAR2(128)
WHEN_CLAUSE VARCHAR2(4000)
STATUS VARCHAR2(8)
DESCRIPTION VARCHAR2(4000)
ACTION_TYPE VARCHAR2(11)
TRIGGER_BODY 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
523

---------------------------------------------------------------------------
BFORE INSERT TAB LVL
19-SEP-05 12.52.39.000000 AM

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> /

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
524

Trigger created.

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
525

no rows selected

SQL> UPDATE EMP_D


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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
526

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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
527

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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
528

19-SEP-05 01.04.06.000001 AM

AFTER UPDATE ROW LVL


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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
529

SQL> SELECT * FROM TRIG_DELETE;

no rows selected

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
530

1 CREATE OR REPLACE TRIGGER AFTER_DELETE_ROW


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
531

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

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


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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
533

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

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
534

THESE TYPES OF CURSOR DECLARATIONS ARE USED TO PASS A CURSOR AS A


PARAMETER TO A PROGRAM OR A PACKAGE.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
535

SQL> CREATE OR REPLACE PACKAGE BODY DEPT_DATA AS


2 PROCEDURE OPEN_DEPT_CV(DEPT_CV IN OUT DEPTCURTYP) IS
3 BEGIN
4 OPEN DEPT_CV FOR SELECT * FROM DEPT;
5 END OPEN_DEPT_CV;
6 END DEPT_DATA;
7 /

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
536

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
537

-------- -----------------------------------------------------------------
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
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 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
538

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> 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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
539

EMPNO ENAME JOB MGR HIREDATE SAL COMM


DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7566 JONES MANAGER 7839 02-APR-81 2975 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20

SQL> EXECUTE EMP_DATA.OPEN_EMP_CV(:EMPCUR,2);

PL/SQL procedure successfully completed.

EMPNO ENAME JOB MGR HIREDATE SAL COMM


DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7566 JONES MANAGER 7839 02-APR-81 2975 20
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7902 FORD ANALYST 7566 03-DEC-81 3000 20

SQL> EXECUTE EMP_DATA.OPEN_EMP_CV(:EMPCUR,1);

PL/SQL procedure successfully completed.

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
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 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
540

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
541

30 SALES CHICAGO
40 OPERATIONS BOSTON

SQL> EXECUTE EMP_DATA.OPEN_CV(:CUR,1);

PL/SQL procedure successfully completed.

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.

ORACLE 9I FEATURES:

ORACLE OFFERS A COMPREHENSIVE HIGH-PERFORMANCE INFRASTRUCTURE FOR E-


BUSSINESS.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
542

ORACLE 9I DATABASE SERVER.

BOTH PROVIDE COMPLETE AND SIMPLE INFRASTRUCTURE FOR INTERNET


APPLICATIONS.

THE ORACLE 9I APPLICATION SERVER RUNS ALL YOUR APPLICATIONS.

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
543

DEFAULT HEADING JUSTIFICATION CENTRE.

HEADING DISPLAY UPPERCASE.

SQL*PLUS:

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
544

/ DIVIDE.

OPERATOR PRECEDENCE:

* / + -

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 COMPONENT


CONDITIONS ARE TRUE.

OR RETURN TRUE IF EITHER COMPONENT


CONDITION IS TRUE.

NOT RETURNS TRUE IF THE FOLLOWING


CONDITION IS FALSE.

RULES OF PRECENDENCE:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
545

ORDER EVALUATED. OPERATOR.

1 ARITHEMITIC OPERATORS.

2 CONCATENATION OPERATOR.

3 COMPARISION OPERATORS.

4 IS[NOT] NULL, LIKE[NOT] IN.

5 [NOT] BETWEEN.

6 NOT LOGICAL CONDITION.

7 AND LOGICAL CONDITION.

8 OR LOGICAL CONDITION.

SQL FUNCTIONS:

SQL FUNCTIONS ARE OF TWO TYPES.

SINGLE-ROW-FUNCTIONS.

MULTIPLE-ROW-FUNCTIONS.

SINGLE-ROW-FUNCTIONS.

CHARACTER.

NUMBER.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
546

DATE.

CONVERSION.

GENERAL.

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
547

MONTHS_BETWEEN.

ADD_MONTHS.

NEXT_DAY.

LAST_DAY.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
548

EXPLICIT DATA-TYPE CONVERSION.

IMPLICIT DATA-TYPE CONVERSIONS:

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 ORACLE SERVER CAN


AUTOMATICALLY CONVERT FOLLOWING.

FROM TO

VARCHAR2 OR CHAR NUMBER.

VARCHAR2 OR CHAR DATE.

EXPLICIT DATA-TYPE CONVERSIONS:

CHARACTER --------- TO_NUMBER --------- NUMBER --------- TO_CHAR ---------


CHARACTER.

CHARACTER --------- TO_DATE --------- DATE --------- TO_CHAR --------- CHARACTER.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
549

ELEMENTS OF THE DATE FORMAT MODEL:

YYYY FULL YEAR IN NUMBER.

YEAR YEAR SPELLED OUT.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
550

VARIANCE.

SELECT COLUMN . [COLUMN],GROUP FUNCTION FROM TABLE

[WHERE CONDITION]

[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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
551

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.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
552

THERE ARE FOUR CATEGORIES OF DATA DICTIONARY VIEWS; EACH CATEGORY HAS A
DISTINCT PREFIX THAT REFLECTS ITS INTENDED USE.

PREFIX DESCRIPTION

USER_ THESE VIEWS CONTAIN INFORMATION ABOUT


OBJECTS
OWNED BY THE USER.

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
553

DATATYPES:

DATA TYPE DESCRIPTION

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
554

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
555

2 ADD CONSTRAINT EMP_D_FK FOREIGN KEY(DEPTNO) REFERENCES


DEPT_D(DEPTNO);

Table altered.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
556

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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
557

*
ERROR at line 2:
ORA-12991: column is referenced in a multi-column constraint

SQL> ALTER TABLE TEST1


2 DROP (PK);
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),

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
558

8* CONSTRAINT TEST2_CK2 CHECK(COL2 > 0))


9 /

Table created.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
559

3* WHERE TABLE_NAME='EMP_DU'
SQL> /

CONSTRAINT_NAME C
------------------------------ -
SEARCH_CONDITION
--------------------------------------------------------------------------------
PAVAN_NN C
"JOB" IS NOT NULL

PAVAN_CK C
SAL > 1000

PAVAN_PK P

PAVAN_UK U

PAVAN_FK R

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
560

DOMAIN INTEGRITY CONSTRAINTS.

NOT NULL

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
561

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 /

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
562

Trigger created.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
563

2 BEFORE UPDATE ON EMP


3 BEGIN
4 INSERT INTO DML_EX
5 VALUES
6 ('BEFOREUPDATE',SYSTIMESTAMP);
7* END;
8 /

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
564

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> /

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
565

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
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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
566

1 row deleted.

SQL> SELECT * FROM DML_EX;

ACTION
--------------------------------------------------
TDATE
---------------------------------------------------------------------------
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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
567

SQL> DELETE FROM DML_EX;

4 rows deleted.

SQL> SELECT * FROM DML_EX;

no rows selected

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

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

ACTION
--------------------------------------------------
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
---------------------------------------------------------------------------

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
569

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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
570

{BEFORE |AFTER|{DDL EVENT} ON {DATABASE|SCHEMA}

DECLARE

VARIABLE DECLARATIONS.

BEGIN

.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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
571

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;
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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
572

SQL> 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 /
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
573

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
574

CREATE [OR REPLACE] TRIGGER TRIGGER_NAME

{BEFORE|AFTER{DATABASE EVENT} ON {DATABASE|SCHEMA}

DECLARE

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
575

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
4 AND A.SAL < B.MAXSAL ORDER BY ENAME;

ENAME SAL DEPTNO MAXSAL


---------- ---------- ---------- ----------
ADAMS 1100 20 3000
ALLEN 1600 30 2850
CLARK 2450 10 5000
JAMES 950 30 2850
JONES 2975 20 3000
MARTIN 1250 30 2850
MILLER 1300 10 5000
SMITH 800 20 3000
TURNER 1500 30 2850
WARD 1250 30 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 DEPTNO


---------- ---------- ----------
ADAMS 1100 20
ALLEN 1600 30
CLARK 2450 10
JAMES 950 30
JONES 2975 20
MARTIN 1250 30
MILLER 1300 10
SMITH 800 20
TURNER 1500 30
WARD 1250 30

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
576

10 rows selected.

TOP-N ANALYSIS:

TOP-N QUERIES ASK FOR THE N LARGEST OR SMALLEST VALUES OF A COLUMN.

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
577

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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
578

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.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
579

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.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
580

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.

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
581

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

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;

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
582

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
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
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

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
583

7839 KING PRESIDENT 17-NOV-81 5000 10


7844 TURNER SALESMAN 7698 08-SEP-81 500 0 30
CONTROLLING USER ACCESS:

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
584

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.

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 TABLE,CREATE SEQUENCE,CREATE


VIEW,CREATE PROCEDURE TO PAVAN;
Grant succeeded.

GRANTING PRIVILEGES WITH THE PERMISSION TO GRANT TO OTHER


USERS:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
585

SQL> GRANT CREATE SESSION,CREATE TABLE,CREATE SEQUENCE,CREATE


VIEW,CREATE PROCEDURE TO PAVAN
WITH ADMIN OPTION:

Grant succeeded.

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 TABLE,CREATE SEQUENCE,CREATE


VIEW,CREATE PROCEDURE TO MANAGER;
Grant succeeded.

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
586

AN OBJECT PRIVILEGES IS A PRIVILEGE OR RIGHT TO PERFORM A PARTICULAR


ACTION ON A SPECIFIC TABLE,VIEW,SEQUENCE OR PROCEDURE.

OBJECT TABLE VIEW SEQUENCE PROCEDURE


PRIVILEGE
ALTER YES YES
DELETE YES YES
EXECUTE YES
INDEX YES
INSERT YES YES
REFERENCES YES
SELECT YES YES YES
UPDATE 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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
587

SQL> GRANT SELECT ON EMP


2 TO PUBLIC;
Grant succeeded.

GIVING ALL THE PRIVILEGES ON TABLE TO USER:

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


*

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
588

ERROR at line 1:
ORA-01927: cannot REVOKE privileges you did not grant

SQL> REVOKE SELECT ON EMP


2 FROM PUBLIC;
Revoke succeeded.

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
589

COLLECTION OF TABLES CREATED AND MANTAINED BY THE USER.


CONTAINS USER INFORMATION.

DATA DICTIONARY:

COLLECTION OF TABLES CREATED AND MAINTAINED BY THE ORACLE


SERVER,CONTAINS DATABASE INFORMATION.
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_ THESE VIEWS CONTAIN INFORMATION ABOUT OBJECTS OWNED BY THE


USER.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
590

(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.

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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
591

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.

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 ON RESOURCES WHENEVER A READ


OPERATION(SELECT) IS PERFORMED.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
592

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.

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
593

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:

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
594

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;

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
595

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.

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>);

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
596

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))

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
597

2 VALUES

3* (12,'ALLEN','CLERK')

SQL> /

1 row created.

1 INSERT INTO ANGEL

2 VALUES

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)

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
598

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

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> /

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
599

1 row created.

1 INSERT INTO ANGEL2

2 VALUES

3* ('O026','23-FEB-99','V002')

SQL> /

1 row created.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
600

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
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:

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
601

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);

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.

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
602

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


---------- ---------- ----------
21 FORD MANAGER
22 DON 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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
603

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);

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> /

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
604

1 row created.

1 INSERT INTO ANGEL4


2 VALUES
3* (12,'FORD','MANAGER')
SQL> /

1 row created.

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

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
605

3* (19,'JULI','CLERK')
SQL> /

1 row created.

SQL> COMMIT;

Commit complete.

SQL> SELECT * FROM ANGEL4 PARTITION(EM1);

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 ANGEL4 EXCHANGE PARTITION EM2 WITH TABLE


EXCHANGE_PAR;

Table altered.

SQL> SELECT * FROM ANGEL4 PARTITION(EM2);

EMPNO ENAME JOB


---------- ---------- ----------
17 SCOTT CLERK
18 KING CLERK
19 JULI CLERK

I Soft Solutions ,Bang-54. STRUCTURED QUERY LANGUAGE


ORACLE
606

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 NON-


PARTITIONED TABLE,AND A TABLE INTO A PARTITION OF A PARTITIONED TABLE BY
EXCHANGING THEIR DATA SEGMENTS.

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

Potrebbero piacerti anche