Oracle Database 19c Student Guide
Oracle Database 19c Student Guide
Database :-
-----------------
Types of Databases :-
-----------------------------
C create
R read
U update
D delete
DBMS :-
------------
USER--------------------DBMS------------------DB
Evolution of DBMS :-
---------------------------
RDBMS :-
-------------
Information rule :-
------------------------
=> according to information rule data must be organized in tables
i.e. rows and columns
customers
cid cname city => columns/fields/attributes
100 sachin mum
101 rahul del
102 vijay hyd => row/record/tuple
=> every table must contain primary key to uniquely identify records
ex :- accno,empid,aadharno,panno,voterid
RDBMS features :-
---------------------------
RDBMS softwares :-
---------------------------
SQL Databases :-
------------------------
ORDBMS :-
------------------
ORDBMS softwares :-
---------------------------------
what is db ?
what is dbms ?
what is rdbms ?
what is ordbms ?
===========================================================
ORACLE
------------
versions :-
--------------
2,3,4,5,6,7,8i,9i,10g,11g,12c,18c,19c,21c,23c
i => internet
g => grid
c => cloud
=> grid means collection of servers , from 10g onwards oracle db can
be accessed through multiple servers and the advantage of grid is
it improves db availability.
1 on premises
2 on cloud
1 server
2 client
SERVER :-
------------
1 DB
2 INSTANCE
=> DB is created in hard disk and acts as permanent storage
=> INSTANCE is created in ram and acts as temporary storage
CLIENT :-
--------------
=> client is also a system from where users can
1 connects to server
2 submit requests to server
3 receives response from server
client tools :-
----------------
SQL :-
---------
user-----sqlplus-----------------------sql-------------------------
oracle-------------db
user----mysqlworkbench---------------sql-----------------mysql-----------db
user-------ssms----------------------------sql-------------------sql
server--------db
user------pgadmin---------------------------sql------------------
postgresql---------db
SQL
SCHEMA :-
----------------
SERVER
DATABASE
USERS
TABLES
DATA
SERVER
ORCL
SYS/MANAGER (DBA)
SYSTEM/MANAGER (DBA)
USERNAME :- SYSTEM
PASSWORD :- MANAGER
OR
USERNAME :- SYSTEM/MANAGER
USERNAME :- SYSTEM/MANAGER
syntax :-
Example :-
NOTE :- a user is created with name BATCH39 but the user is dummy
because user is not having not having permissions to connect to db
and create tables.
Changing password :-
-------------------------------
by user :- (BATCH39/ORACLE)
-------------
SQL> PASSWORD
Changing password for BATCH39
Old password: ORACLE
New password: TIGER
Retype new password: TIGER
Password changed
by dba :-
-----------
===================================================================
DATATYPES IN ORACLE :-
-------------------------------------
DATATYPES
ASCII types :-
------------------
=> ascii types allows ascii chars (256) that includes a-z,A-Z,0-9,special chars
char(size) :-
----------------
ex :- NAME CHAR(10)
SACHIN - - - -
wasted
RAVI - - - - - -
wasted
=> In char datatype extra bytes are wasted , so char is not recommended for
variable length fields and char is recommended for fixed length fields.
ex :- GENDER CHAR(1)
M
F
STATE_CODE CHAR(2)
AP
TG
PANNO CHAR(10)
varchar2(size) :-
-------------------------
ex :- NAME VARCHAR2(10)
SACHIN - - - -
released
EMAILID VARCHAR2(30)
LONG :-
--------------
ex :- REVIEW LONG
CLOB :-
-------------
ex :- TEXT CLOB
NCHAR/NVARCHAR2/NCLOB :-
---------------------------------------------
=> allows unicode chars (65536) that includes all ascii chars and also chars
belongs to different languages.
NUMBER(P) :-
-------------------
ex :- EMPID NUMBER(4)
10
100
1000
10000 => not allowed
AADHARNO NUMBER(12)
MOBILE NUMBER(10)
ACCNO NUMBER(11)
07-AUG-24
NUMBER(P,S) :-
------------------------
ex :- SALARY NUMBER(7,2)
5000
5000.55
50000.55
500000.55 => NOT ALLOWED
BALANCE NUMBER(12,4)
SAVG NUMBER(5,2)
DATE :-
-------------
TIMESTAMP :-
--------------------
ex :- T TIMESTAMP
07-AUG-24 9:50:20.123
--------------- ---------- -------
DATE TIME MS
Binary Types :-
--------------------
=> binary types are used for storing multimedia objects like audio,video,images
=> oracle supports 2 binary types
=> BFILE is called external lob because lob is stored outside db but db stores
path.
=> BLOB is called internal lob because lob is stored inside db.
=> if security is njot important then use BFILE , if security is important then
use BLOB.
CREATING TABLES :-
-----------------------------
syntax :-
Rules :-
Example :-
=> create table with following structure ?
EMP
EMPID ENAME JOB SAL HIREDATE DNO
=> above command created table structure / defintion / metadata that includes
columns,
datatype and size.
DESC :- (DESCRIBE)
------------
Ex :- DESC EMP
EMPID NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(10)
SAL NUMBER(7,2)
HIREDATE DATE
DNO NUMBER(2)
1 single row
2 mutiple rows
syn :-
---------
Ex :-
=> insert command can be executed multiple times with different values using
variables prefixed with "&".
1 row created.
1 row created.
8-aug-24
inserting nulls :-
-----------------------
method 1 :-
---------------
method 2 :-
----------------
NOTE :-
=> above insert commands inserted data into instance which is temporary storage
to save this data execute commit.
SQL>COMMIT ;
=> after executing commit then data is copied to db which is permanent storage
Operators in oracle :-
-----------------------------
Displaying Data :-
-------------------------
sql = english
queries = sentences
clauses = words
WHERE clause :-
------------------------
=> where clause is used to display specific row/rows from table based on a
condition
SELECT columns / *
FROM tabname
WHERE condition ;
condition :-
------------------
COLNAME OP VALUE
=> OP must be any relational operator like = > >= < <= = <>
=> if cond = true row is selected
=> if cond = false row is not selected
examples :-
9-aug-24
compound condition :-
-------------------------------
SELECT *
FROM EMP
WHERE JOB='clerk' OR JOB='manager' ;
SELECT *
FROM EMP
WHERE EMPID=100 OR EMPID=103 OR EMPID=105 ;
SELECT *
FROM EMP
WHERE DNO = 20 AND JOB='clerk' ;
=> employees belongs to 20th dept working as clerk and earning more than 4000 ?
SELECT *
FROM EMP
WHERE DNO=20 AND JOB='clerk' AND SAL>4000 ;
=> employees earning more than 5000 and less than 10000 ?
SELECT *
FROM EMP
WHERE SAL>5000 AND SAL<10000 ;
SELECT *
FROM EMP
WHERE HIREDATE >= '01-JAN-2020'
AND
HIREDATE <= '31-DEC-2020' ;
=>
STUDENT
SNO SNAME S1 S2 S3
1 A 80 90 70
2 B 30 60 50
SELECT *
FROM STUDENT
WHERE S1>=35 AND S2>=35 AND S3>=35 ;
SELECT *
FROM STUDENT
WHERE S1<35 OR S2<35 OR S3<35 ;
=> employees working as clerk,manager and earning more than 5000 ?
SELECT *
FROM EMP
WHERE JOB='clerk' OR job='manager' AND sal > 5000 ;
---------------
-------------------------------------------
=> above query returns clerk records earning less than 5000 because
sal>5000 is applied only to managers but not to clerk because
operator AND has more priority then operator OR , to control this use ( )
SELECT *
FROM EMP
WHERE (JOB='clerk' OR job='manager') AND sal > 5000
IN operator :-
------------------
SELECT *
FROM EMP
WHERE EMPID IN (100,103,105) ;
SELECT *
FROM EMP
WHERE ENAME IN ('sachin','rahul','vijay') ;
SELECT *
FROM EMP
WHERE DNO NOT IN (10,20) ;
BETWEEN operator :-
--------------------------------
SELECT *
FROM EMP
WHERE HIREDATE BETWEEN '01-JAN-2020' AND '31-DEC-2020' ;
SELECT *
FROM EMP
WHERE HIREDATE NOT BETWEEN '01-JAN-2020' AND '31-DEC-2020' ;
COL=V1
OR
COL=V2 ===================> COL IN (V1,V2,V3,)
OR
COL=V3
COL>=V1
AND ====================> COL BETWEEN V1 AND V2
COL<=V2
=> employees working as clerk,manager and earning between 5000 and 10000
and working for dept 10,20 and not joined in 2020 year ?
SELECT *
FROM EMP
WHERE JOB IN ('clerk','manager')
AND
SAL BETWEEN 5000 AND 10000
AND
DNO IN (10,20)
AND
HIREDATE NOT BETWEEN '01-JAN-20' AND '31-DEC-20' ;
products
prodid pname price category brand
SELECT *
FROM PRODUCTS
WHERE BRAND IN ('samsung','redmi','realme')
AND
PRICE BETWEEN 10000 AND 20000
AND
CATEGORY='mobiles' ;
LIKE operator :-
-----------------------
examples :-
=>
SELECT *
FROM EMP
WHERE JOB IN ('clerk','man%') ;
A returns error
B returns only clerk
C returns clerk,manager
D none
ANS :- B
ANS :- C
IS operator :-
------------------
10-aug-24
ALIAS :-
-----------
Ex :-
SELECT ENAME,SAL,
SAL*0.2 AS HRA,
SAL*0.3 AS DA,
SAL*0.1 AS TAX,
SAL + (SAL*0.2) + (SAL*0.3) - (SAL*0.1) AS TOTSAL
FROM EMP ;
smith 800 160 240 80 1120
INSERT
UPDATE
DELETE
MERGE
INSERT ALL
UPDATE command :-
------------------------------
UPDATE tabname
SET colname = value , colname = value , ----------
[WHERE cond] ;
Ex :-
=> update 7369 employee sal with 1000 and comm with 500 ?
UPDATE EMP
SET SAL = 1000 , COMM = 500
WHERE EMPNO = 7369 ;
=> increment sal by 20% and comm by 10% those working as salesman and
joined in 1981 year ?
UPDATE EMP
SET SAL = SAL + (SAL*0.2) , COMM = COMM + (COMM*0.1)
WHERE JOB='SALESMAN'
AND
HIREDATE LIKE '%81' ;
=> transfer all the employees from 10th dept 20th dept ?
UPDATE EMP
SET DEPTNO = 20
WHERE DEPTNO = 10 ;
DELETE command :-
------------------------------
Ex :-
CREATE
ALTER
DROP
TRUNCATE
RENAME
FLASHBACK
PURGE
Ex 1 :-
output :-
Ex 2 :-
output :-
select * from a ;
10
20
12-aug-24
ALTER command :-
----------------------------
1 add columns
2 drop columns
3 rename a column
4 modify a column
changing size
changing datatype
Adding columns :-
---------------------------
Ex :-
after adding by default the new column is filled with nulls , to insert data into
the new column
use update command.
1 row updated
1 row updated
SQL> COMMIT ;
Droping columns :-
----------------------------
Ex :-
Renaming a column :-
-------------------------------
Ex :-
ALIAS RENAME
Modifying a column :-
-----------------------------
Ex :-
DROP command :-
--------------------------
Ex :-
=> when table is dropped then it is moved to recyclebin , to see the recyclebin
SQL>SHOW RECYCLEBIN
FLASHBACK command :-
------------------------------------
=> command to recover table from recyclebin.
=> useful when tables are dropped accidentally.
Ex :-
PURGE command :-
----------------------------
Ex :-
SQL>PURGE RECYCLEBIN ;
13-aug-24
TRUNCATE command :-
---------------------------------
=> command deletes all the data from table but keeps structure
=> will empty the table
=> releases memory allocated for table
=> oracle goes to memory and releases all the block allocated for table and
when blocks are
released data stored in memory also deleted.
DELETE VS TRUNCATE :-
-------------------------------------
DELETE TRUNCATE
1 DML DDL
2 can delete all rows and can delete only all rows
specific rows but cannot delete specific rows
6 slower faster
RENAME :-
---------------
Ex :-
Built-in Functions :-
---------------------------
=> a function accepts some input performs some calculation and returns one value
Types of functions :-
----------------------------
1 STRING/CHAR
2 NUMERIC
3 DATE
4 CONVERSION
5 SPECIAL
6 ANALYTICAL OR WINDOW OR OLAP
7 GROUP OR AGGREGATE
UPPER() :-
-------------
UPPER(arg)
string => 'hello'
colname => ename
Ex :-
LOWER() :-
------------------
LOWER(arg)
Ex :-
INITCAP() :-
-----------------
INITCAP(arg)
Ex :-
LENGTH() :-
-----------------
LENGTH(arg)
Ex :-
SELECT *
FROM EMP
WHERE LENGTH(ENAME) > 5 ;
SUBSTR() :-
------------------
SUBSTR(string,start,[no of chars])
EX :-
SELECT EMPNO,ENAME,
SUBSTR(ENAME,1,3)||SUBSTR(EMPNO,1,3)||'@[Link]' AS EMAILID
FROM EMP ;
14-AUG-24
UPDATE EMP
SET EMAILID = SUBSTR(ENAME,1,3)||SUBSTR(EMPNO,1,3)||'@[Link]' ;
INSTR() :-
-------------
Ex :-
SELECT *
FROM EMP
WHERE INSTR(ENAME,'a') <> 0 ;
CUST
CID CNAME
10 sachin tendulkar
11 rohit sharma
SUBSTR(string,start,[no of chars])
SELECT CID,
SUBSTR(CNAME,1,INSTR(CNAME,' ')-1) AS FNAME,
SUBSTR(CNAME,INSTR(CNAME,' ')+1) AS LNAME
FROM CUST ;
CUST
CID CNAME
10 sachin ramesh tendulkar
11 mahendra singh dhoni
Ex :-
=>
ACCOUNTS
ACCNO BAL
123456789371 10000
LPAD('X',4,'X')||SUBSTR(ACCNO,-4,4)
RTRIM,LTRIM :-
----------------------
Ex :-
REPLACE() :-
---------------------
REPLACE(str1,str2,str3)
Ex :-
SELECT *
FROM EMP
WHERE LENGTH(ENAME) - LENGTH(REPLACE(ENAME,'a','')) = 2 ;
16-aug-24
TRANSLATE() :-
---------------------
TRANSLATE(str1,str2,str3)
Ex :-
E => A
L => B
O => C
=> translate function can be used to encrypt data i.e. converting plain text to
cipher text.
SELECT ENAME,
TRANSLATE(SAL,'0123456789','$bT*p@E#%^') AS SAL
FROM EMP ;
SELECT
REPLACE(TRANSLATE( '@#HE*^LL%$O!*' , '@#*^%$!','$$$$$$$') ,
'$','')
F ROM DUAL
---------------------------------------------------------------------------
$$HE$$LL$$O$$
NUMERIC functions :-
-------------------------------
rounding numbers :-
---------------------------
ROUND
TRUNC
CEIL
FLOOR
38.7865 => 39 / 38
38.7
38.78
38.786
ROUND() :-
-----------------
Ex :-
ROUND(38.7865) => 39
38-------------------------------38.5--------------------------------39
ROUND(38.4865) => 38
ROUND(38.9864,1) => 39
300---------------------------------350---------------------------------400
380------------------------------------
385----------------------------------------390
ROUND(384,-3) => 0
0----------------------------------------
500----------------------------------------1000
TRUNC() :-
---------------
TRUNC(number,[decimal places])
Ex :-
TRUNC(38.7864) => 38
TRUNC(38.7864,2) => 38.78
TRUNC(38.7864,1) => 38.7
TRUNC(384,-2) => 300
TRUNC(999,-3) => 0
CEIL() :-
------------
CEIL(number)
Ex :-
FLOOR() :-
------------------
FLOOR(number)
Ex :-
FLOOR(38.9) => 38
DATE functions :-
-------------------------
=> ROUND / TRUNC functions can also be applied on dates but dates can be rounded
to
year / month / day.
01-JAN-24----------------------------------30-JUN-----------------------01-
JAN-25
01-AUG-24----------------------------------15-
AUG--------------------------------------01-SEP-24
ROUND(SYSDATE,'DAY') => 18-AUG-24
11-AUG-24---------------------------------------
THU--------------------------------------------18-AUG-24
ADD_MONTHS() :-
-------------------------
ADD_MONTHS(DATE,NUMBER)
Ex :-
Question 1 :-
Question 2 :-
GOLD_RATES
DATEID RATE
01-JAN-20 ?
02-JAN-20 ?
16-AUG-24 ?
SELECT *
FROM EMP
WHERE HIREDATE >= ADD_MONTHS(SYSDATE,-60) ;
17-aug-24
MONTHS_BETWEEN() :-
-----------------------------------
=> returns no of months between two dates
MONTHS_BETWEEN(DATE1,DATE2)
Ex :-
MONTHS_BETWEEN(SYSDATE,'17-AUG-23') => 12
SELECT ENAME,
FLOOR(MONTHS_BETWEEN(SYSDATE,HIREDATE)) AS EXPR
FROM EMP ;
SELECT ENAME,
FLOOR(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12) AS YEARS,
MOD(FLOOR(MONTHS_BETWEEN(SYSDATE,HIREDATE)),12) AS MONTHS
FROM EMP ;
conversion functions :-
-------------------------------
1 TO_CHAR
2 TO_DATE
3 TO_NUMBER
TO_CHAR(number,'format')
formats :-
--------------
9 represents a digit
0 represents a digit
G thousand seperator
D decimal seperator
L currency symbol
C currency
Ex :-
formats :-
--------------
yyyy 2024
yy 24
year twenty twenty four
mm 08
mon aug
month august
Q Quarter (1-4)
jan-mar 1
apr-jun 2
jul-sep 3
oct-dec 4
21-AUG-24
SELECT *
FROM EMP
WHERE TO_CHAR(HIREDATE,'YYYY') IN (1980,1983,1985) ;
SELECT *
FROM EMP
WHERE MOD(TO_CHAR(HIREDATE,'YYYY'),4) = 0 ;
SELECT *
FROM EMP
WHERE TO_CHAR(HIREDATE,'MM') IN (1,4,12) ;
SELECT *
FROM EMP
WHERE YEAR = 1981
AND
QUARTER = 2 ;
SELECT *
FROM EMP
WHERE TO_CHAR(HIREDATE,'YYYY') = 1981
AND
TO_CHAR(HIREDATE,'Q') = 2 ;
SELECT *
FROM EMP
WHERE TO_CHAR(HIREDATE,'DD-MON-YYYY') = TO_CHAR(SYSDATE,'DD-MON-YYYY') ;
Ex :-
ex :-
Special functions :-
------------------------
NVL() :-
-----------
NVL(arg1,arg2)
Ex :-
22-aug-24
=> find ranks of the employees based on sal and highest paid employee should get
1st rank ?
SELECT EMPNO,ENAME,SAL,
RANK() OVER (ORDER BY SAL DESC) AS RNK
FROM EMP ;
SELECT EMPNO,ENAME,SAL,
DENSE_RANK() OVER (ORDER BY SAL DESC) AS RNK
FROM EMP ;
1 rank function generates gaps but dense_rank will not generate gaps
2 in rank function ranks may not be in sequence but in dense_rank ranks are
always in sequence
=> find ranks of the employees based on sal , if salaries are same then ranking
should be
based on hiredate ?
SELECT EMPNO,ENAME,HIREDATE,SAL,
DENSE_RANK() OVER (ORDER BY SAL DESC,HIREDATE ASC) AS RNK
FROM EMP ;
STUDENT
SNO SNAME M P C
1 A 80 90 70
2 B 60 50 70
3 C 90 80 70
4 D 90 70 80
5 E 80 60 70
=> these functions process group of rows and returns one value
MAX
MIN
SUM
AVG
COUNT
COUNT(*)
MAX() :-
------------
MAX(arg)
Ex :-
MIN() :-
------------
MIN(arg)
SUM() :-
------------
SUM(arg)
29000----------------29050-----------------------29100
=> after rounding display total sal with thousand seperator and currency symbol ?
SELECT
TO_CHAR(ROUND(SUM(SAL) , -2) , 'L99G999')
FROM EMP ;
O/P :- $29,000
AVG() :-
-----------
AVG(arg)
Ex :-
NOTE :-
COUNT() :-
----------------
COUNT(arg)
SELECT COUNT(COMM) FROM EMP ; => 4 => nulls are not counted
COUNT(*) :-
------------------
T1
F1
10
NULL
20
NULL
30
COUNT(F1) => 3
COUNT(*) => 5
==========================================================================
INTEGRITY CONSTRAINTS
======================
=> Integrity constraints are rules to maintain data integrity i.e. data quality
or data consistency.
=> used to prevent users from entering invalid data.
=> used to enforce rules like min bal must be 1000
Types of constraints :-
-----------------------------
1 NOT NULL
2 UNIQUE
3 PRIMARY KEY
4 CHECK
5 FOREIGN KEY
6 DEFAULT
NOT NULL :-
------------------
ex :-
UNIQUE :-
----------------
Ex :-
PRIMARY KEY :-
------------------------
=> In tables one column must be there to uniquely identity the rows and into
that
columns duplicates and nulls are not allowed, so declare that column with
primary key.
ex :-
NOTE :-
=> a table can have only one primary key , if we want multiple primary keys
then
declare one column with primary key and other columns with UNIQUE NOT NULL.
CHECK :-
---------------
CHECK(condition)
23-AUG-24
FOREGIN KEY :-
------------------------
=> to establish relationship between two tables take primary key of one table
and add it to another table as foreign key and declare with references
constraint
ex :-
PROJECTS
PROJID NAME DURATION COST CLIENT
100 ABC 5 200 TATA
101 KLM 4 100 AIRLINES
EMP
EMPID ENAME JOB SAL PROJID REFERENCES PROJECTS(PROJID)
1 A SE 30000 100
2 B SSE 60000 999 => NOT ALLOWED
3 C SE 40000 100
4 D QAE 30000 NULL
=> values entered in fk column should match with values entered in pk column
=> after declaring foreign key a relationship is established between two tables
called
parent / child relationship.
Relationship types :-
-----------------------------
=> by default oracle creates one to many relationship between two tables
=> to establish one to one relationship between two tables then declare foreign key
with unique
constraint.
ex :-
DEPT
DEPTID DNAME
10 HR
20 IT
30 SALES
MGR
MGRNO MNAME DEPTID REFERENCES DEPT(DEPTID) UNIQUE
1 A 10
2 B 20
3 C 30
4 D 10 => INVALID
=> to establish many to many relationship between two tables , create 3rd table
and add primary keys of the both tables as foreign keys
ex :-
STUDENT COURSE
SID SNAME CID CNAME
1 A 10 JAVA
2 B 11 ORACLE
REGISTRATIONS
SID CID DOR FEE
1 10 ? ?
1 11 ? ?
2 10 ? ?
=> In some tables we may not be able to uniquely identify records using single
column
and we need combination of columns to uniquely and that combination should be
declared primary key.
ex :-
REGISTRATIONS
SID CID DOR FEE
1 10 ? ?
1 11 ? ?
2 10 ? ?
=> in the above example sid,cid combination uniquely identifies , so declare this
combination
as primary key
DEFAULT :-
----------------
=> while inserting if we skip hiredate then oracle inserts default value
ex :-
100 A 23-AUG-24
101 B 01-JAN-24
102 C NULL
=> oracle not only stores data and it also stores metadata that includes
users,tables,columns
and constraints information and this metadata organized in the form of tables
called
system tables or data dictionary tables.
ALL_USERS :-
---------------------
USER_TABLES :-
--------------------------
USER_CONSTRAINTS :-
------------------------------------
SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,
SEARCH_CONDITION
FROM USER_CONSTRAINTS
WHERE TABLE_NAME='EMP88' ;
CONSTRAINT_NAME C SEARCH_CONDITION
------------------------------ - ------------------------------
SYS_C009504 C "ENAME" IS NOT NULL
SYS_C009505 C SAL>=3000
SYS_C009508 R
SYS_C009506 P
SYS_C009507 U
Droping constraints :-
-----------------------------
NOTE :-
CASCADE :-
------------------
DROP TABLE DEPT CASCADE CONSTRAINTS ; => drops table with dependent fk
ACCOUNTS
ACCNO ACTYPE BAL
Rules :-
TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO
Rules :-
==========================================================================
CASE statement :-
-------------------------
1 simple case
2 searched case
simple case :-
-------------------
CASE COLNAME
WHEN VALUE1 THEN RETURN EXPR1
WHEN VALUE2 THEN RETURN EXPR2
----------------------------
ELSE RETURN EXPR
END
Ex :-
SELECT ENAME,
CASE JOB
WHEN 'CLERK' THEN 'WORKER'
WHEN 'MANAGER' THEN 'BOSS'
WHEN 'PRESIDENT' THEN 'BIG BOSS'
ELSE 'EMPLOYEE'
END AS JOB
FROM EMP ;
UPDATE EMP
SET SAL = CASE DEPTNO
WHEN 10 THEN SAL + (SAL*0.1)
WHEN 20 THEN SAL+(SAL*0.15)
WHEN 30 THEN SAL+(SAL*0.2)
ELSE SAL+(SAL*0.05)
END ;
26-aug-24
searched case :-
------------------------
=> use searched case when conditions not based on "=" operator
CASE
WHEN COND1 THEN RETURN EXPR1
WHEN COND2 THEN RETURN EXPR2
-------------------------
ELSE RETURN EXPR
END
SELECT ENAME,SAL,
CASE
WHEN SAL>3000 THEN 'HISAL'
WHEN SAL<3000 THEN 'LOSAL'
ELSE 'AVGSAL'
END AS SALRANGR
FROM EMP ;
STUDENT
SNO SNAME S1 S2 S3
1 A 80 90 70
2 B 30 60 50
SELECT SNO,
S1+S2+S3 AS TOTAL,
ROUND((S1+S2+S3)/3,2) AS AVG,
CASE
WHEN S1>=35 AND S2>=35 AND S3>=35 THEN 'PASS'
ELSE 'FAIL'
END AS RESULT
FROM STUDENT ;
==========================================================================
JOINS
---------
=> join is an operation performed to display data from two or more tables.
ex :-
orders cust
ordid orddt deldt cid cid cname addr phone
1000 22/ 26/ 10 10 A HYD ??
1001 23/ 27/ 11 11 B HYD ??
1002 24/ 28/ 12 12 C HYD ??
OUTPUT :-
Types of joins :-
------------------------
1 INNER JOIN
EQUI JOIN
NON EQUI
2 OUTER JOIN
3 CROSS / CARTESIAN JOIN
EQUI JOIN :-
-------------------
=> to perform equi join between the two tables there must be a common field and
name
of the common field need not to be same and fk-pk relationship is not compulsory.
=> => equi join is performed on the common field with same datatype.
SELECT columns
FROM tab1 INNER JOIN tab2
ON join cond ;
join condition :-
------------------------
=> join condition specifies which record of 1st table1 joined with which record of
2nd table
=> based on the given join condition oracle joins the records of two tables
[Link] = [Link]
=> this is join is called equi join because here join condition is based on "="
operator
Ex :-
EMP DEPT
EMPNO ENAME SAL DEPTNO DEPTNO DNAME LOC
1 A 5000 10 10 ACCOUNTS NEW YORK
2 B 3000 20 20 RESEARCH
3 C 4000 30 30 SALES
4 D 2000 20 40
OPERATIONS
5 E 3000 NULL
SELECT ENAME,SAL,DNAME,LOC
FROM EMP INNER JOIN DEPT
ON [Link] = [Link];
note :-
=> in join queries declare table alias and prefix column names with table alias
for two reasons
1 to avoid ambiguity
2 for faster execution
SELECT [Link],[Link],[Link],[Link]
FROM EMP E INNER JOIN DEPT D
ON [Link] = [Link];
=> display employee details with dept details working at NEW YORK loc ?
SELECT [Link],[Link],[Link]
FROM EMP E INNER JOIN DEPT D
ON [Link] = [Link] /* join cond */
WHERE [Link] = 'NEW YORK' /* filter cond */
SELECT O.*,C.*
FROM ORDERS O INNER JOIN CUST C
ON [Link] = [Link] ;
SELECT O.*,C.*
FROM ORDERS O INNER JOIN CUST C
ON [Link] = [Link]
WHERE [Link] = SYSDATE ;
=> non equi join is performed between the tables not sharing a common field
=> here join condition is not based on "=" operator it is based on > < between
operators
ex :-
EMP SALGRADE
EMPNO ENAME SAL GRADE LOSAL HISAL
1 A 5000 1 700 1000
2 B 2500 2 1001 2000
3 C 1000 3 2001 3000
4 D 3000 4 3001 4000
5 E 1500 5 4001 9999
SELECT [Link],[Link],[Link]
FROM EMP E INNER JOIN SALGRADE S
ON [Link] BETWEEN [Link] AND [Link] ;
A 5000 5
B 2500 3
C 1000 1
D 3000 3
E 1500 2
SELECT [Link],[Link],[Link]
FROM EMP E INNER JOIN SALGRADE S
ON [Link] BETWEEN [Link] AND [Link]
WHERE [Link] = 3 ;
SELECT columns
FROM tab1 INNER JOIN tab2
ON join cond
INNER JOIN tab3
ON join cond
INNER JOIN tab4
ON join cond
ex :-
SELECT [Link],[Link],[Link]
FROM EMP E INNER JOIN DEPT D
ON [Link] = [Link]
INNER JOIN SALGRADE S
ON [Link] BETWEEN [Link] AND [Link] ;
EMP DEPT
EMPNO ENAME SAL DEPTNO DEPTNO DNAME LOC
1 A 5000 10 10 ACCOUNTS NEW YORK
2 B 3000 20 20 RESEARCH
3 C 4000 30 30 SALES
4 D 2000 20 40
OPERATIONS
5 E 3000 NULL
ON [Link] = [Link] :-
--------------------------------------------- SALGRADE
GRADE LOSAL HISAL
1 A 5000 10 10 ACCOUNTS 1 700 1000
2 B 3000 20 20 RESEARCH 2 1001 2000
3 C 4000 30 30 SALES 3 2001 3000
4 D 2000 20 20 RESEARCH 4 3001 4000
5 4001 9000
1 A 5000 10 10 ACCOUNTS 5
2 B 3000 20 20 RESEARCH 3
3 C 4000 30 30 SALES 4
4 D 2000 20 20 RESEARCH 2
SELECT [Link],[Link],[Link] :-
------------------------------------------------------------
A ACCOUNTS 5
B RESEARCH 3
C SALES 4
D RESEARCH 2
OUTER JOIN :-
-----------------------
=> inner join returns only matching rows but will not return unmatched rows , to
display
unmatched rows perform outer join.
EMP DEPT
EMPNO ENAME SAL DEPTNO DEPTNO DNAME LOC
1 A 5000 10 10 ACCOUNTS NEW YORK
2 B 3000 20 20 RESEARCH
3 C 4000 30 30 SALES
4 D 2000 20 40
OPERATIONS => unmatched row
5 E 3000 NULL => unmatched row
=> returns all rows (matched + unmatched) from left side table and matching rows
from right side table.
SELECT [Link],[Link]
FROM EMP E LEFT OUTER JOIN DEPT D
ON [Link] = [Link] ;
A ACCOUNTS
B RESEARCH
C SALES
D RESEARCH
E NULL => unmatched from emp
=> returns all rows (matched + unmatched) from right side table and matching
rows
from left side table.
SELECT [Link],[Link]
FROM EMP E RIGHT OUTER JOIN DEPT D
ON [Link] = [Link] ;
A ACCOUNTS
B RESEARCH
C SALES
D RESEARCH
NULL OPERATIONS => unmatched from dept
SELECT [Link],[Link]
FROM EMP E FULL OUTER JOIN DEPT D
ON [Link] = [Link] ;
A ACCOUNTS
B RESEARCH
C SALES
D RESEARCH
E NULL => unmatched from emp
NULL OPERATIONS => unmatched from dept
SELECT [Link],[Link]
FROM EMP E LEFT OUTER JOIN DEPT D
ON [Link] = [Link]
WHERE [Link] IS NULL ;
E NULL
SELECT [Link],[Link]
FROM EMP E RIGHT OUTER JOIN DEPT D
ON [Link] = [Link]
WHERE [Link] IS NULL ;
NULL OPERATIONS
both tables :-
--------------------
SELECT [Link],[Link]
FROM EMP E FULL OUTER JOIN DEPT D
ON [Link] = [Link]
WHERE [Link] IS NULL
OR
[Link] IS NULL ;
E NULL
NULL OPERATIONS
Ex :-
EMP PROJECTS
EMPID ENAME SAL PROJID PROJID PNAME DURATION
1 A 100 100
2 B 101 101
3 C NULL 102
=> display employee details with project details and also display employees not
assigned to any
project ?
=> cross join returns cross product or cartesian product of two tables
A = 1,2
B = 3,4
=> if cross join performed between two tables then all records of 1st table joined
with all records
of 2nd table.
=> to perform cross join submit the join query without join condition.
SELECT [Link],[Link]
FROM EMP E CROSS JOIN DEPT D ;
==========================================================================
SET OPERATORS :-
-----------------------------
UNION
UNION ALL
INTERSECT
MINUS
A = 1,2,3,4
B = 1,2,5,6
A UNION B = 1,2,3,4,5,6
A UNION ALL B = 1,2,3,4,1,2,5,6
A INTERSECT B = 1,2
A MINUS B = 3,4
B MINUS A = 5,6
=> in oracle set operations performed between the records/rows return by two
queries
SELECT STATEMENT 1
UNION / UNION ALL / INTERSECT / MINUS
SELECT STATEMENT 2 ;
QUERY 1 :-
CLERK
MANAGER
ANALYST
CLERK
ANALYST
QUERY 2 :-
SALESMAN
SALESMAN
SALESMAN
MANAGER
SALESMAN
CLERK
UNION :-
-------------
ANALYST
CLERK
MANAGER
SALESMAN
UNION JOIN
28-aug-24
UNION ALL :-
--------------------
CLERK
MANAGER
ANALYST
CLERK
ANALYST
SALESMAN
SALESMAN
SALESMAN
MANAGER
SALESMAN
CLERK
INTERSECT :-
-------------------
CLERK
MANAGER
MINUS :-
---------------
=> returns values present in 1st query output and not present in 2nd query output
ANALYST
SALESMAN
=>
T1 T2
F1 C1
1 1
2 2
3 3
10 40
20 50
30 60
1 equi join
2 left outer join
3 right outer join
4 full outer join
5 union
6 union all
7 intersect
8 minus
GROUP BY clause :-
-------------------------------
=> GROUP BY clause is used to group rows based on one or more columns to
calculate
max,min,sum,avg,count for each group , for ex to calculate dept wise total
sal first
we need to group rows based on dept and apply sum function on each dept
EMP
EMPNO ENAME SAL DEPTNO
1 A 3000 10
2 B 4000 20 group by 10 8000
3 C 5000 30 ================> 20 10000
4 D 6000 20 30 5000
5 E 5000 10
=> GROUP BY clause converts detailed data into summarized data which is useful
for analysis.
SELECT columns
FROM tabname
[WHERE cond]
GROUP BY colname
[HAVING cond]
[ORDER BY col ASC/DESC]
Execution :-
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
SELECT DEPTNO,SUM(SAL)
FROM EMP
GROUP BY DEPTNO ;
DEPTNO SUM(SAL)
---------- ----------
30 9400
10 8750
20 10875
SELECT JOB,COUNT(*)
FROM EMP
GROUP BY JOB ;
SELECT DEPTNO,COUNT(*)
FROM EMP
WHERE COUNT(*) > 3
GROUP BY DEPTNO ; => ERROR => group functions are not allowed in
where clause
oracle cannot calculate dept wise count before group by and it can calculate
only
after group by , so apply the condition COUNT(*) > 3 after group by using
HAVING clause.
SELECT DEPTNO,COUNT(*)
FROM EMP
GROUP BY DEPTNO
HAVING COUNT(*) >3 ;
WHERE VS HAVING :-
-------------------------------------
WHERE HAVING
=> display dept wise count for dept 10,20 and no of emps > 3 ?
SELECT DEPTNO,COUNT(*)
FROM EMP
WHERE DEPTNO IN (10,20)
GROUP BY DEPTNO
HAVING COUNT(*) > 3 ;
=========================================================================
syntax :-
SELECT columns
FROM tabname
WHERE colname op (SELECT statement) ;
=> op must be any relational operator like > >= < <= = <>
examples :-
SELECT *
FROM EMP
WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME='blake') ;
=> employees who are senior to king ?
SELECT *
FROM EMP
WHERE HIREDATE < (SELECT HIREDATE FROM EMP WHERE ENAME='king') ;
17-NOV-81
SELECT ENAME
FROM EMP
WHERE SAL = MAX(SAL) ; => ERROR => group functions not allowed in where
SELECT ENAME
FROM EMP
WHERE SAL = (SELECT MAX(SAL) FROM EMP);
-------------------------------------------------
5000
SELECT MAX(SAL)
FROM EMP
WHERE SAL <> (SELECT MAX(SAL) FROM EMP) ;
--------------------------------------------
5000
SELECT ENAME,SAL
FROM EMP
WHERE SAL = ( SELECT MAX(SAL)
FROM EMP
WHERE SAL <> (SELECT MAX(SAL) FROM EMP)) ;
------------------------------------------------
5000
------------------------------------------------------------------------------
3000
29-aug-24
CO-RELATED SUB-QUERIES :-
--------------------------------------------
=> if inner query references values of outer query then it is called co-related
sub-query.
=> execution starts from outer query and inner query is executed no of times
depends on
no of rows return by outer query
=> use co-related sub-queries to execute sub-query for each row return by outer
query
Ex :-
EMP
EMPNO ENAME SAL DEPTNO
1 A 5000 10
2 B 3000 20
3 C 4000 30
4 D 6000 20
5 E 3000 10
=> employees earning more than avg sal of the organization ? (normal sub-query)
SELECT *
FROM EMP
WHERE SAL > (SELECT AVG(SAL) FROM EMP)
----------------------------------------------
4200
=> employees earning more than avg sal of their dept ? (co-related sub-query)
SELECT EMPNO,ENAME,SAL,DEPTNO
FROM EMP X
WHERE SAL > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = [Link]) ;
EMP
EMPNO ENAME SAL DEPTNO
1 A 5000 10 5000 > (4000) TRUE
2 B 3000 20 3000 > (4500) FALSE
3 C 4000 30 4000 > (4000) FALSE
4 D 6000 20 6000 > (4500) TRUE
5 E 3000 10 3000 > (4000) FALSE
SELECT EMPNO,ENAME,SAL,DEPTNO
FROM EMP X
WHERE SAL = (SELECT MAX(SAL) FROM EMP WHERE DEPTNO = [Link])
EMP
EMPNO ENAME SAL DEPTNO
1 A 5000 10 5000 = (5000) TRUE
2 B 3000 20 3000 = (6000) FALSE
3 C 4000 30 4000 = (4000) TRUE
4 D 6000 20 6000 = (6000) TRUE
5 E 3000 10 3000 = (5000) FALSE
SELECT [Link]
FROM EMP A
WHERE 3 > (SELECT COUNT( [Link])
FROM EMP B
WHERE [Link] < [Link])
ORDER BY SAL DESC ;
EMP A EMP B
SAL SAL
5000 5000 3 > (0) TRUE
4000 4000 3 > (1) TRUE
3000 3000 3 > (3) FALSE
2000 2000 3 > (4) FALSE
4000 4000 3 > (1) TRUE
EMP A EMP B
SAL SAL
5000 5000 3 > (0) TRUE
4000 4000 3 > (1) TRUE
3000 3000 3 > (2) TRUE
2000 2000 3 > (3) FALSE
4000 4000 3 > (1) TRUE
30-aug-24
ROWID :-
------------
=> returns address of a row i.e. where the recored is stored in memory
=> rowid is called psuedo column because it is not a column but acts like a
column.
Ex :-
EMP44
ENO ENAME SAL ROWID
1 A 5000 AAA
2 B 6000 AAB
3 C 7000 AAC
1 A 5000 AAD
2 B 6000 AAE
DELETE
FROM EMP44 X
WHERE ROWID <> (SELECT MIN(ROWID)
FROM EMP44
WHERE ENO = [Link]
AND
ENAME=[Link]
AND
SAL=[Link]) ;
EMP44
ENO ENAME SAL ROWID
1 A 5000 AAA <> (AAA) FALSE
2 B 6000 AAB <> (AAB) FALSE
3 C 7000 AAC <> (AAC) FALSE
1 A 5000 AAD <> (AAA) TRUE
2 B 6000 AAE <> (AAB) TRUE
INLINE views :-
---------------------
SELECT columns
FROM (SELECT statement) <ALIAS>
WHERE cond ;
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
WHERE
Example 1 :-
=> display ranks of the employees based on salary and highest paid employee
should get 1st rank ?
SELECT EMPNO,ENAME,SAL,
DENSE_RANK() OVER (ORDER BY SAL DESC) AS RNK
FROM EMP ;
above query displays ranks of all the employees but to display top 5 employees
SELECT EMPNO,ENAME,SAL,
DENSE_RANK() OVER (ORDER BY SAL DESC) AS RNK
FROM EMP
WHERE RNK <= 5 ; => ERROR
=> column alias cannot be used in where clause because where clause is
executed before select , to overcome this problem use inline views.
SELECT *
FROM (SELECT EMPNO,ENAME,SAL,
DENSE_RANK() OVER (ORDER BY SAL DESC) AS RNK
FROM EMP) E
WHERE RNK<=5 ;
ROWNUM :-
--------------------
5 KING
2 KING
=> rownum is not based on table and it is based on select stmt output , if
select
output changes rownum also changes.
=> rownum is used when displaying records from table based on record number
ex :-
SELECT EMPNO,ENAME,SAL
FROM EMP
WHERE ROWNUM <= 5 ;
SELECT EMPNO,ENAME,SAL
FROM EMP
WHERE ROWNUM = 5 ;
NOTE :- with rownum in where conditions = > >= operators will not
work
only < <= operators can be used with rownum
SELECT *
FROM (SELECT ROWNUM AS RNO,EMPNO,ENAME,SAL FROM EMP) E
WHERE RNO = 5 ;
WHERE MOD(RNO,2) = 0;
WHERE MOD(RNO,2) = 1 ;
SELECT *
FROM (SELECT ROWNUM AS RNO,EMPNO,ENAME,SAL FROM EMP) E
WHERE RNO >= (SELECT COUNT(*)-2 FROM EMP) ;
Question1 :-
T1 T2
F1 F1
1 A
2 B
3 C
output :-
1 A
2 B
3 C
Question 2 :-
T1
AMT
1000
-200
5000
-800
3000
-500
OUTPUT :-
POS NEG
1000 -200
5000 -800
3000 -500
1 to display data from one table and condition based on another table then we can
use
join or sub-query
join :-
---------
SELECT [Link]
FROM EMP E INNER JOIN DEPT D
ON [Link] = [Link]
WHERE [Link] ='NEW YORK' ;
sub-query :-
-----------------
SELECT ENAME
FROM EMP
WHERE DEPTNO = ( SELECT DEPTNO FROM DEPT WHERE LOC = 'NEW YORK');
=> display employee names and dept names working at NEW YORK loc ?
join :-
-------------
sub-query :-
------------------
not possible
========================================================================
=> a new table is created with name EMP11 and oracle copies all the columns and
rows from
EMP to EMP11.
SYSTEM :-
----------------
MERGE command :-
----------------------------
Ex :-
Ex :-
EMPS EMPT
EMPNO ENAME SAL EMPNO ENAME SAL
1 A 5000 1 A
2 B 6000 2 B
3 C 7000 3 C
1 update command
2 merge command
=========================================================================
DATABASE TRANSACTIONS :-
=========================
=> a transaction is a unit of work that contains one or more dmls that must be
saved as a whole
or must be cancelled as a whole.
ex :- money transfer
acct1-----------------------------1000-----------------------------acct2
update1 update2
(bal=bal-1000) (bal=bal+1000)
=> every db txn must gurantee a property called atomocity i.e. all or none , if
txn
contains multiple operations , if all are successful then it must be saved ,
if one of the operation fails then entire txn must be cancelled.
=> the following commands provided by oracle to handle transactions called TCL
commands
=> a txn ends with COMMIT / ROLLBACK command. OR ddl command (txn ends with
commit).
example 1 :-
=> if txn ends with rollback then it is called aborted txn and operations are
cancelled
example 2 :-
select * from a ;
10
20
example 3 :-
SAVEPOINT :-
------------------
=> we can declare savepoint and we can rollback upto the savepoint.
=> using savepoint we can cancel part of the transaction.
ex 1 :-
LOCKING :-
------------------
=> accessing same data by no of users at the same time is called concurrent
access.
=> when data accessed concurrently users come across problems.
1 dirty read
2 lost update
3 non repeatable read
4 phantom read
=> to overcome these problems every db system supports a mechanism called locking
mechanism
1 SHARE LOCK
2 EXCLUSIVE LOCK
=> shared lock is applied whenever user try to read data (select stmt)
=> exclusive lock is applied whenever user try to update data (dml commands)
S X
S YES YES
X YES NO
Ex :-
system batch39
lock releases
DeadLock :-
----------------
=> if two uses mutually waits for one another that situation is called deadlock.
if deadlock
oracle returns error , so that one transaction can be cancelled and another
can be
continued.
system batch39
1 update [Link] 2 update emp
set sal = 2000 set sal = 3000
where empno = 7369; where empno = 7499;
system batch39
-----wait- -----------
wait----------------
==============================deadlock================================
5 error
6 rollback ; 7 commit ;
=> complete table is locked i.e. all the records of table are locked.
Ex :-
A atomocity
C consistency
I isolation
D durability
Atomocity :-
----------------
=> atomocity means all or none , if txn contains multiple operations if all are
successful then
it must be saved , if one of the operation fails then entire txn must be
cancelled.
Consistent:--
----------------
Transactions ensure that the database state remains consistent i.e. state of the
db must be consistent before and after the transaction.
Once a transaction has been committed, the database changes must be saved
permanently
even if the machine on which the database software is running crashes later.
========================================================================
DB SECURITY :-
-------------------------
DB (USERS)
TABLE (PRIVILEGES)
ROWS & COLS (VIEWS)
Ex :-
BATCH39 :-
----------------
VIJAY :-
-------------
REVOKE command :-
-------------------------------
BATCH39 :-
------------------
VIJAY :-
------------
DB OBJECTS :-
----------------------
1 TABLES
2 VIEWS
3 SYNONYMS
4 SEQUENCES
===================================================
4-sep-24
PL/SQL :-
-------------
1 basic programming
2 conditional stmts
3 loops
4 cursors
5 error handling
6 stored procedures
7 functions
8 packages
9 triggers
Features :-
--------------
1 improves performance :-
--------------------------------
=> In pl/sql , sql commands can be grouped into one block and we submit
that block to oracle , so in pl/sql no of req & res between user and
oracle are reduced and performance is improved.
3 supports loops :-
--------------------
=> In pl/sql with the help of loops we can execute sql commands
repeatedly multiple times.
=> In pl/sql if any statement causes error then we can handle that error
and we can display our own simple and user friendly messages.
5 supports reusability :-
-----------------------------
1 Anonymous Blocks
2 Named Blocks
procedures
functions
packages
triggers
Anonymous Blocks :-
-----------------------------
DECLARE
<declaration-part>; optional
BEGIN
<statements>;
END;
/ => compilation & execution starts
DBMS_OUTPUT.PUT_LINE(message);
---------------------- --------------
package procedure
=> by default messages are not send to output , to send messages to output
execute the
following command.
SQL>SET SERVEROUTPUT ON
1 EDITORs
2 IDEs (integrated development environment)
EDITOR IDE
compilation NO YES
execution NO YES
debugging NO YES
using NOTEPAD :-
-------------------------
SQL>@D:\NARESH\[Link]
output :- welcome
Datatypes in PL/SQL :-
--------------------------------
1 NUMBER(P) / NUMBER(P,S)
2 CHAR/VARCHAR2/CLOB
3 NCHAR/NVARCHAR2/NCLOB
4 DATE / TIMESTAMP
5 BFILE / BLOB
6 BINARY_FLOAT / BINARY_DOUBLE
7 BINARY_INTEGER
8 BOOLEAN
Declaring variables :-
----------------------------
variablename datatype(size);
ex :-
x number(4);
f binary_float;
s varchar2(20);
d date;
b boolean;
x := 100;
f := 83.56
s := 'abc';
d := '5-sep-24' ;
b := true;
Example :-
DECLARE
a NUMBER(4);
b NUMBER(4);
c NUMBER(5);
BEGIN
a := 100;
b := 200;
c := a+b;
DBMS_OUTPUT.PUT_LINE(c);
END;
/
1 a := &a;
a := 100;
2 a := &x;
a := 500;
DECLARE
a NUMBER(4);
b NUMBER(4);
c NUMBER(5);
BEGIN
a := &a;
b := &b;
c := a+b;
DBMS_OUTPUT.PUT_LINE(c);
END;
/
DECLARE
d DATE;
BEGIN
d := '&date';
DBMS_OUTPUT.PUT_LINE(TO_CHAR(d,'day'));
END;
/
=> wap to input name and print first name,middle name,last name ?
input :- sachin ramesh tendulkar
output :-
DECLARE
n VARCHAR2(30);
f VARCHAR2(20);
m VARCHAR2(20);
l VARCHAR2(20);
BEGIN
n := '&name' ;
f := SUBSTR(n,1,INSTR(n,' ')-1);
l := SUBSTR(n,INSTR(n,' ',1,2)+1);
m := TRIM(RTRIM(LTRIM(n,f),l)) ;
DBMS_OUTPUT.PUT_LINE(' First Name = '||f);
DBMS_OUTPUT.PUT_LINE('Middle Name = '||m);
DBMS_OUTPUT.PUT_LINE(' Last Name = '||l);
END;
/
SUBSTR(string,start,[no of chars])
INSTR(string,char,[start,occurance])
ex :-
Examples :-
=> wap to input empno and print name & sal ?
DECLARE
veno NUMBER(4);
vname VARCHAR2(10);
vsal NUMBER(7,2);
BEGIN
veno := &empno;
SELECT ename,sal INTO vname,vsal
FROM emp
WHERE empno = veno ;
DBMS_OUTPUT.PUT_LINE(vname||' '||vsal);
END;
/
DECLARE
veno NUMBER(4);
vhire DATE;
vexpr NUMBER(2);
BEGIN
veno := &empno;
SELECT hiredate INTO vhire FROM emp WHERE empno = veno;
vexpr := (SYSDATE-vhire)/365;
DBMS_OUTPUT.PUT_LINE('Experience = '||vexpr||' years');
END;
/
Experience = ?? years
DECLARE
veno NUMBER(4);
vsal NUMBER(7,2);
vcomm NUMBER(7,2);
vtotsal NUMBER(7,2);
BEGIN
veno := &empno;
SELECT sal,comm INTO vsal,vcomm FROM emp WHERE empno = veno;
vtotsal := vsal + NVL(vcomm,0);
DBMS_OUTPUT.PUT_LINE('Total salary = '|| TO_CHAR(vtotsal,'L99G999'));
END;
/
conditional statements :-
----------------------------------
1 IF-ELSE
2 MULTI IF
3 NESTED IF
IF-ELSE :-
--------------
IF COND THEN
statements ;
[ ELSE
statements; ]
END IF;
MULTI - IF :-
-----------------
IF COND1 THEN
statements;
ELSIF COND2 THEN
statements;
ELSIF COND3 THEN
statements;
ELSE
statements;
END IF;
NESTED IF :-
--------------------
IF COND THEN
IF COND THEN
statements;
ELSE
statements;
END IF;
ELSE
statements;
END IF;
=> wap to input empno and increment sal by specific amount and
after increment if sal exceeds 5000 then cancel that increment ?
DECLARE
veno NUMBER(4);
vamt NUMBER(4);
vsal NUMBER(7,2);
BEGIN
veno := &empno;
vamt := &amount;
UPDATE emp SET sal = sal + vamt WHERE empno = veno ;
SELECT sal INTO vsal FROM emp WHERE empno = veno ;
IF vsal > 5000 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END;
/
9-sep-24
DECLARE
veno NUMBER(4);
vjob VARCHAR2(10);
vpct NUMBER(2);
BEGIN
veno := &empno ;
SELECT job INTO vjob FROM emp WHERE empno = veno ;
IF vjob='CLERK' THEN
vpct := 10;
ELSIF vjob='SALESMAN' THEN
vpct := 15;
ELSIF vjob='MANAGER' THEN
vpct := 20;
ELSE
vpct := 5;
END IF;
UPDATE emp SET sal = sal + (sal*vpct/100) WHERE empno = veno;
COMMIT;
END;
/
ACCOUNTS
ACCNO ACTYPE BAL
100 S 10000
101 S 20000
TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO
DECLARE
vacno NUMBER(4);
vtype CHAR(1);
vamt NUMBER(6);
vbal NUMBER(8,2);
BEGIN
vacno := &acno;
vtype := '&type' ;
vamt := &amount;
IF vtype='W' THEN
SELECT bal INTO vbal FROM accounts WHERE accno = vacno;
IF vamt > vbal THEN
DBMS_OUTPUT.PUT_LINE('insufficient balance');
ELSE
UPDATE accounts SET bal = bal - vamt WHERE accno = vacno;
INSERT INTO transactions
VALUES([Link],'W',sysdate,vamt,vacno);
END IF;
ELSIF vtype='D' THEN
UPDATE accounts SET bal = bal + vamt WHERE accno = vacno;
INSERT INTO transactions VALUES([Link],'D',sysdate,vamt,vacno);
ELSE
DBMS_OUTPUT.PUT_LINE('invalid transaction type');
END IF;
COMMIT;
END;
/
DECLARE
vsacno NUMBER(4);
vtacno NUMBER(4);
vamt NUMBER(6);
vbal NUMBER(8,2);
BEGIN
vsacno := &sacno;
vtacno := &tacno;
vamt := &amount;
SELECT bal INTO vbal FROM accounts WHERE accno = vsacno ;
IF vamt > vbal THEN
DBMS_OUTPUT.PUT_LINE('insufficient balance');
ELSE
UPDATE accounts SET bal = bal - vamt WHERE accno = vsacno;
UPDATE accounts SET bal = bal + vamt WHERE accno = vtacno;
INSERT INTO transactions
VALUES([Link],'W',sysdate,vamt,vsacno);
INSERT INTO transactions
VALUES([Link],'D',sysdate,vamt,vtacno);
COMMIT;
END IF;
END;
/
==========================================================================
Reference Types :-
---------------------------
1 %TYPE
2 %ROWTYPE
%TYPE :-
--------------
ex :- vename [Link]%TYPE;
=> whatever type and size declared for ename the same type and size assigned to
variable vename
=> adv of %TYPE is even if column type or size changes pl/sql program is not
affected , It
reduces complexity.
%ROWTYPE :-
---------------------
ex :- r emp%rowtype;
SELECT * INTO r FROM emp WHERE empno = 106 ;
r
empno ename job mgr hiredate sal comm deptno emailid
106 clark mgr 2450 10
ex :-
STUDENT
SNO SNAME S1 S2 S3
1 A 80 90 70
2 B 30 60 50
RESULT
SNO TOTAL AVG RESULT
=> wap to input sno and calculate total,avg,result and insert into result table ?
DECLARE
vsno [Link]%TYPE;
s student%ROWTYPE;
r result%ROWTYPE;
BEGIN
vsno := &sno ;
SELECT * INTO s FROM student WHERE sno = vsno ;
[Link] := s.s1 + s.s2 + s.s3 ;
[Link] := [Link]/3;
IF s.s1>=35 AND s.s2>=35 AND s.s3>=35 THEN
[Link] := 'PASS';
ELSE
[Link] := 'FAIL';
END IF;
INSERT INTO result VALUES(vsno,[Link],[Link],[Link]);
COMMIT;
END;
/
s
SNO SNAME S1 S2 S3
1 A 80 90 70
r
SNO TOTAL AVG RESULT
240 80 PASS
10-sep-24
LOOPS :-
-------------
1 simple loop
2 while loop
3 for loop
simple loop :-
------------------
LOOP LOOP
statements; statements;
EXIT WHEN COND; IF cond THEN
END LOOP; EXIT ;
END IF;
END LOOP;
WHILE loop :-
-------------------
WHILE(cond)
LOOP
statements
END LOOP;
for loop :-
--------------
Ex :-
FOR i IN 1..10
LOOP
statements;
END LOOP;
Examples :-
DECLARE
x NUMBER(2) := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE(x);
x := x+1;
EXIT WHEN X>20;
END LOOP;
END;
/
DECLARE
X NUMBER(2) := 1;
BEGIN
WHILE(X<=20)
LOOP
DBMS_OUTPUT.PUT_LINE(X);
X := X+1;
END LOOP;
END;
/
BEGIN
FOR X IN 1..20
LOOP
DBMS_OUTPUT.PUT_LINE(X);
END LOOP;
END;
/
0 ?
1 ?
65 A
97 a
255 ?
BEGIN
FOR X IN 0..255
LOOP
DBMS_OUTPUT.PUT_LINE(X||' '||CHR(X));
END LOOP;
END;
/
date day
01-jan-24 ?
02-jan-24 ?
31-dec-24 ?
DECLARE
d1 DATE ;
d2 DATE;
BEGIN
d1 := '01-JAN-24' ;
d2 := '31-DEC-24' ;
WHILE(d1<=d2)
LOOP
DBMS_OUTPUT.PUT_LINE(d1||' '||TO_CHAR(d1,'day'));
d1 := d1+1;
END LOOP;
END;
/
DECLARE
d1 DATE ;
d2 DATE;
BEGIN
d1 := '01-JAN-24' ;
d2 := '31-DEC-24' ;
WHILE(d1<=d2)
LOOP
IF TO_CHAR(d1,'dy') = 'sun' THEN
DBMS_OUTPUT.PUT_LINE(d1||' '||
TO_CHAR(d1,'day'));
END IF;
d1 := d1+1;
END LOOP;
END;
/
DECLARE
d1 DATE ;
d2 DATE;
cnt NUMBER(3) := 0;
BEGIN
d1 := '&date1' ;
d2 := '&date2' ;
d1 := NEXT_DAY(d1,'sunday');
WHILE(d1<=d2)
LOOP
cnt := cnt+1;
DBMS_OUTPUT.PUT_LINE(d1||' '||TO_CHAR(d1,'day'));
d1 := d1+7;
END LOOP;
DBMS_OUTPUT.PUT_LINE('No of sundays :- ' ||cnt);
END;
/
input :- NARESH
output :-
N
A
R
E
S
H
DECLARE
s VARCHAR2(20);
BEGIN
s := '&string' ;
FOR X IN 1..LENGTH(s)
LOOP
DBMS_OUTPUT.PUT_LINE(SUBSTR(s,X,1));
END LOOP;
END;
/
input :- NARESH
output :-
N
NA
NAR
NARE
NARES
NARESH
DECLARE
s VARCHAR2(20);
BEGIN
s := '&string' ;
FOR X IN 1..LENGTH(s)
LOOP
DBMS_OUTPUT.PUT_LINE(SUBSTR(s,1,X));
END LOOP;
END;
/
INPUT :- NARESH
OUTPUT :- HSERAN
DECLARE
s1 VARCHAR2(20);
s2 VARCHAR2(20);
BEGIN
s1 := '&string';
FOR X IN 1..LENGTH(s1)
LOOP
s2 := s2||SUBSTR(s1,-X,1);
END LOOP;
DBMS_OUTPUT.PUT_LINE(s2);
IF s1 = s2 THEN
DBMS_OUTPUT.PUT_LINE('palindrome');
ELSE
DBMS_OUTPUT.PUT_LINE('not a palindrome');
END IF;
END;
/
*
**
***
****
******
*
***
*****
***********
level := level + 1;
end loop;
=> by default level initialized with 1
=> by default level is incremented by 1
11-sep-24
CURSORS :-
----------------
1 declare cursor
2 open cursor
3 fetch records from cursor
4 close cursor
Declaring cursor :-
------------------------
CURSOR <name> IS SELECT statement ;
Ex :-
Opening cursor :-
-----------------------
OPEN <cursor-name>;
Ex :-
OPEN C1;
Ex :-
=> a fetch stmt fetches one row at a time but to process multiple rows fetch stmt
should be executed multiple times. so fetch stmt should be in a loop.
Closing cursor :-
------------------------
CLOSE <cursor-name>;
ex :- CLOSE C1 ;
cursor attributes :-
-------------------------
%FOUND :-
---------------
%NOTFOUND :-
-----------------------
%ROWCOUNT :-
-----------------------
=> returns no of rows fetched successfully
c1%found
c1%notfound
c1%rowcount
Examples :-
DECLARE
CURSOR c1 IS SELECT ename,sal FROM emp ;
vename [Link]%TYPE;
vsal [Link]%TYPE;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO vename,vsal;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(vename||' '||vsal);
END LOOP;
CLOSE C1;
END;
/
while loop :-
-----------------
DECLARE
CURSOR c1 IS SELECT ename,sal FROM emp ;
vename [Link]%TYPE;
vsal [Link]%TYPE;
BEGIN
OPEN C1;
FETCH C1 INTO vename,vsal;
WHILE(C1%FOUND)
LOOP
DBMS_OUTPUT.PUT_LINE(vename||' '||vsal);
FETCH C1 INTO vename,vsal;
END LOOP;
CLOSE C1;
END;
/
FOR r IN C1
LOOP
statements ;
END LOOP;
=> every time for loop executes a record is fetched from cursor and assigned to
loop variable "r".
DECLARE
CURSOR C1 IS SELECT ename,sal FROM emp;
BEGIN
FOR r IN C1
LOOP
DBMS_OUTPUT.PUT_LINE([Link]||' '||[Link]);
END LOOP;
END;
/
DECLARE
CURSOR C1 IS SELECT sal FROM emp ;
t NUMBER := 0;
BEGIN
FOR r IN C1
LOOP
t := t + [Link];
END LOOP;
DBMS_OUTPUT.PUT_LINE(t);
END;
/
DECLARE
CURSOR C1 IS SELECT sal FROM emp ;
m NUMBER := 0;
BEGIN
FOR r IN C1
LOOP
IF [Link] > m THEN
m := [Link];
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE(m);
END;
/
DECLARE
CURSOR C1 IS SELECT sal FROM emp ORDER BY sal DESC;
vsal [Link]%TYPE;
BEGIN
OPEN C1;
FETCH C1 INTO vsal;
DBMS_OUTPUT.PUT_LINE(vsal);
CLOSE C1;
END;
/
=> wap to find min sal ?
DECLARE
CURSOR C1 IS SELECT sal FROM emp ;
vsal [Link]%type;
m NUMBER := 0;
BEGIN
OPEN C1 ;
FETCH C1 INTO m;
LOOP
FETCH C1 INTO vsal;
IF vsal < m THEN
m := vsal;
END IF;
EXIT WHEN C1%NOTFOUND;
END LOOP;
DBMS_OUTPUT.PUT_LINE(m);
CLOSE C1;
END;
/
DECLARE
CURSOR C1 IS SELECT sal FROM emp ORDER BY sal ASC;
vsal [Link]%TYPE;
BEGIN
OPEN C1;
FETCH C1 INTO vsal;
DBMS_OUTPUT.PUT_LINE(vsal);
CLOSE C1;
END;
/
DECLARE
CURSOR C1 IS SELECT sal FROM emp ORDER BY sal DESC;
vsal [Link]%TYPE;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO vsal;
EXIT WHEN C1%ROWCOUNT > 5;
DBMS_OUTPUT.PUT_LINE(vsal);
END LOOP;
CLOSE C1;
END;
/
SMITH,ALLEN,WARD,JONES,-----------------
DECLARE
CURSOR C1 IS SELECT ename FROM emp ;
s VARCHAR2(1000);
BEGIN
FOR r IN C1
LOOP
s := s||[Link]||',' ;
END LOOP;
DBMS_OUTPUT.PUT_LINE(RTRIM(s,','));
END;
/
LISTAGG :-
----------------
Ex :-
SELECT deptno,
LISTAGG(ename,',') WITHIN GROUP (ORDER BY sal DESC) AS NAMES
FROM emp
GROUP BY deptno ;
=> wap to calculate all the students total,avg,result and insert into result
table ?
STUDENT
SNO SNAME S1 S2 S3
1 A 80 90 70
2 B 30 60 50
RESULT
SNO TOTAL AVG RESULT
DECLARE
CURSOR C1 IS SELECT sno,s1,s2,s3 FROM student ;
r result%ROWTYPE;
BEGIN
FOR s IN C1
LOOP
[Link] := s.s1 + s.s2 + s.s3 ;
[Link] := [Link]/3;
IF s.s1>=35 AND s.s2>=35 AND s.s3>=35 THEN
[Link] := 'PASS';
ELSE
[Link] := 'FAIL';
END IF;
INSERT INTO result VALUES([Link],[Link],[Link],[Link]);
END LOOP;
COMMIT;
END;
/
C1
SNO S1 S2 S3
1 80 90 70 => s
2 30 60 50
r
SNO TOTAL AVG RESULT
240 80
=> wap to increment employee salaries based on the pct in emp_hike table ?
EMP_HIKE
EMPNO PCT
7369 20
7499 10
7521 15
7566 20
7654 12
DECLARE
CURSOR C1 IS SELECT empno,pct FROM emp_hike ;
BEGIN
FOR r IN C1
LOOP
UPDATE emp SET sal = sal + (sal*[Link]/100) WHERE empno = [Link];
END LOOP;
COMMIT;
END;
/
1 syntax errors
2 logical errors
3 runtime errors (exceptions)
=> errors that are raised during program execution are called runtime errors
ex :- a number(3);
a := &a ; => 10000 => runtime error
=> if any statement causes runtime error then program execution is terminated
abnormally and oracle displays error message.
DECLARE
declaration-part;
BEGIN
statements ; => stmts causes exception
EXCEPTION
statements; => stmts handle exception
END;
/
=> if any statement causes runtime error then control is transferred to exception
block and executes the statements in exception block.
=> exceptions are 2 types
1 system defined
2 user defined
1 ZERO_DIVIDE :-
-----------------------
2 VALUE_ERROR :-
------------------------
ex :- a number(3);
3 NO_DATA_FOUND :-
----------------------------
4 TOO_MANY_ROWS :-
-------------------------------
=> raised when select statement returns more than one row
5 DUP_VAL_ON_INDEX :-
---------------------------------
=> raised when we try to insert duplicate value into primary key / unique
column
DECLARE
a NUMBER(3);
b NUMBER(3);
c NUMBER(3);
BEGIN
a := &a;
b := &b;
c := a/b;
DBMS_OUTPUT.PUT_LINE(c);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('divisor cannot be zero');
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('value exceeding size');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('unknown error');
END;
/
13-sep-24
DECLARE
veno [Link]%TYPE;
vename [Link]%TYPE;
vsal [Link]%TYPE;
BEGIN
veno := &empno;
SELECT ename,sal INTO vename,vsal
FROM emp
WHERE empno = veno;
DBMS_OUTPUT.PUT_LINE(vename||' '||vsal);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('employee does not exists');
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('value exceeding size');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('unknown error');
END;
/
SQLCODE,SQLERRM :-
-----------------------------------
ex
DECLARE
veno [Link]%TYPE;
vename [Link]%TYPE;
vsal [Link]%TYPE;
BEGIN
veno := &empno;
vename := '&ename';
vsal := &sal;
INSERT INTO emp55 VALUES(veno,vename,vsal);
COMMIT;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE('empno should not be duplicate');
WHEN OTHERS THEN
IF SQLCODE = -02290 THEN
DBMS_OUTPUT.PUT_LINE(' sal >= 3000');
ELSE
DBMS_OUTPUT.PUT_LINE(sqlerrm);
END IF;
END;
/
Ex :-
=> wap to input empno and increment employee sal by specific amount
and sunday updates are not allowed ?
DECLARE
veno [Link]%TYPE;
vamt NUMBER(5);
BEGIN
veno := &empno;
vamt := &amount;
IF TO_CHAR(sysdate,'dy')='sun' THEN
RAISE_APPLICATION_ERROR(-20001,'sunday not allowed');
END IF;
UPDATE emp SET sal = sal + vamt WHERE empno = veno;
COMMIT;
END;
/
ACCOUNTS
ACCNO ACTYPE BAL
100 S 10000
101 S 20000
TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO
DECLARE
vacno [Link]%TYPE;
vamt NUMBER(6);
vbal [Link]%TYPE;
BEGIN
vacno := &acno;
vamt := &amount;
SELECT bal INTO vbal FROM accounts WHERE accno = vacno ;
IF vamt > vbal THEN
RAISE_APPLICATION_ERROR(-20001,'insufficient balance');
END IF;
UPDATE accounts SET bal = bal - vamt WHERE accno = vacno;
INSERT INTO transactions VALUES([Link],'W',sysdate,vamt,vacno);
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE(' account does not exists');
END;
/
validations :-
=================================================================
1 procedures
2 functions
3 packages
4 triggers
sub-programs :-
----------------------
1 procedures
2 functions
3 packages
Advantages :-
----------------------
1 modular programming :-
--------------------------------
=> with the help of proc & func a big pl/sql program can be divided into small
modules.
2 reusability :-
--------------------
=> proc & func can be stored in db and applications which are connected to db
can reuse procedures and functions.
=> proc & func can be invoked from front-end applications like java / .net
4 improves performance:-
---------------------------------
PROCEDURES :-
-------------------------
=> a procedure is a named pl/sql block that accepts some input performs some
action on db and may or may not returns a value.
=> procedures are created to perform one or more dml operations on db.
=> these procedures are stored in db , so they are called stored procedures
=> these procedures are stored as seperate object in db , so they are called
standalone procedures
parameters :-
------------------
1 IN (default)
2 OUT
3 IN OUT
X ==========================> A (IN)
Y <========================== B (OUT)
Execution :-
----------------
1 SQL PROMPT
2 another pl/sql prog
3 front-end applilcations like java / .net
SQL>EXECUTE raise_salary ;
Example 2 :- procedure with parameters
Execution :-
----------------
=> create procedure to increment specific employee sal by specific amount and
after
increment send the updated sal to calling program ?
Execution :-
SQL>VARIABLE K NUMBER
SQL> EXECUTE raise_salary(7369,1000,:K);
SQL> PRINT :K
SQL>VARIABLE K NUMBER
SQL> EXECUTE raise_salary(peno=>7369,pamt=>1000,pnewsal=>:K);
SQL> PRINT :K
Execution :-
15-sep-24
Example 5 :-
ACCOUNTS
ACCNO ACTYPE BAL
100 S 10000
101 S 20000
TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO
CREATE SEQUENCE S1
START WITH 1
INCREMENT BY 1
MAXVALUE 99999;
EXECUTION :-
SQL>VARIABLE B NUMBER
SQL>EXECUTE DEBIT(100,1000,:B);
SQL> PRINT :B
CUSTS CUSTT
CID CNAME CID FNAME MNAME LNAME
10 sachin ramesh tendulkar
11 mahendra singh dhoni
SUBSTR(string,start,no of chars)
REGEXP_SUBSTR(string,pattern,start,occurance)
ex :-
EXECUTION :-
SQL>EXECUTE COPY_CUSTS_CUSTT ;
=> a function is also a named PL/SQL block that accepts some input performs some
calculation
and must return a value.
1 for calculations
2 to fetch value from db
CREATE OR REPLACE
FUNCTION <name>(parameters if any) RETURN <type>
IS
declaration
BEGIN
statements;
RETURN expr;
END;
/
17-SEP-24
Example 1 :-
Execution :-
----------------
1 sql commands
2 another pl/sql program
3 front-end
Executing from sql commands :-
-------------------------------------------
Example 2 :-
=> create a function to check whether given year is leap year or not ?
Execution :-
Example 3 :-
orders products
ordid prodid qty prodid pname price
1000 100 1 100 A 2000
1000 101 2 101 B 1000
1000 102 2 102 C 1500
1001 100 3
CREATE OR REPLACE
FUNCTION getOrdAmt(pordid NUMBER) RETURN NUMBER
IS
CURSOR C1 IS SELECT [Link],[Link],[Link]
FROM orders o INNER JOIN products p
ON [Link] = [Link]
WHERE [Link] = pordid ;
vvalue NUMBER ;
vtotamt NUMBER := 0;
BEGIN
FOR r IN C1
LOOP
vvalue := [Link] * [Link] ;
vtotamt := vtotamt + vvalue ;
END LOOP;
RETURN vtotamt;
END;
/
C1
100 1 2000
101 2 1000
102 2 1500
Execution :-
procedures functions
3 returns values using out parameter returns value using return stmt
USER_SOURCE :-
---------------------------
DROP FUNCTION F1 ;
PACKAGES :-
-------------------
Advantages :-
------------------
1 easy to manage :-
-----------------------
=> because related procedures & functions available in one program so managing
is easy.
2 supports overloading :-
--------------------------------
=> standlaone procedures & functions cannot be overloaded but in package we can
define two or more procedures or functions with same name with different
parameters.
3 supports hiding :-
------------------------
=> In package we can make members (proc/func) as public and private and
public members can be called from any where but private members are
called only with in package.
4 improves performance :-
----------------------------------
=> when application program requests for a proc/func in a package then oracle
goes to db
and copies that package into instance , whenever we call proc/func then
oracle will not got
to db , so no of requests going to db are reduced and performance is
improved.
1 package specification
2 package body
package specification :-
-------------------------------
package body :-
---------------------
18-sep-24
package specification :-
--------------------------------
package body :-
----------------------
Execution :-
=> the whole package cannot be executed only the members of the package can
be executed.
[Link](parameters)
SQL>EXECUTE [Link](100,'abc','clerk',4000,20);
SQL>EXECUTE hr.update_sal(100,20);
SQL>EXECUTE [Link](100);
ACCOUNTS
ACCNO ACTYPE BAL
100 S 10000
101 S 20000
TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO
CREATE SEQUENCE S1
START WITH 1
INCREMENT BY 1
MAXVALUE 99999;
package specification :-
-------------------------------
Droping :-
--------------
SQL>DROP PACKAGE BODY BANK ; => drops only body but not specification
================================================================
TRIGGERS :-
-------------------
=> a trigger is also a named PL/SQL Block like procedure but executed implicitly
BEFORE triggers ;-
----------------------------
=> if trigger is before then oracle executes the trigger before executing dml
AFTER triggers :-
------------------------
=> if trigger is after then oracle executes the trigger after executing dml
Examples :-
Execution :-
19-sep-24
Testing :-
SQL> UPDATE EMP SET EMPNO = 9999 WHERE EMPNO = 7844 ; => ERROR
=> these two variables are called bind variables and rowtype variables.
=> used to access data affected by dmls.
=> record user is trying to insert is copied to :NEW variable.
=> record user is trying to delete is copied to :OLD variable.
=> record user is trying to update is copied to both :OLD,:NEW variables.
ex :-
:NEW
EMPNO SAL
7369 2000
=> to access these variables the trigger must be created with FOR EACH ROW.
Ex :-
Testing :-
=> create trigger to insert employee details into emp_resign when employee
resigns ?
EMP_RESIGN
EMPNO ENAME HIREDATE DOR
Testing :-
---------------
=> create trigger to insert details into emp_audit whenever user performs dml
operations on emp ?
EMP_AUDIT
UNAME OPERATION OPTIME NEW_ENO NEW_ENAME NEW_SAL OLD_ENO OLD_ENAME
OLD_SAL
ans :- 12
I
S
B
U
R
A D
BEFORE STMT
BEFORE ROW
AFTER ROW
AFTER STMT
USER_TRIGGERS :-
-----------------------------
=> maintains list of triggers created by user
SELECT TRIGGER_NAME,TRIGGER_TYPE,TRIGGERING_EVENT
FROM USER_TRIGGERS
WHERE TABLE_NAME='EMP' ;
Droping :-
--------------
SQL>DROP TRIGGER T1 ;
Dynamic SQL :-
-------------------
=> SQL commands generated at runtime are called dynamic sql commands.
tname VARCHAR2(20)
tname := '&tabname' ;
=> Dynamic sql is useful when we don't know tablenames and column names until
runtime.
=> Dynamic SQL & DDL commands are executed by using EXECUTE IMMEDIATE.
=> Dynamic sql command that you want to execute should be passed as a string to
EXECUTE
IMMEDIATE.
Ex 1 :-
Execute :-
SQL>EXECUTE DROP_TABLE('EMP');
Executing :-
EMP ?
DEPT ?
CUST ?
DECLARE
CURSOR C1 IS SELECT TABLE_NAME FROM USER_TABLES ;
str VARCHAR2(100);
cnt NUMBER(3);
BEGIN
FOR R IN C1
LOOP
str := 'SELECT COUNT(*) FROM '||R.TABLE_NAME ;
EXECUTE IMMEDIATE str INTO cnt ;
DBMS_OUTPUT.PUT_LINE(R.TABLE_NAME||' '||cnt);
END LOOP;
END;
/
20-sep-24
UTL_FILE package :-
---------------------------------
members :-
----------------
1 file_type
2 fopen
3 put_line
4 get_line
5 fclose
Directory Object :-
------------------------
SYSTEM :-
---------------
SQL>CREATE DIRECTORY D10 AS 'D:\FILES'
=> WAP to create new file and write data into the file ?
DECLARE
f1 utl_file.file_type;
BEGIN
f1 := utl_file.fopen('D10','[Link]','w');
utl_file.put_line(f1,'hello');
utl_file.put_line(f1,'welcome');
utl_file.put_line(f1,'utl_file');
utl_file.fclose(f1);
END;
/
DECLARE
f1 utl_file.file_type;
s varchar2(100);
BEGIN
f1 := utl_file.fopen('D10','[Link]','r');
LOOP
utl_file.get_line(f1,s);
dbms_output.put_line(s);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
utl_file.fclose(f1);
END;
/
DECLARE
f1 UTL_FILE.FILE_TYPE;
CURSOR C1 IS SELECT empno,ename,sal FROM emp;
s VARCHAR2(500);
BEGIN
f1 := UTL_FILE.FOPEN('D10','[Link]','w');
FOR r IN C1
LOOP
s := [Link]||','||[Link]||','||[Link];
UTL_FILE.PUT_LINE(f1,s);
END LOOP;
UTL_FILE.FCLOSE(f1);
END;
/
DECLARE
f1 UTL_FILE.FILE_TYPE;
CURSOR C1 IS SELECT empno,ename,sal,hiredate FROM emp;
s VARCHAR2(500);
BEGIN
f1 := UTL_FILE.FOPEN('D10','[Link]','w');
FOR r IN C1
LOOP
s := [Link]||','||[Link]||','|| [Link]||','|| [Link]
UTL_FILE.PUT_LINE(f1,s);
END LOOP;
UTL_FILE.FCLOSE(f1);
END;
/
CSV => comma seperated values => csv files can be opened in excel
DECLARE
f1 UTL_FILE.FILE_TYPE;
s VARCHAR2(100);
veno NUMBER(4);
vename VARCHAR2(10);
vsal NUMBER(7,2);
BEGIN
f1 := UTL_FILE.FOPEN('D10','[Link]','r');
LOOP
UTL_FILE.GET_LINE(f1,s);
veno := REGEXP_SUBSTR(s,'[^,]+',1,1);
vename := REGEXP_SUBSTR(s,'[^,]+',1,2);
vsal := REGEXP_SUBSTR(s,'[^,]+',1,3);
INSERT INTO emp11 VALUES(veno,vename,vsal);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE(f1);
COMMIT;
END;
/
===================================================================
BFILE / BLOB :-
-----------------------
=> both types are used for storing multimedia objects like audio,video,images.
=> oracle supports 2 binary types for storing multimedia objects
BFILE :-
-----------
=> BFILE is called external lob because lob stored outside db but db stores path
=> to insert path use function BFILENAME
BFILENAME(dir obj,file name)
Ex :-
21-sep-24
BLOB :-
-----------
=> BLOB is called internal lob because lob stored inside db.
=> to work with BLOB use package DBMS_LOB package.
ex :-
EXECUTION :-
blob to file :-
-----------------
l_blob_len := DBMS_LOB.getlength(l_blob);
EXCEPTION
WHEN OTHERS THEN
-- Close the file if something goes wrong.
IF UTL_FILE.is_open(l_file) THEN
UTL_FILE.fclose(l_file);
END IF;
RAISE;
END;
/
==================================================================================
Normalization :-
----------------------
=> Normalization is the process of decomposing tables with redundency into number
of
well structured tables.
=> Normalization process is set of rules and each rules is called normal form.
1NF
2NF
3NF
BCNF (boyce-codd NF)
4NF
5NF
BILL
BILLNO BDATE CCODE CNAME ADDR ICODE NAME RATE QTY VALUE
TBILL
1000 21- 100 A HYD 1
2
3
20
1NF :-
-------
BILL
BILLNO BDATE CCODE CNAME ADDR ICODE NAME RATE QTY VALUE
TBILL
S S S S S M M M M
M S
In thje above table some fields are multi valued and some fields are single valued
, so the
table is not according to 1NF , then decompose the table as follows.
TABLE 1 :-
BILL
BILLNO BDATE CCODE CNAME ADDR TBILL
----------
1000
1001
1002
TABLE 2 :-
ITEMS
BILLNO ICODE NAME RATE QTY VALUE
-----------------------
1000 1 A 100
1000 2
1000 3
1001 1 A 100
1002 1 A 100
=> In the above table if icode is repeated then name,rate are also repeated , so to
reduce
this redundency apply 2NF.
2NF :-
----------
1 if it is in 1NF
2 it should not contain any partial dependencies in it.
Full dependency :-
-------------------------
=> In tables if non key fields depends on key field then it is called full
dependency
Ex :-
R(A,B,C,D) A => pk
A =====> B,C,D
partial dependency :-
------------------------------
=> In table if non key field depends on part of the key field then it is called
partial dependency
Ex :-
TABLE 1 :-
BILL
BILLNO BDATE CCODE CNAME ADDR TBILL
----------
1000
1001
1002
=> above table satisfies 2NF because there is no composite primary key
TABLE 2 :-
ITEMS
BILLNO ICODE NAME RATE QTY VALUE
-----------------------
1000 1 A 100
1000 2
1000 3
1001 1 A 100
1002 1 A 100
=> above table contains partial dependency , so the table is not according to 2NF
then
decompose the table as follows.
TABLE 2 :-
ITEMS
ICODE NAME RATE
----------
TABLE 3 :-
BILL_ITEMS
BILLNO ICODE QTY VALUE
-----------------------
3NF :-
---------
1 if it is in 2NF
2 if there are no transitive dependencies in it
Transitive dependency :-
--------------------------------
=> If non key field depends on another non key field then it is called transitive
dependency.
R(A,B,C,D) A => pk
TABLE 1 :-
BILL
BILLNO BDATE CCODE CNAME ADDR TBILL
----------
1000
1001
1002
=> above table contains transitive dependency , so the table is not according to
3NF then decompose the table as follows
CUST
CCODE CNAME ADDR
------------
BILL
BILLNO BDATE TBILL CCODE(FK)
-----------
TABLE 2 :-
ITEMS
ICODE NAME RATE
----------
TABLE 3 :-
------------
BILL_ITEMS
BILLNO ICODE QTY VALUE
-----------------------
AFTER 3NF :-
-----------------
=> if table contains any derived attributes then we can remove these
attributes permanently from tables.
Ex :- TBILL
VALUE
CUST
CCODE CNAME ADDR
------------
BILL
BILLNO BDATE CCODE(FK)
-----------
ITEMS
ICODE NAME RATE
----------
BILL_ITEMS
BILLNO ICODE QTY
-------------------------
==================================================================