PL SQL Queries
PL SQL Queries
http://rfhs8012.fh-regensburg.de/~oracle/sqlplus/index.html
Note: Learn from this URL, U will be Master in SQL
http://sqlzoo.net/
http://expertanswercenter.techtarget.com/eac/knowledgebaseCategory/0,295197,sid63_tax29681
4_idx0_off50,00.html
http://www-db.stanford.edu/~ullman/fcdb/oracle/or-plsql.html
http://oldweb.uwp.edu/academic/mis/baldwin/sqlplus.htm
Oracle/SQL Tutorial :
http://www.db.cs.ucdavis.edu/teaching/sqltutorial/
2
CONSTRAINTS
PRIMARY CONSTRAINTS
SECONDARY CONSTRAINTS
CONSTRAINTS BASED ON
: PRIMARY,UNIQUE,CHECK,REFERENCES)
: NOT NULL,DEFAULT)
2 LEVELS COLUMN LEVEL and
TABLE LEVEL
Except Not null all others can be defined as Both table and column
level.
But Not null as only column level.
NOT NULL,
2. DEFAULT CONSTRAINT
CREATE TABLE EMP9(ENO NUMBER(3) NOT NULL,
ENAME VARCHAR2(10),DOJ DATE DEFAULT SYSDATE);
3. PRIMARY CONSTRAINT(COLUMN LEVEL)
UNIQUE
CREATE TABLE EMP9(
ENO NUMBER(3) NOT NULL CONSTRAINT UNIEMP UNIQUE,
ENAME VARCHAR2(10));
PRIMARY KEY
CREATE TABLE EMP9(
ENO NUMBER(3) CONSTRAINT PKEMP9 PRIMARY KEY,
ENAME VARCHAR2(10));
4. CHECK CONSTRAINT
CREATE TABLE BANK(
ACNO NUMBER(2) CONSTRAINT PKBANK PRIMARY KEY,
ACTYPE VARCHAR2(2) CONSTRAINT CKBANK CHECK ( ACTYPE IN
('SB','CA','RD')),
ACNAME VARCHAR2(10),
AMOUNT NUMBER(4));
5. REFERENCES
CREATE TABLE EMP9(
ENO NUMBER(3) CONSTRAINT PKE9 PRIMARY
JOB VARCHAR2(10),
KEY,
3
ENAME VARCHAR2(10),
MGR NUMBER(4) REFERENCES EMP9(ENO));
6. REFERENCES(REFERING TO DIFFERENT TABLE)
CREATE TABLE DEPT9(DEPTNO NUMBER(2) CONSTRAINT PKDNO PRIMARY
KEY, DNAME VARCHAR2(10), LOC VARCHAR2(10));
CREATE TABLE EMP9( EMPNO NUMBER(4),ENAME VARCHAR2(10),
SAL NUMBER(7,2),DEPTNO NUMBER(2) CONSTRAINT FKDNO REFERENCES
DEPT9(DEPTNO));
TABLE LEVEL
4
6.NthHighestSalary
selectmin(sal)"nthhighestsal"fromTEMP_EMP
wheresalin(selectsalfrom(selectDISTINCT(sal)fromTEMP_EMPorder
bysaldesc)whererownum<=&n)
SELECTDISTINCT(a.sal)FROMTEMP_EMPA
WHERE&N=(SELECTCOUNT(DISTINCT(b.sal))FROMTEMP_EMPBWHERE
a.sal<=b.sal)
SELECTsalFROM(SELECTROWNUMrn,salFROM(SELECTDISTINCT
(sal)FROMtemp_empORDERBYsaldesc))xWHEREx.rn=:n;
7.HowdoigetGreatestsalarayofdeptgroupfromemployee(we have to tables
EMP and DEPT. for exp: dept 10 have 10000,dept 20 have 5000 and dept 30 have 15000 salaries, i need dept 30 group salary(means sum of
)
selectdeptno,sal1
from(selectdeptno,sum(sal)sal1fromtemp_empgroupbydeptnoorder
bysal1desc)
whererownum<=1
that group is 15000).
TRUNCATE
DELETE
It is a DDL statement
It is a DML statement
Has
Does
SUBQUERIES
SINGLE ROW SUBQUERY
MULTIPLE ROW SUBQUERY
SINGLE ROW SUBQUERY
1. DISPLAY THE EMPLOYEES WHOSE JOB IS SAME AS THAT OF JONES
Select * from emp where job = (select job from emp
Where ename = jones);
2. DISPLAY THE EMPLOYEES BELONGING TO MILLER'S DEPARTMENT
Select * from emp where dname = (select dname from emp
Where ename = milers);
3. DISPLAY ALL THE EMPLOYEES REPORTING TO KING
Select * from emp where rname = (select rname from emp
Where ename = king);
4. DISPLAY ALL THE EMPLOYEES WHO ARE GETTING MAX SALARY
5
Select * from emp where basal = (select max(basal) from emp);
5. DISPLAY ALL THE DETAILS WHERE SAL IS GREATER THAN MILLER'S SALARY
AND WHO ARE IN SALES DEPARTMENT.
Select * from emp where dname = sales and basal > (select
basal from emp where ename = milers);
6. DISPLAY ALL THE DETAILS WHO HAVE JOINED IN SAME DATE AS THAT OF
JAMES.
Select * from emp where doj = (select doj from emp where ename =
james);
MULTIPLE ROW SUBQUERIES
7. DISPLAY ALL THE DETAILS WHERE DEPT IS EITHER SALES OR RESEARCH
Select * from emp where dname = any(select dname from emp where
dname = sales or dname = research);
Select * from emp where dname = any(select dname from emp where
Dname like(sales,research));
SUBQUERY RETURNING MULTIPLE COLUMNS
SELECT ENAME,JOB,MGR FROM EMP WHERE (JOB,MGR) IN(SELECT JOB,MGR
FROM EMP WHERE EMPNO=7788);
ROWNUM
For each row returned by a query, the ROWNUM pseudocolumn
returns a number indicating the order in which Oracle selects the row
from a table or set of joined rows. The first row selected has a ROWNUM
Of 1, the second has 2, and so on.
CORRELATED SUBQUERY
FIRST TRY USING MAX
5TH HIGHEST SALARY
SELECT * FROM EMP A WHERE 5=(SELECT COUNT(DISTINCT SAL)FROM
EMP B WHERE A.SAL<=B.SAL);
HIGHEST SALARY
7
AVG(SAL) OF EMPLOYEES IN RESPECTIVE DEPTS
SELECT A.ENAME,A.DEPTNO,A.SAL FROM EMP A,EMP B
WHERE B.SAL>(SELECT AVG(SAL) FROM EMP B GROUP BY DEPTNO)
DISPLAY ALL THE DETAILS WHERE SAL> LOWEST SAL OF EMPLOYEES IN
DEPTNO 20
SELECT * FROM EMP WHERE SAL> ANY(SELECT SAL FROM EMP WHERE
DEPTNO=20);
SELECT * FROM EMP WHERE SAL> ANY (SELECT SAL FROM EMP WHERE
DEPTNO=20);
DISPLAY ALL THE DETAILS WHERE SAL> HIGHEST SAL OF EMPLOYEES IN
DEPTNO 20
DECLARE
NAME EMP.ENAME%TYPE;
SALARY EMP.SAL%TYPE;
DESIG EMP.JOB%TYPE:='&JOB';
BEGIN
SELECT ENAME,SAL,JOB INTO NAME,SALARY ,DESIG FROM EMP WHERE
JOB=DESIG;
DBMS_OUTPUT.PUT_LINE(NAME||' '||SALARY||' '||DESIG);
END;
1.display name,hiredate of all employees using cursors
2.DISPLAY DETAILS OF ALL EMPLOYEES WHO ARE CLERKS
3.DISPLAY DETAILS OF ALL EMPLOYEES WHEN DEPTNO IS 10.
4. EXAMPLES FOR %FOUND
A
B
C
5.*ASSIGNMENT CLERK 200/-INCREMENT MANAGER INSERT TO TEMP ANALYST
DELETE SALESMAN AND ANNSAL>15000 300/- DECREMENT
6. EXAMPLE FOR %ISOPEN
7.EXAMPLE FOR C1%ROWCOUNT (7 A, 7 B)* display first 5 records
8. display details of first 5 highly paid employees
9.EVEN ROWS
10.NTH ROW
11.CURSOR USING FOR LOOP
12.IF ANNSAL>10000 AND JOB=CLERK INCOME TAX IS 10%,IF ANNSAL>15000 AND
JOB=SALESMAN TAX IS 20%,IF ANNSAL>10000 AND JOB=MANAGAER INCOME TAX IS
30%,ELSE A MESSAGE <10000.
13 CURSOR PARAMETERS TO PASS EMPLOYEE NUMBER AND GET THE DETAILS
14 PASS JOB & GET THE DETAILS
15 PASS DEPTNO AND JOB AND GET THE DETIALS
16 CURSOR LOCKS
17 EXAMPLE FOR IMPLICIT CURSORS
18 INSERT WITH IMPLICIT CURSORS
19 UPDATE AND SELECT WITH IMPLICIT CURSORS
begin
end;
(VERY IMPORTANT POINT TO BE NOTED IS THAT EXIT WHEN CONDITION IS
SATISFIED WHEN THE FETCH RETURNS FALSE AND WE WILL COME OUT OF LOOP
WHEN EXIT CONDITION IS TRUE.)
4. EXAMPLES FOR
DECLARE
%FOUND
begin
begin
a emp%rowtype;
open c1;
LOOP
fetch c1 into a;
IF c1%FOUND THEN
DBMS_OUTPUT.PUT_LINE(A.ENAME||' '||A.SAL||' '||A.DEPTNO);
else
EXIT;
END IF;
END LOOP;
close c1;
end;
4 C
DECLARE
begin
loop
fetch c1 into a;
IF not c1%FOUND THEN
exit;
else
DBMS_OUTPUT.PUT_LINE(a.ename||' '||a.sal);
END IF;
end loop;
close c1;
end;
5.CLERK 200/-INCREMENT MANAGER INSERT NAME,SAL TO TEMP ANALYST DELETE
SALESMAN AND ANNSAL>15000 300/- INCREMENT
DECLARE
CURSOR C1 IS SELECT * FROM EMP;
A C1%ROWTYPE;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO A;
EXIT WHEN C1%NOTFOUND;
IF A.JOB='CLERK' THEN
UPDATE EMP SET SAL=A.SAL+200 WHERE EMPNO=A.EMPNO;
COMMIT;
ELSIF A.JOB='MANAGER' THEN
DBMS_OUTPUT.PUT_LINE('ROW INSERTED');
INSERT INTO TEMP VALUES(A.ENAME,A.JOB,A.SAL);
COMMIT;
ELSIF A.JOB='ANALYST' THEN
DBMS_OUTPUT.PUT_LINE('ROW DELETED');
DELETE FROM EMP WHERE EMPNO=A.EMPNO;
COMMIT;
ELSIF A.JOB='SALESMAN' AND A.SAL*12>5000 THEN
10
DBMS_OUTPUT.PUT_LINE('ROW SALESMAN UPDATED');
UPDATE EMP SET SAL=SAL+300 WHERE EMPNO=A.EMPNO;
COMMIT;
ELSE
DBMS_OUTPUT.PUT_LINE('NO CHANGES');
END IF;
END LOOP;
CLOSE C1;
END;
CREATE TABLE TEMP( A VARCHAR2(10),B VARCHAR2(10),C NUMBER(7,2));
6. EXAMPLE FOR %ISOPEN
DECLARE
CURSOR C1 IS SELECT * FROM EMP;
A C1%ROWTYPE;
BEGIN
IF C1%ISOPEN THEN
DBMS_OUTPUT.PUT_LINE('CURSOR ALREADY OPEN');
ELSE
DBMS_OUTPUT.PUT_LINE('CURSOR IS YET TO BE OPENED');
OPEN C1;
END IF;
LOOP
FETCH C1 INTO A;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(A.SAL||' '||A.ENAME||' '||A.JOB);
END LOOP;
CLOSE C1;
END;
6. B
IF NOT C1%ISOPEN
OPEN C1;
ELSE
DBMS_OUTPUT.PUT_LINE('CURSOR IS NOT OPEN');
END IF;
11
end;
loop
fetch c1 into a;
exit when c1%rowcount>6;
dbms_output.put_line(a.ename||' '||a.sal||' '||a.job||'
'||C1%ROWCOUNT);
end loop;
close c1;
open c1;
loop
fetch c1 into a;
exit when c1%notfound;
if c1%rowcount<=6 then
dbms_output.put_line(a.ename||' '||a.sal||' '||a.job);
end if;
end loop;
close c1;
end;
8 display details of first 5 highly paid employees
DECLARE
begin
end;
9. display only even rows
DECLARE
begin
12
end;
(for odd rows change 0 to 1);
10 display nth row
DECLARE
begin
n:=&n;
open c1;
loop
fetch c1 into a;
exit when c1%notfound;
if c1%rowcount=n then
dbms_output.put_line(a.ename||' '||a.sal||' '||a.job);
end if;
end loop;
close c1;
end;
11
declare
cursor c2 is select * from emp;
begin
for a in c2 loop
dbms_output.put_line(a.ename||' '||a.sal||' '||a.job);
end loop;
end;
12. IF ANNSAL>10000 AND JOB=CLERK INCOME TAX IS 10%,IF ANNSAL>15000 AND
JOB=SALESMAN TAX IS 20%,IF ANNSAL>10000 AND JOB=MANAGAER INCOME TAX IS
30%,ELSE A MESSAGE <10000
alter table emp add(it number(3));
declare
cursor c1 is select * from EMP;
a c1%rowtype;
begin
open c1;
loop
fetch c1 into a;
exit when c1%notfound;
if a.sal*12>10000 and a.job='CLERK' THEN
UPDATE EMP SET IT=A.SAL*12*0.1 WHERE EMPNO=A.EMPNO;
ELSIF A.SAL*12>15000 AND A.JOB ='SALESMAN' THEN
UPDATE EMP SET IT=A.SAL*12*0.2 WHERE EMPNO=A.EMPNO;
ELSIF A.SAL*12>10000 AND A.JOB='MANAGER' THEN
UPDATE EMP SET IT=A.SAL*12*0.3 WHERE EMPNO=A.EMPNO;
ELSIF A.SAL*12<10000 THEN
DBMS_OUTPUT.PUT_LINE(A.ENAME||' '||'SAL< 10000');
END IF;
END LOOP;
COMMIT;
13
CLOSE C1;
END;
13
DECLARE
CURSOR C1( z NUMBER) IS SELECT * FROM EMP WHERE DEPTNO=z;
A C1%ROWTYPE;
BEGIN
OPEN C1(&DEPTNO);
LOOP
FETCH C1 INTO A;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(A.ENAME||' '||A.DEPTNO||' '||A.SAL);
END LOOP;
CLOSE C1;
END;
14 TO PASS JOB AND GET THE DETAILS
DECLARE
CURSOR C1( A VARCHAR) IS SELECT * FROM EMP WHERE JOB=A;
A C1%ROWTYPE;
BEGIN
OPEN C1('&AJOB');
LOOP
FETCH C1 INTO A;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(A.JOB||' '||A.ENAME||' '||A.EMPNO||' ||A.SAL);
END LOOP;
CLOSE C1;
END;
NOTE
14
16 CURSOR LOCKING
DECLARE
CURSOR C1 IS SELECT * FROM EMP FOR UPDATE OF SAL;
A C1%ROWTYPE;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO A;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(A.JOB||' '||A.ENAME||' '||A.SAL||'
A.DEPTNO);
IF A.JOB='CLERK' THEN
UPDATE EMP SET JOB='FDC' WHERE empno=a.empno;
end if;
end loop;
close c1;
end;
17
'||
DECLARE
CURSOR C1 IS SELECT * FROM EMP;
A C1%ROWTYPE;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO A;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(C1%ROWCOUNT||' '||SQL%ROWCOUNT||' '||A.ENAME);
END LOOP;
CLOSE C1;
END;
(YOU WILL NOT GET THE OUTPUT BECAUSE SQL%ROWCOUNT WILL RETURN A VALUE
ONLY WHEN THE PREVIOUS DML OPERATION IS SUCCESSFULLY COMPLETLE)
18.
15
END IF ;
END LOOP;
CLOSE C2;
END;
19
DECLARE
BEGIN
DELETE FROM EMP WHERE DEPTNO=10;
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
END;
20.
DECLARE
A EMP%ROWTYPE;
BEGIN
SELECT * INTO A FROM EMP WHERE EMPNO=7788;
DBMS_OUTPUT.PUT_lINE('AFTER SELECT SQLCOUNT'|| ' '||SQL%ROWCOUNT);
UPDATE EMP SET DEPTNO=99 WHERE DEPTNO=10;
DBMS_OUTPUT.PUT_lINE('AFTER UPDATE SQLCOUNT'|| ' '||SQL%ROWCOUNT);
END;
OUTPUT IS
AFTER SELECT SQLCOUNT 1
AFTER UPDATE SQLCOUNT 3
21.DISPLAY NAMES OF EMPLOYEES WITH SAL IN DESCENDING ORDER WITHOUT
USING ORDER BY
DECLARE
CURSOR C1 IS SELECT * FROM EMP;
A C1%ROWTYPE;
N NUMBER;
BEGIN
OPEN C1;
SELECT MAX(SAL) INTO N FROM EMP;
LOOP
FETCH C1 INTO A;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(N);
SELECT MAX(SAL) INTO N FROM EMP WHERE SAL<N;
END LOOP;
CLOSE C1;
END;
22.DISPLAY JOB CATEGORIES ,COUNT(JOB) AND SUM(SAL) FROM EMP
DECLARE
CURSOR C1 IS SELECT JOB,COUNT(JOB) XY ,SUM(SAL) AB FROM EMP
GROUP BY JOB;
A C1%ROWTYPE;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO A;
16
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('________________________________________________')
;
DBMS_OUTPUT.PUT_LINE('
JOB
'||'
NUMBER
'||'
SUM OF SAL
');
DBMS_OUTPUT.PUT_LINE(A.JOB||'
'|| A.XY ||'
'||
A.AB);
END LOOP;
CLOSE C1;
END;
DECLARE
CURSOR T1 IS SELECT * FROM TEST1;
TEST_REC T1%ROWTYPE;
BEGIN
FOR TEST IN T1
LOOP
UPDATE TEST1 SET AREA=400 WHERE RADIUS=50;
IF SQL%ROWCOUNT >0 THEN
DBMS_OUTPUT.PUT_LINE('RECORD IS ALREADY EXISTS');
ELSE
DBMS_OUTPUT.PUT_LINE('THERE IS NO RECORD');
END IF;
END LOOP;
END;
DECLARE
RDA AREAS.RADIUS%TYPE;
BEGIN
SELECT RADIUS INTO RDA FROM AREAS WHERE RADIUS =345;
EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('RECORD NOT
FOUND');
END;
Database objects
TABLES,VIEWS,SYNONYM,INDEX,CLUSTER,SEQUENCE,PROCEDURE,FUNCTION
PACKAGE,TRIGGER
VIEWS
Virtual table changes reflected in table & viceversa no data of
its own, no redundancy and security. A logical table based on one or
more tables or views.
1.CREATE VIEW EV AS SELECT * FROM EMP;
2.CREATE VIEW EV1 AS SELECT ENAME,EMPNO,DEPTNO FROM EMP;
3.CREATE VIEW EV2(EMPNO,SALARY) AS SELECT EMPNO,SAL FROM EMP;
4.CREATE VIEW EM1 AS SELECT ENAME,SAL,DEPTNO,EMPNO,JOB
FROM EMP WHERE DEPTNO=20;
READ ONLY VIEW
17
VIEWS WITH GROUP BY,ORDER BY ,AGG , PRIMARY KEY AND CHECK
CONSTRAINTS. THE VIEW BECOMES A READ ONLY VIEW.
1. CREATE VIEW EV AS SELECT DEPTNO,COUNT(*) COUNT FROM EMP GROUP BY
DEPTNO;
2. CREATE VIEW EM1 AS SELECT ENAME,SAL,DEPTNO,EMPNO,JOB
FROM EMP WHERE DEPTNO=20 WITH CHECK OPTION CONSTRAINT CK1;
FORCED VIEWS
CREATE FORCE VIEW ABC AS SELECT EMPNO,ENAME,SAL FROM EMPOP;
SEE THE VIEWS
SELECT * FROM <view name>;
DROP VIEW ABC;
SELECT * FROM USER_VIEW;
CREATE VIEW MAG AS SELECT M.MNO,M.NAME,MA.GP,MA.NP FROM MAGI M,MAG MA ;
SYNONYMS
A synonym is an alternative name for a table,view, sequence,
procedure, stored function.
1).Public synonym
2).Private synonym
CREATE SYNONYM Z FOR EMP;
CREATE PUBLIC SYNONYM VV FOR EMP;
DROP SYNONYM Z;
SELECT * FROM USER_SYNONYMS WHERE TABLE_NAME='EMP';
INDEXES
An index is a database object that contains an entry for each
value that appears in the indexed column(s) of the table or cluster and
provides direct, fast access to rows.
PRIMARY KEY AUTOMATICALLY INDEXED HAS ITS EFFECT ON LARGER TABLES
CREATE INDEX AB ON EMP(EMPNO);
SELECT * FROM USER_INDEXES WHERE TABLE_NAME='EMP';
IF YOU WANT TO INDEX A PRIMARY KEY COLUMN FIRST JUST DISABLE IT
DROP INDEX AB;
SEQUENCES
A sequence is a database object from which multiple users may
18
generate unique integers.You can use sequences to automatically generate
primary key values.
1.CREATE
2.CREATE
MINVALUE
3.CREATE
MINVALUE
4.CREATE
MINVALUE
SEQUENCE S1 INCREMENT
SEQUENCE S5 INCREMENT
5 CYCLE CACHE 2;
SEQUENCE S5 INCREMENT
5 CYCLE CACHE 2;
SEQUENCE S6 INCREMENT
4 CYCLE CACHE 2;
CLUSTERS
A cluster is a schema object that contains one or more tables
that all have one or more columns in common.
1. create cluster c44(deptno number);
2. create table EMPC44(Eno number(9),deptno number,
SAL NUMBER(7,2),HIREDATE DATE)cluster c44(deptno);
3. create table DMPC44(deptno number,DNAME VARCHAR2(10),
LOC VARCHAR2(10))cluster c44(deptno);
4. create index c1i on cluster c4;
tcl commands
grant, revoke
grant privilege on tablename to username
(PRIVILEGES THAT CAN BE GRANTED ARE SELECT , UPDATE, DELETE, INSERT
ALTER,REFERENCE,INDEX)
1. GRANT SELECT ON EMP TO SAVITHA
2. GRANT SELECT ON EMP TO SAVITHA WITH GRANT OPTION
REVOKE ALL ON EMP FROM GEETHA;
COMMIT, ROLLBACK , SAVEPOINT
SQL> SELECT * FROM DEPT;
DEPTNO
--------10
20
30
40
50
DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
CS
LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
MYSORE
19
SQL> SAVEPOINT A
2 ;
Savepoint created.
SQL> INSERT INTO DEPT VALUES(60,'IP','BANGALORE');
1 row created.
SQL>
SAVEPOINT B;
Savepoint created.
SQL>
1 row created.
SQL> SELECT * FROM DEPT;
DEPTNO
--------10
20
30
40
50
60
70
DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
CS
IP
IT
LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
MYSORE
BANGALORE
GOA
7 rows selected.
SQL> ROLLBACK TO SAVEPOINT B;
Rollback complete.
SQL> SELECT * FROM DEPT;
DEPTNO
--------10
20
30
40
50
60
DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
CS
IP
6 rows selected.
LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
MYSORE
BANGALORE
20
Triggers:
A database trigger is a stored PL/SQL program unit associated
with a specific database table. Oracle executes (fires) the database
trigger automatically whenever a given SQL operation affects the table.
So,unlike subprograms, which must be invoked explicitly, database
triggers are invoked implicitly. Among other things, you can use
database triggers to
OF
DATABASE TRIGGERS
1. WRITE A DATABASE TRIGGER WHICH WILLN'T ALLOW THE USER TO
INSERT,UPDATE OR DELETE BETWEEN NIGHT 7 AND MORNING 6
2. WRITE A DATABASE TRIGGER WHICH FIRES IF YOU TRY TO INSERT ,
UPDATE OR DELETE AFTER 7'O' CLOCK.
3. WRITE A DATABASE TRIGGER BEFORE INSERTING VALUES ON TO
EMP TABLE IF DEPTNO DOES NOT EXIST IN DEPT THEN RAISE THE ERROR.
4. WRITE A DATABASE TRIGGER TO ILLUSTRATE TABLE LEVEL AND
ROW LEVEL TRIGGERS.
5.
6.
21
7.
8.
9.
10.
WRITE A DATABASE TRIGGER WHICH SHOULD NOT DELETE FROM EMP TABLE
IF THE DAY IS SUNDAY.
11.
12.
13. WRITE A DATABASE TRIGGER USING INSERTING AND UPDATING WE SHOULD NOT
INSERT ON SUNDAY AND WE SHOULD NOT UPDATE ON LAST DAY OF THE MONTH.
14. UPDATE EMP TABLE AND CHANGE OLD DEPTNO TO NEW DEPTNO. IF OLD DEPTNO
IS 20 THEN DELETE FROM DEPT WHERE DEPTNO IS EQUAL TO NEW DEPTNO
15. WRITE A DATABASE TRIGGER TO DELETE FROM DEPT TABLE .AFTER DELETING
INSERT THE OLD VALUES TO A TABLE.
16. WRITE A DATABASE TRIGGER WHICH SHOULD NOT DELETE THE ROW IF THE
MONTH IS APRIL.
17. WRITE A DATABASE TRIGGER WHICH FIRES BEFORE PERFORMING INSERT
OR UPDATE OPERATIONS. IF THE JOB IS MANAGER THEN HIS SALARY
SHOULD BE IN THE GRADE 5.ELSE RAISE THE APPLICATION ERROR.
1. WRITE A DATABASE TRIGGER WHICH WILLN'T ALLOW THE USER TO
INSERT,UPDATE OR DELETE BETWEEN NIGHT 7 AND MORNING 6
CREATE OR REPLACE TRIGGER GEETIME BEFORE INSERT OR UPDATE
OR DELETE ON EMP for each row
DECLARE
A VARCHAR2(10);
BEGIN
--select to_char(sysdate,'hh24') into a from dual;
A:=TO_CHAR(SYSDATE,'HH24');
IF TO_NUMBER(A) > 19 OR TO_NUMBER(A) < 7 then
RAISE_APPLICATION_ERROR(-20500,'YOU CANT DO THIS OPERATION NOW');
END IF;
END;
2.WRITE A DATABASE TRIGGER WHICH
DELETE AFTER 7'O' CLOCK
22
DECLARE
A VARCHAR2(10);
BEGIN
SELECT TO_CHAR(SYSDATE,'HH:MI') INTO A FROM DUAL;
IF A > '06:00' then
RAISE_APPLICATION_ERROR(-20500,'YOU CANT DO THIS OPERATION
NOW');
END IF;
END;
2.WRITE A DATABASE TRIGGER BEFORE INSERTING VALUES ON TO
EMP TABLE IF DEPTNO DOES NOT EXIST IN DEPT THEN RAISE THE ERROR.
CREATE OR REPLACE TRIGGER IEMP BEFORE INSERT ON EMP
FOR EACH ROW
DECLARE
A NUMBER;
BEGIN
SELECT COUNT(*) INTO A FROM DEPT WHERE
DEPTNO=:NEW.DEPTNO;
IF A=0 THEN
RAISE_APPLICATION_ERROR(-20300,'PARENT KEY IS NOT
EXISTING');
ELSE
PRINT('RECORD IS ALREADY INSERTED');
END IF;
END;
OUTPUT OF THE QUERY IS AS BELOW
SQL> INSERT INTO EMP(EMPNO,DEPTNO) VALUES(23,44);
INSERT INTO EMP(EMPNO,DEPTNO) VALUES(23,44)
*
ERROR at line 1:
ORA-20300: PARENT KEY IS NOT EXISTING
ORA-06512: at "GEETHA.IEMP", line 6
ORA-04088: error during execution of trigger 'GEETHA.IEMP'
3.WRITE A DATABASE TRIGGER TO ILLUSTRATE TABLE LEVEL AND
ROW LEVEL TRIGGERS.
CREATE OR REPLACE TRIGGER UPTABLE BEFORE update ON EMP
BEGIN
DBMS_OUTPUT.PUT_LINE('UPDATE ON TABLE IS FIRED');
END;
CREATE OR REPLACE TRIGGER UPROW BEFORE UPDATE ON EMP
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('UPDATE ON ROW IS FIRED');
END;
4.WRITE A DATABASE TRIGGER WHICH ACTS JUST LIKE PRIMARY KEY AND DOES
23
NOT
ALLOW DUPLICATE VALUES
CREATE OR REPLACE TRIGGER PRIKEY BEFORE INSERT ON EMP
FOR EACH ROW
DECLARE
A NUMBER;
BEGIN
SELECT COUNT(*) INTO A FROM EMP WHERE EMPNO=:NEW.EMPNO;
IF A >=1 THEN
RAISE_APPLICATION_eRROR(-20500,'THE PRI KEY RULE IS
VOILATED');
ELSIF A=0 THEN
PRINT('RECORD IS INSERTED');
END IF;
END;
SQL> INSERT INTO EMP(EMPNO,DEPTNO) VALUES(7788,20);
INSERT INTO EMP(EMPNO,DEPTNO) VALUES(7788,20)
*
ERROR at line 1:
ORA-20500: THE PRI KEY RULE IS VOILATED
ORA-06512: at "GEETHA.PRIKEY", line 6
ORA-04088: error during execution of trigger 'GEETHA.PRIKEY'
SQL>
1 row created.
5. CREATE A DATABASE TRIGGER WHICH PERFORMS THE ACTION OF THE
ON DELETE CASCADE;
CREATE OR REPLACE TRIGGER DELDEPT
AFTER DELETE ON DEPT FOR EACH ROW
BEGIN
DELETE FROM EMP WHERE DEPTNO=:OLD.DEPTNO;
PRINT('RECORDS IN EMP ARE ALSO DELETED');
END;
6.WRITE A DATABASE TRIGGER TO INSERT DISTINCT EMPLOYEE NUMBER TO
EMP TABLE (BEFORE INSERT)
CREATE OR REPLACE TRIGGER PRIM_UNIQUE
BEFORE INSERT ON emp FOR EACH ROW
DECLARE
NO NUMBER;
BEGIN
SELECT NVL(MAX(EMPNO),0)+1 INTO NO FROM EMP;
:NEW.EMPNO:=NO;
END;
7.WRITE A DATABASE TRIGGER TO UPDATE THE SAL FIELD.IF SAL IS MORE THAN
5000 OR LESS THAN 1000 THEN RAISE THE ERROR.(BEFORE UPDATE).
24
CREATE OR REPLACE TRIGGER CHECK_SAL BEFORE update
FOR EACH ROW
BEGIN
if :new.sal <1000 or :new.sal>5000 then
raise_application_error(-20001,'check sal ');
end if;
END;
ON emp
');
25
CREATE OR REPLACE TRIGGER EMPNO_CHECK
BEFORE INSERT OR UPDATE
ON emp
FOR EACH ROW
BEGIN
IF INSERTING THEN
if to_char(sysdate,'dy')='mon' then
raise_application_error(-20001,'TO DAY IS SUNDAY
end if;
end if;
IF UPDATING THEN
if to_char(sysdate)=LAST_DAY(SYSDATE) then
raise_application_error(-20001,'TO DAY IS MONTHY
LAST DAY so no updating ');
end if;
END IF;
END;
');
13.UPDATE EMP TABLE AND CHANGE OLD DEPTNO TO NEW DEPTNO. IF OLD DEPTNO
IS 20 THEN DELETE FROM DEPT WHERE DEPTNO IS EQUAL TO NEW DEPTNO
CREATE OR REPLACE TRIGGER AFTER_UPDATE
AFTER UPDATE ON EMP
FOR EACH ROW
BEGIN
IF :OLD.DEPTNO=20 THEN
DELETE FROM DEPT WHERE DEPTNO=:NEW.DEPTNO;
END IF;
END;
14.WRITE A DATABASE TRIGGER TO DELETE FROM DEPT TABLE .AFTER DELETING
INSERT THE OLD VALUES TO A TABLE.
CREATE OR REPLACE TRIGGER AFTER_delete
AFTER delete ON DEPT
FOR EACH ROW
BEGIN
insert into dept1 values(:old.deptno,:old.dname,:old.loc);
END;
15.WRITE A DATABASE TRIGGER WHICH SHOULD NOT DELETE THE ROW
IF THE MONTH IS APRIL.
BEGIN
END;
');
26
IN THE GRADE 5.ELSE RAISE THE APPLICATION ERROR.
create or replace trigger jobgrade
before insert or update of JOB,SAL on emp
for each row
when (new.job='MANAGER')
declare
lo number;
hi number;
begin
select losal,hisal into lo,hi from salgrade where grade=5;
if :new.sal>lo and :new.sal<hi then
print('insert success');
else
raise_application_error(-20500,'INsert operation not allowed');
end if;
end;
27
end;
A NUMBER(3)
A:=1000;
INVALID_NUMBER
A NUMBER
A:='XXX'
CURSOR_ALREADY_OPEN
INVALID_CURSOR
ZERO_ERROR
STORAGE_ERROR
PROGRAM_ERROR
LOGIN_DENIED
100/0
28
DUP_VAL_INDEX
VIOLATING UNIQUE
USER-DEFINED EXCEPTION
-----------------------------------------------------------------------------------------VALUE_ERROR:
----------DECLARE
S1 NUMBER;
BEGIN
A:=1000;
SELECT SAL INTO S1 FROM EMP WHERE EMPNO=700;
DBMS_OUTPUT.PUT_LINE(S1);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('NO SUCH EMPLOYEE');
WHEN VALUE_ERROR THEN
A:=100;
UPDATE EMP SET SAL=SAL+A;
END;
---------------------------------------------------------------------
USER-DEFINED EXCEPTION
---------------------DECLARE
BEGIN
A1 EXCEPTION;
S1 EMP.SAL%TYPE;
DECLARE
RAD NUMBER;
AREA2 NUMBER;
BEGIN
SELECT RADIUS,AREA INTO RAD,AREA2
DBMS_OUTPUT.PUT_LINE(RAD||AREA2);
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('TOO MANY ROWS');
29
END;
1.
WRITE A FUCTION TO DISPLAY THE SYSTEM TIME AND THE CORRESPONDING
PL/SQL BLOCK.
2.
3.
4.
5.
6.
7.
PASSED
(STORED FUNCTION)
WRITE A FUNCTION TO DISPLAY THE JOB WHEN THE NUMBER IS PASSED
WRITE A FUNCTION TO ACCEPT NAME AND PRINT JOB
WRITE A FUCTION TO ADD 2 NUMBERS.
(STORED FUNCTION)
WRITE A FUNCTION TO CHECK WHETHER NUMBER IS EVEN OR ODD
(LOCAL FUNCTION)
WRITE A FUNCTION TO GET SALARY WHEN NUMBER IS PASSED.
WRITE A FUNCTION TO ILLUSTRATE IN OUT PARAMETERS.
EXAMPLE FOR IN PARAMETER
WRITE A FUNCTION TO ILLUSTRATE OUT PARAMETER.
WRITE A FUNCTION TO DISPLAY NAME,JOB AND SALARY WHEN NUMBER IS
8.
9.
10.
30
11.
If delete
operation
13.
************************************************************************
***********
FUNCTIONS
~~~~~~~~~
1.
WRITE A FUCTION TO DISPLAY THE SYSTEM TIME AND THE CORRESPONDING
PL/SQL BLOCK.
CREATE OR REPLACE FUNCTION TIME1
RETURN VARCHAR IS
TIM VARCHAR(10);
BEGIN
SELECT TO_CHAR(SYSDATE,'HH:MI:SS') INTO TIM FROM DUAL;
RETURN TIM;
END;
DECLARE
AB VARCHAR(30);
BEGIN
AB:=TIME1;
DBMS_OUTPUT.PUT_lINE(AB);
END;
________________________________________________________________________
_
2.(STORED FUNCTION)
WRITE A FUNCTION TO DISPLAY THE JOB WHEN THE NUMBER IS PASSED
CREATE OR REPLACE FUNCTION SAL (N NUMBER)
RETURN VARCHAR IS
DESIG EMP.JOB%TYPE;
BEGIN
SELECT JOB INTO DESIG FROM EMP WHERE EMPNO=N;
RETURN DESIG;
31
END;
SELECT SAL(&N) FROM DUAL;
IF YOU GIVE THE VALUE FOR N IMMEDIATELY VALUE WILL BE DISPLAYED.
DECLARE
A VARCHAR(10);
BEGIN
A:=SAL(&EMPNO);
DBMS_OUTPUT.PUT_LINE(A);
END;
_____________________
WRITE A FUNCTION TO ACCEPT NAME AND PRINT JOB
S
CREATE OR REPLACE FUNCTION FUN(N VARCHAR2)
RETURN VARCHAR2 IS
J VARCHAR2(10);
BEGIN
SELECT JOB INTO J FROM EMP WHERE ENAME=N;
RETURN J;
END;
Declare
A varchar2(25);
B varchar2(25);
Begin
A:= fun(&b);
Dbms_output.put_line(a);
End;
________________________________________________________________________
_
3.(STORED FUNCTION)
WRITE A FUNCTION TO CHECK WHETHER NUMBER IS EVEN OR ODD
CREATE OR REPLACE FUNCTION EV_ODD(N NUMBER)
RETURN VARCHAR IS
BEGIN
IF MOD(N,2)=0 THEN
RETURN('NUMBER IS EVEN');
ELSE
RETURN('NUMBER IS ODD');
END IF;
END;
DECLARE
NO_TEST NUMBER:=&NO_TEST;
MES VARCHAR(25);
BEGIN
MES:=EV_ODD(NO_tEST);
32
DBMS_OUTPUT.PUT_LINE(MES);
END;
______________________
CREATE OR REPLACE FUNCTION ADD1(N1 NUMBER,N2 NUMBER)
RETURN NUMBER IS
RES NUMBER;
BEGIN
RES:=N1+N2;
RETURN RES;
END;
SELECT ADD1(2,3) FROM DUAL;
OR
YOU CAN ALSO HAVE A PL/SQL BLOCK TO EXECUTE THE FUNCTION.
________________________________________________________________________
_
4.(LOCAL FUNCTION)
WRITE A FUNCTION TO GET SALARY WHEN NUMBER IS PASSED.
DECLARE
A NUMBER;
FUNCTION F1(N NUMBER) RETURN NUMBER
IS
SALARY EMP.SAL%TYPE;
BEGIN
SELECT SAL INTO SALARY FROM EMP WHERE EMPNO=N;
RETURN SALARY;
END;
BEGIN
A:=F1(&N);
DBMS_OUTPUT.PUT_LINE(A);
END;
________________________________________________________________________
_
5.
WRITE A FUNCTION TO ILLUSTRATE IN OUT PARAMETERS.
create or replace function FUN(n IN OUT number) return number IS
BEGIN
N:=N+10;
RETURN N;
END;
declare
n1 number :=10;
n2 number;
33
begin
n2 :=fun(n1);
dbms_output.put_line(n2);
end;
________________________________________________________________________
_
6.
CREATE
RETURN
SALARY
BEGIN
SELECT
RETURN
END;
DECLARE
SALARY NUMBER(7,2);
BEGIN
SALARY:=FUN1(7788);
DBMS_OUTPUT.PUT_lINE(SALARY);
END;
________________________________________________________________________
_
7.
--WRITE A FUNCTION TO ILLUSTRATE OUT PARAMETER.
--WRITE A FUNCTION TO DISPLAY NAME,JOB AND SALARY WHEN NUMBER IS PASSED
CREATE OR REPLACE FUNCTION FUN5(DESIG EMP.EMPNO%TYPE,SALARY OUT
EMP.SAL%TYPE,
S OUT EMP.JOB%TYPE)
RETURN VARCHAR2 IS
NAME VARCHAR(30);
BEGIN
SELECT ENAME,JOB,SAL INTO NAME,S,SALARY FROM EMP WHERE EMPNO=DESIG;
RETURN NAME;
EXCEPTION
WHEN OTHERS THEN
RETURN ('ERROR');
END;
DECLARE
A EMP.EMPNO%TYPE:=&EMPNO;
B VARCHAR(30);
C VARCHAR(30);
D NUMBER(8,2);
BEGIN
B:=FUN5(A,D,C);
34
DBMS_OUTPUT.PUT_LINE(A||' '||B||' '||C||' '||d);
END;
OUTPUT OF THE QUERY IS
Enter value for empno: 7900
old
2: A EMP.EMPNO%TYPE:=&EMPNO;
new
2: A EMP.EMPNO%TYPE:=7900;
Commit complete.
7900 JAMES CLERK 950
________________________________________________________________________
_
8.
IF ANNSAL>10000 TAX IS 10%
IF ANNSAL>15000 TAX IS 20%
IF ANNSAL>20000 INCOME TAX IS 30%
ELSE
INCOME TAX IS ZERO.
CREATE OR REPLACE FUNCTION INCOMETAX(N NUMBER)
RETURN NUMBER IS
SC NUMBER;
ANN NUMBER;
IT NUMBER;
BEGIN
SELECT SAL+NVL(COMM,0) INTO SC FROM EMP WHERE EMPNO=N;
ANN:=SC*12;
IF ANN>10000 AND ANN<15000 THEN
IT:=ANN*0.1;
ELSIF ANN>15000 AND ANN<20000 THEN
IT:=ANN*0.2;
ELSIF ANN>20000 THEN
IT:=ANN*0.3;
ELSE
IT:=0;
END IF;
RETURN IT;
END;
DECLARE
IT NUMBER;
BEGIN
IT:=INCOMETAX(&EMPNO);
DBMS_OUTPUT.PUT_LINE('INCOME TAX OF THE EMPLOYEE IS');
DBMS_OUTPUT.PUT_LINE(IT);
END;
________________________________________________________________________
_
9.
--WRITE A FUNCTION TO FIND THE FACTORIAL OF A NUMBER
35
N || 'IS'||RESULT);
OR
SELECT FACT(4) FROM DUAL;
________________________________________________________________________
_
10.
36
OR
SQL> SELECT GROSS(7934) FROM DUAL;
GROSS(7934)
----------2210
________________________________________________________________________
_
11.
WRITE A FUNCTION TO RETURN THE AVERAGE SALARY OF THE
EMPLOYEES.IF THE
NUMBER OF EMPLOYEES ARE MORE THAN 2 THEN ONLY CALCULATE THE
AVERAGE.
CREATE OR REPLACE FUNCTION AVSAL(N NUMBER) RETURN NUMBER IS
CO1 NUMBER;
AG NUMBER;
BEGIN
SELECT COUNT(*) INTO CO1 FROM EMP WHERE DEPTNO=N;
IF N>2 THEN
SELECT AVG(SAL) INTO AG FROM EMP WHERE DEPTNO=N;
END IF;
RETURN AG;
END;
DECLARE
N NUMBER:=&DEPTNO;
ASAL NUMBER;
BEGIN
ASAL:=AVSAL(N);
DBMS_OUTPUT.PUT_lINE('AVERAGE SALARY OF DEPTNO'||' '||N||'
'||ASAL);
END;
IS
________________________________________________________________________
_
12.
--write a pl/sql block to delete a record.
--ISsuccessful return 1 else return 0.
If delete
operation
37
end;
declare
n number;
begin
n:=fun3(&empno);
dbms_output.put_Line(n);
if n=0 then
dbms_output.put_line('deletion unsuccessfull');
elsif n=1 then
dbms_output.put_line('deletion successfull');
end if;
end;
________________________________________________________________________
_
13.
write a pl/sql block to pass the employee number and the increment
amount . FUNCTION SHOULD RETURN THE NET SALARY
create or replace function raise_sal(eno number,incre number)
return number is
a number;
begin
select count(*) into a from emp where empno=eno;
if a=0 then
raise_application_error(-20300,'employee does not exist');
else
update emp set sal=sal+incre where empno=eno;
select sal into a from emp where empno=eno;
end if;
return a;
end;
declare
netsal number;
begin
netsal:=raise_sal(&empno,&salary);
dbms_output.put_line('Net salary is'||' '||netsal);
end;
________________________________________________________________________
_
14.
write a pl/sql block to illustrate default as in parameter.
create or replace function def(n number default 7369) return number
is
salary emp.sal%type;
38
begin
select sal into salary from emp where empno=n;
return salary;
end;
select def from dual;
________________________________________________________________________
_
functions :
1)
2)
39
1)
2)
3)
4)
5)
ARITHMETIC
CHARACTER
GENERAL
DATE
CONVERSION
1
ARITHMETIC FUNCTIONS
~~~~~~~~~~~~~~~~~~~~
ABs
ceil(>n)
floor(<n)
mod
power
sign
sqrt
trunc
round
(SIN,COS,TAN,SINH,LOG,LN)
2
CHARACTER FUNCTIONS
~~~~~~~~~~~~~~~~~~~~~~~~~~~
INITCAP
LOWER
UPPER
LPAD
RPAD
SOUNDEX
LTRIM
RTRIM
SUBSTR
LENGTH
INSTR
CONCAT
3
GENERAL FUNCTIONS
~~~~~~~~~~~~~~~~~~~~~~~~~
NVL
DECODE
TRANSLATE
REPLACE
GREATEST
LEAST
4
DATE FUNCTIONS
~~~~~~~~~~~~~~~~~~~~~~~~~
SYSDATE
ADD_MONTHS
MONTHS_BETWEEN
LAST_DAY
NEXT_DAY
5
CONVERSION FUNCTIONS
40
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TO_DATE
TO_CHAR
TO_NUMBER
GROUP FUNCTIONS
~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~
COUNT
SUM
MAX
MIN
AVG
SYMBOL DEFINITION
~~~~~~ ~~~~~~~~~~
D
NUMBER OF DAY IN WEEK(1-7 STARTS WITH SUNDAY)
DD
DAY IN NUMBERS
DDD
NUMBER OF DAYS SINCE JAN1
DAY
DAY FULLY SPELT OUT
DY
FIRST 3 CHARACTERS OF THE DAY
MM
MONTH IN NUMBERS
MONTH
MONTH FULLY SPELT OUT
MON
MONTH IN 3 LETTERS
WW
NUMBER OF WEEKS OVER SINCE JAN 1
W
NUMBER OF WEEKS OVER IN THAT MONTH
Y
1 DIGIT YEAR
YY
2 DIGIT YEAR
YYY
3 DIGIT YEAR
YYYY
4 DIGIT YEAR
YEAR
YEAR FULLY SPELT OUT
HH
HOUR
MI
MINUTES
SS
SECONDS
SSSS
MILLISECONDS
HH24
24 HOUR FORMAT
HH12
12 HOUR FORMAT
FMDDTH 1ST,2ND,3RD ----(ORDINAL FORMAT)
RM
ROMAN NUMERAL MONTH
FMDDSPTH
SPELLED FORMAT (FIRST, SECOND, THIRD)
41
IN
IN
42
(SELECT COUNT(*)-&N FROM EMP)) minus
(select rowid from emp where rownum<=
(select count(*) -&n from emp))
);
(THIRD TRIAL)
~~~~~~~~~~~~~~~
DELETE FROM EMP A WHERE ROWID IN
(
( SELECT ROWID FROM EMP WHERE ROWNUM<=&N)
MINUS
(SELECT ROWID FROM EMP WHERE ROWNUM<=&N)
);
43
WHERE B.ENAME='SMITH' AND C.ENAME='MILLER' AND
A.HIREDATE> B.HIREDATE AND A.HIREDATE<C.HIREDATE;
SELECT * FROM EMP WHERE HIREDATE
>(SELECT HIREDATE FROM EMP WHERE ENAME='SMITH') AND
HIREDATE <(SELECT HIREDATE FROM EMP WHERE ENAME='MILLER');
5. Display the Details of all employees along with their managers Name
AND
Employee Number.
SELECT A.EMPNO,A.ENAME,A.JOB,B.JOB"REPORT",B.ENAME "REPNAME"
FROM EMP A ,EMP B
WHERE A.MGR=B.EMPNO;
6. Display the Details of all employees working in the same Department
as 'FORD'
select * from emp where
where ename='FORD');
select a.ename,a.sal,a.job,a.deptno
from emp a,emp b
where a.deptno=b.deptno and b.ename='FORD';
7. Display the details of all the employees who are Getting the Less
commision than 'FORD.'. Consider NULL commision as '0'
SQL>
2
3
SELECT A.ENAME,A.COMM,B.COMM,B.ENAME
FROM EMP A,EMP B
WHERE NVL(A.COMM,0) >NVL(B.COMM,0) AND B.ENAME='FORD';
ENAME
COMM
COMM ENAME
---------- --------- --------- ---------ALLEN
300
FORD
WARD
500
FORD
MARTIN
1400
FORD
SELECT a.ename oriname,a.comm oricomm,
b.ename,b.comm from emp a,emp b
WHERE A.COMM < B.COMM AND B.ENAME='MARTIN';
SELECT a.ename oriname,a.comm oricomm,
b.ename,b.comm from emp a,emp b
where NVL(a.comm,0)<NVL(b.comm,0) and b.ename='MARTIN';
8. Display the details of all the employees for whom the Ford is
the Manager.
SELECT A.ENAME ACTUALNAME,A.SAL,A.JOB,B.ENAME REPORTSTO ,B.SAL,
B.JOB
FROM EMP A,EMP B WHERE B.ENAME='FORD' AND A.MGR=B.EMPNO;
44
9. Display the Details of all the employees who are joined in the
same month of FORD
SELECT A.ENAME,A.HIREDATE,B.ENAME,B.HIREDATE
FROM EMP A,EMP B
WHERE B.ENAME='FORD' AND TO_CHAR(A.HIREDATE,'MONTH')=
TO_CHAR(B.HIREDATE,'MONTH');
10.
11.
Display the details of all the employees who are not ANALYSTS
and Getting Salary Greeater than 'CLARK';
SELECT A.ENAME,A.JOB,A.SAL,B.ENAME,B.SAL,B.JOB
FROM EMP A,EMP B
WHERE A.JOB!='ANALYST' AND A.SAL >B.SAL
AND
B.ENAME='CLARK';
SELECT * FROM EMP WHERE JOB NOT IN 'ANALYST' AND
SAL > (SELECT SAL FROM EMP WHERE ENAME='CLARK');
12.
13.
Display the Names of all the employees who are all getting the
salary Greater than the salary of 'SMITH'
SELECT * FROM EMP WHERE SAL >(SELECT SAL FROM EMP
WHERE ENAME='SMITH');
SELECT A.ENAME,A.JOB,A.SAL,B.ENAME,B.SAL
FROM EMP A,EMP B
WHERE B.ENAME='SMITH' AND A.SAL > B.SAL;
14.
Display the Names of all the employees who are all getting the
salary Greater than the salary of 'SMITH' along with the
difference in salary
45
SELECT A.ENAME,A.JOB,A.SAL,B.ENAME,B.SAL,A.SAL-B.SAL
FROM EMP A,EMP B
WHERE B.ENAME='SMITH' AND A.SAL>B.SAL ;
15.
16.
);
17.
18.
select ename,sal,
decode(sal,least(sal,1000),'<1000',
greatest(least(sal,2000)),'>1000 and <2000',
greatest(least(sal,3000)),'>2000 and <3000') from emp;
ENAME
SAL DECODE(SAL,LEAS
---------- --------- --------------SMITH
800 <1000
ALLEN
1600 >1000 and <2000
WARD
1250 >1000 and <2000
JONES
2975 >2000 and <3000
MARTIN
1250 >1000 and <2000
BLAKE
2850 >2000 and <3000
CLARK
2450 >2000 and <3000
SCOTT
3000 >2000 and <3000
KING
5000
TURNER
1500 >1000 and <2000
ADAMS
1100 >1000 and <2000
JAMES
950 <1000
FORD
3000 >2000 and <3000
MILLER
1300 >1000 and <2000
/*SILLY*/
select sal,count(*) aa,
decode(sal,least(sal,1000),'<1000',
greatest(least(sal,2000)),'>1000 and <2000',
greatest(least(sal,3000)),'>2000 and <3000') from emp group by
decode(sal,least(sal,1000),'<1000',
46
greatest(least(sal,2000)),'>1000 and <2000',
greatest(least(sal,3000)),'>2000 and <3000'),sal;
OR
SELECT SAL,DECODE(FLOOR(SAL/1000),0,'<1000',1,'> 1000 AND < 2000',
3,'>2000 AND < 3000','> 3000') FROM EMP;
OR
(SANJAYA)
SELECT SAL,DECODE(GREATEST(SAL,1000),1000,'< 1000',
LEAST(SAL,2000), ' > 1000 AND < 2000',
LEAST(SAL,3000), '> 2000 AND < 3000',
LEAST(SAL,4000),' = 3000',' > 3000 ') FROM EMP;
19. display the details of all the employees whose salary is equal to
range as specified in grade 5.
select sal from emp where sal >
(select losal from salgrade where grade=5) and
sal< (select hisal from salgrade where grade=5);
20.
21.
select lpad(' ',level-1)||ename from emp
START WITH job = 'PRESIDENT'
CONNECT BY PRIOR EMPNO = MGR;
_______________________________________________________________________
END OF REPORT
_______________________________________________________________________
select a.sal,a.ename,a.deptno
from emp a
group by a.deptno having a.sal>all(select avg(sal) from emp b
from emp b
group by deptno);
select
47
from emp a,emp b
where a.deptno=b.deptno and
a.sal >all(select avg(sal) from emp b group by deptno);
-------------------------------------------------------------------
declare
a number:=&a;
b number:=&b;
c number;
begin
c:=a*b;
b:=a+b;
a:=mod(c,b);
dbms_output.put_line('
dbms_output.put_line('
dbms_output.put_line('
end;
'||a);
'||b);
'||c);
declare
a number:=&a;
n number;
begin
for i in 1..10 loop
n:=a*i;
dbms_output.put_line(a||'*'||i||'='||n);
end loop;
end;
declare
a number:=&a;
b number;
c number:=2;
begin
for i in 1..10 loop
if a:=1 then
b:=c+2;
else
b:=2+i;
dbms_output.put_line(b);
end if;
end loop;
end;
48
declare
begin
for i in 1..3 loop
dbms_output.put_line('?');
dbms_output.new_line;
dbms_output.put(?);
end loop;
end;
declare
a number(10);
begin
a:=1;
dbms_output.put_line(a);
a:=12;
dbms_output.put_line(a);
a:=123;
dbms_output.put_line(a);
a:=1234;
dbms_output.put_line(a);
a:=12345;
dbms_output.put_line(a);
a:=123456;
dbms_output.put_line(a);
a:=1234567;
dbms_output.put_line(a);
a:=12345678;
dbms_output.put_line(a);
a:=123456789;
dbms_output.put_line(a);
a:=1234567890;
dbms_output.put_line(a);
end;
declare
e1 number;
e2 number;
e3 number;
val number;
begin
val:=&e3;
select deptno into e2 from emp where empno=val;
if
e2=10 then update emp set comm=1000 where empno=val;
elsif e2 = 20 then update emp set comm=2000 where empno=val;
elsif e3=30 then update emp set comm=3000 where empno=val;
end if;
end;
declare
type type1 is record(eno number(4) not null:=7788,ena emp.ename%type);
erec type1;
begin
select empno,ename into erec from emp where empno=7788;
dbms_output.put_line(erec.eno||erec.ena);
end;
49
declare
salary emp.sal%type;
mgr_num emp.mgr%type;
emno
emp.empno%type;
enam
emp.ename%type;
begin
select ename,empno,sal, mgr into enam,emno,salary,
mgr_num from emp where empno=7788;
while salary<4000
loop
update emp set sal=1000 where empno=mgr_num;
end loop;
insert into emp1 values(null,salary,enam);
commit;
end;
declare
no number;
name varchar2(20);
salary number(7,2);
begin
select ename,sal into name,salary from emp where empno=&no;
insert into emp1 values(name,salary);
end;
declare
str varchar2(20);
rev varchar2(20);
begin
str:='&input';
if length(str)=0 then
dbms_output.put_line('null');
else
for i in 1..length(str)
loop
rev:=substr(str,i,1);
end loop;
end if;
dbms_output.put_line('rev string' ||rev);
end;
declare
a number;
b number:=1;
begin
a:=&no;
for i in 1..a
loop
b:=b*i;
end loop;
dbms_output.put_line(b);
end;
50
1:
a. DEPT :
COLUMN NAME
DATATYPE(SIZE)
------------------------------- -------- ------------DEPTNO
NUMBER(2)
DNAME
VARCHAR2(14)
LOC
VARCHAR2(13)
-------------------------------------------------------b.EMP:
COLUMN NAME
DATATYPE(SIZE)
------------------------------- -------- -----------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)
2:
3:
4:
5:
6:
7:
DECREASE THE SIZE FOR THE COLUMN EMPNO WITH THE FOLLOWING
INFORMATION :COLUMN NAME
DATATYPE(SIZE)
--------------------------------------------------------
51
EMPNO
8:
NUMBER(2)
9:
ADD A NEW COLUMN NATIONALITY PLACED
COLUMNS
AND VERIFY THE RESULT
BETWEEN
10:
11:
WHAT IS THE DATA TYPE OF THE COLUMN HIREDATE AND HOW MANY BYTES
IT OCCUPIES
QUESTIONS BASED ON CONSTRAINTS :
12:
a. DEPT :
COLUMN NAME
DATATYPE(SIZE)
------------------------------- -------- ------------DEPTNO
NUMBER(2)CONSTRAINT PK_DEPTNO
PRIMARY
KEY,
DNAME
VARCHAR2(14)
LOC
VARCHAR2(13)
EMP :
COLUMN NAME
DATATYPE(SIZE)
------------------------------- -------- -----------EMPNO
NUMBER(4)CONSTRAINT PK_EMPNO
PRIMARY
KEY,
ENAME
VARCHAR2(10)CONSTRAINT UQ_ENAME
UNIQUE,
JOB
VARCHAR2(9),
MGR
NUMBER(4),
HIREDATE
DATE DEFAULT SYSDATE,
SAL
NUMBER(7,2)CONSTRAINT CK_SAL
CHECK(SAL>0) NN_SAL NOT NULL,
COMM
NUMBER(7,2),
DEPTNO
NUMBER(2)CONSTRAINT FK_DEPTNO
REFERENCES DEPT(DEPTNO)
13:
SOL:
14:
SELECT THE OWNER,CONSTRAINT NAME,CONSTRAINT TYPE,TABLE
NAME,STATUS
FOR DEPT TABLE
SOL:
SELECT OWNER,CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,STATUS
FROM USER_CONSTRAINTS WHERE TABLE_NAME='DEPT';
52
15:
SOL:
16:
SOL:
17:
SOL:
18:
SOL:
II. QUESTIONS BASED ON DATA MANIPULATION LANGUAGE COMMANDS :PROBLEMS BASED ON INSERT COMMAND:19:
EMP:
DEPT:
20:
(i)10,ACCOUNTING,NEW YORK
(ii)20,RESEARCH,DALLAS
(iii)30,SALES,CHICAGO
(iv)40,OPERATIONS,BOSTON
(v)50,COMPUTER,AMERICA
INSERT ONLY THE RECORDS OF
INTO EMP TABLE
EMPLOYEE NUMBER,NAME,SALARY
SOL:
21:
SOL:
53
22:
SOL:
TEMPORARY TABLE
LIST
SOL:
24:
SOL:
25:
SOL:
26:
SOL:
27:
SOL:
28:
NAMES
SAME AS EMPNO,ENAME,JOB
SOL:
29:
SOL:
30:
SOL:
31:
SOL:
32:
SOL:
33:
54
SOL:
34:
SOL:
35:
36:
SOL:
37:
SOL:
TO A TEMPORARY TABLE
SOL:
39:
SOL:
40:
SOL:
41:
SOL:
42:
SOL:
43.
SOL:
44:
SOL:
45:
SOL:
ROLLBACK;
55
46:
SOL:
47:
SOL:
NOT POSSIBLE
48:
SOL:
49:
SOL:
50:
SOL:
ROLLBACK;
51:
SOl:
52:
SOL:
53:
SOL:
III.
54:
UPDATE A RECORD OF
IN THE DATABASE
SOL:
55:
SOL:
SET AUTOCOMMIT ON
56:
GIVE ALL THE
ANOTHER
USER
SOL:
56
57:
SOL:
58:
SOL:
59:
SOL:
IV.
60:
SOL:
61:
NUMBER
30
SOL:
UPDATE EMP SET SAL=SAL-(0.1*SAL) WHERE JOB='CLERK' AND
DEPTNO=30;
62:
SOL:
63:
SOL:
64:
SOL:
65:
SOL:
66:
SOL:
67:
SOL:
57
68:
1981
LIST
SOL:
69:
SOL:
70:
SOL:
71:
SOL:
72:
3000
LIST EMPLOYEES NAME AND JOB WHOSE SALARY IS BETWEEN 2000 AND
SOL:
SELECT ENAME,JOB FROM EMP WHERE SAL BETWEEN 2000 AND 3000;
73:
74:
LIST THE EMPLOYEE NAMES AND THEIR DESIGNATION WHO HAVE JOINED
BEFORE 30TH JUNE '81 AND AFTER DECEMBER '81
SELECT ENAME FROM EMP WHERE HIREDATE NOT BETWEEN '30-JUN-81' AND
'31-DEC-81';
LIST THE EMPLOYEE NAMES WHO ARE NOT ELIGIBLE FOR COMMISSION
SOL:
75:
SOL:
76:
LIST ALL THE EMPLOYEE NAMES BETWEEN THE LETTER 'M' AND 'O'
SOL:
77:
LIST THE NAME OF THE EMPLOYEE AND JOB OF THE EMPLOYEE , WHO DOES
NOT BELONGS TO ANY BODY
SOL:
78:
SOL:
79:
SOL:
80:
SOL:
SOL:
"S"
58
81:
SOL:
82:
SOL:
83:
SOL:
84:
3000
SOL:
85:
SOL:
86:
SOL:
87:
SOL:
88:
SOL:
89:
SOL:
90:
SOL:
91:
SOL:
DUAL;
92:
SOL:
93:
SOL:
94:
SOL:
59
95:
SOL:
96:
NUMBER
DISPLAY REMAINDER
SOL:
97:
CHECK THE O/P WHEN A VALUE M>N IN A MOD FUNCTION AND NOTE DOWN
THE REASON FOR THAT KIND OF O/P
SOL:
98:
SOL:
9 RAISED TO 2
99:
DISPLAY THE VALUE FOR 15.193 ROUNDED TO FIRST DECIMAL PLACE
FORWARD
SOL:
100:
DISPLAY THE VALUE FOR 15.193 ROUNDED TO FIRST DECIMAL PLACE
BACKWARDS
SOL:
101:
SOL:
102:
SOL:
103:
SOL:
104:
SOL:
105:
SOL:
DUAL;
106:
SOL:
107:
60
SOL:
108:
SOL:
109:
SQL:
SELECT ENAME
110:
SQL:
111:
SQL:
112:
SQL:
113:
SQL:
114:
SQL:
115:
SOL:
116:
SOL:
117:
SOL:
118:
SOL:
119:
SOL:
|| ' IS A ' ||
61
120:
SOL:
SELECT
TRANSLATE('0123KASL','0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'9999999999TTTTTTTTTTTTTTTTTTTTTTTTTT') from dual;
121:
SOL:
122:
SOL:
123:
SOL:
124:
SOL:
125:
SOL:
126:
SOL:
127:
DISPLAY THE DIFFERENCE DATE BETWEEN CURRENT DATE AND LAST DAY
OF THE SYSDATE
SOL:
SELECT SYSDATE,LAST_DAY(SYSDATE) "LAST",LAST_DAY(SYSDATE)SYSDATE
"DAYS LEFT" FROM DUAL;
128:
1992"
SOL:
SELECT MONTHS_BETWEEN(TO_DATE('02-02-1992','DD-MON-YYYY'),
TO_DATE('01-01-1992','DD-MON-YYYY')) FROM DUAL;
129:
SOL:
130:
SOL:
131:
62
SOL:
132:
SOL:
133:
SOL:
134:
DISPLAY THE
SOL:
135:
SOL:
136:
SOL:
137:
SOL:
138:
SOL:
139:
DISPLAY THE GREATEST OF THE LIST OF EXPRESSIONS "HARRY"
"HARRIOT"
"HAROLD"
SOL:
140:
SOL:
141:
142:
SOL:
SELECT TO_CHAR(NEW_TIME(TO_DATE('05:15','HH24:MI'),'PST','GMT'),
'HH24:MI') FROM DUAL;
143:
DISPLAY THE LANGUAGE AND TERRITORY CURRENTLY USED BY YOUR
SESSION
63
SOL:
144:
SOL:
145:
SOL:
146:
SOL:
147:
SOL:
148:
SOL:
149:
SOL:
150:
SOL:
151:
SOL:
152:
SOL:
153:
SOL:
154:
DISPLAY NUMBER OF RECORDS FOR DESIGNATION SUPRESSING THE
DUPLICATES
SOL:
155:
SOL:
156:
SOL:
157:
64
SOL:
158:
SOL:
DUAL;
159:
SOL:
160:
SOL:
161:
SOL:
162:
SOL:
163:
SOL:
164:
SOL:
165:
SOL:
166:
SOL:
167:
SOL:
65
INTERSECT
SELECT ENAME,JOB FROM EMP
WHERE JOB IN (SELECT JOB FROM EMP WHERE ENAME LIKE 'JONES%');
168:
SOL:
169:
SOL:
170:
SOL:
171:
SOL:
172:
SOL:
173:
SOL:
174:
66
IN WHICH THERE ARE MORE THAN ON SALESMANS.
SOL:
175:
SOL:
176:
SOL:
177:
178:
DELETE THE
SOL:
179:
DELETE THE
SOL:
180:
SOL:
181:
SOL:
SELECT EMP.DEPTNO,DNAME,MAX(SAL),MIN(SAL),AVG(SAL)
FROM EMP,DEPT
WHERE EMP.DEPTNO=DEPT.DEPTNO
GROUP BY EMP.DEPTNO,DNAME;
182:
SOL:
SELECT SEX,COUNT(*)
67
FROM EMP
GROUP BY SEX
HAVING SEX ='M';
UNION
SELECT SEX,COUNT(*)
FROM EMP
GROUP BY SEX
HAVING SEX='F';
183:
SOL:
184:
SOL:
185:
SOL:
186:
SOL:
187:
SOL:
188:
SOL:
189:
SOL:
WHERE
EMP WHERE
EMP WHERE
EMP WHERE
EMP))));
68
FROM EMP Y WHERE Y.ROWID<X.ROWID)
INTERSECT
SELECT ROWID FROM EMP X WHERE &M>=(SELECT COUNT(ROWID)
FROM EMP Y WHERE Y.ROWID<X.ROWID);
190:
SOL:
191:
SOL:
192:
SOL:
193:
SOL:
194:
SOL:
195:
SELECT ALL THE ENAMES WITH THE OCCURANCES OF THE LETTER 'S'
SOL:
196:
SOL:
197:
69
SOL:
198:
SOL:
199:
SOL:
200:
SOL:
201:
SOL:
202:
CREATE A VIEW WITH COLUMNS EMPNO AND A 10% HIKE SALARY COLUMN
AND TRY TO INSERT A ROW IN THIS VIEW AND VERIFY IT
SOL:
203:
SOL:
70
HINT: THIS IS NOT A READ - ONLY VIEW. ROWS CAN BE INSERTED
INTO THE EMP TABLE USING THIS VIEW , BUT CANNOT BE VIEWED
BY THE EMPDEPT VIEW AS THE VIEW CAN ONLY RETRIEVE ROWS
BELONGING TO DEPARTMENT 30
204:
SOL:
205:
SOL:
206:
SOL:
207:
SOL:
208:
SOL:
209:
SOl:
CREATE SEQUENCE S2
INCREMENT BY 1
START WITH 2
MINVALUE 1
MAXVALUE 22
CYCLE;
210:
SOL:
211:
SOL:
212:
SOL:
71
213:
SOL:
214:
SOL:
215:
SOL:
216:
SOL:
217:
INSERT INTO TABLES DEPT1 AND EMP1 EACH THREE ROWS AND
CHECK THE ROWID OF THE TWO CLUSTER TABLES;
SOL:
218:
SOL:
219:
SOL:
220:
SOL:
221:
SOL:
222:
72
SOL:
EMPNO ENAME
COMM
DEPTNO
223:
JOB
MGR HIREDATE
SAL
HEADER:
BRAINWARE
INFOTECH(P)
LTD
EMPLOYEES REPORT
COLUMN:
NAMES
DATE OF
JOINING
CURRENT
SALARY
COMMISION DEPARTMENT
NUMBER
FOOTER:
SOL:
Package Specification
The package specification contains public declarations. The scope of
these declarations is local to your database schema and global to the
package. So, the declared objects are accessible from your application
and from anywhere in the package.
#****************#
PACKAGES
#****************#
73
#****************##****************##****************##****************#
1.
74
WHEN NO_dATA_FOUND THEN
PRINT('NO DATA FOUND');
END P2;
FUNCTION F2(ENO NUMBER) RETURN VARCHAR IS
DESIG EMP.JOB%TYPE;
BEGIN
SELECT JOB INTO DESIG FROM EMP WHERE EMPNO=ENO;
RETURN DESIG;
END F2;
END EMP_PACK;
DECLARE
NEXTEMP NUMBER;
F2 EMP.JOB%TYPE;
BEGIN
NEXTEMP:=EMP_PACK.NEXTEMP;
PRINT('NEXTEMP IS '||NEXTEMP);
EMP_PACK.P1;
F2:=EMP_PACK.F2(&EMPNO);
PRINT('PRINTING JOB FROM F2 '||F2);
EMP_PACK.P2(&DEPTNO);
END;
#****************##****************##****************##****************#
1. Create a package that contains the following sub programs
(a) Procedure NEW_EMP to add a new employee to the emp table.
(b) Procedure UPDATE_EMP to update the employee details
(display error message if i.e error)
(c) Function CHECK_EMP to check if an employee is
existing in the table
_______________________________________________________________________
CREATE OR REPLACE PACKAGE GEEPACK IS
PROCEDURE NEW_EMP(eno number,dno number,mg number,name varchar2);
PROCEDURE UPDATE_EMP(N NUMBER);
FUNCTION CHECK_eMP(N NUMBER) RETURN NUMBER;
END GEEPACK;
75
SELECT JOB INTO DESIG FROM EMP WHERE EMPNO=N;
DBMS_OUTPUT.PUT_LINE('EMPNO = '||N||' JOB = '||DESIG);
IF DESIG='CLERK' THEN
UPDATE EMP SET JOB='FDC' WHERE EMPNO=N;
print('job updated to fdc');
ELSIF DESIG='MANAGER' THEN
UPDATE EMP SET JOB='DGM' WHERE EMPNO=N;
print('job updated to dgm');
END IF;
END UPDATE_EMP;
FUNCTION CHECK_eMP (N NUMBER) RETURN NUMBER
IS
N1 NUMBER;
BEGIN
SELECT COUNT(*) INTO N1
FROM EMP WHERE EMPNO=N;
IF n1=0 then
PRINT('EMPLOYEE '||n||' does not EXISTS ');
ELSE
PRINT('EMPLOYEE '||n||' EXISTs');
END IF;
return n1;
END CHECK_EMP;
END GEEPACK;
declare
eno number:=&empno;
dno number:=&deptno;
mg number:=&mgr;
name varchar2(10):='&name';
res number;
begin
print('new_emp is called and values will be inserted');
geepack.new_emp(eno,dno,mg,name);
geepack.update_emp(&updateno);
res:=geepack.CHECK_eMP(&checkno);
print(res);
end;
#****************##****************##****************##****************#
WRITE A FUNCTION TO RETURN MAX(EMPNO)+1 .
WRITE A PROCEDURE TO FETCH THE DETAILS WHEN EMPNO=RESULT OF FUNCTION.
WRITE A PROCEDURE TO ACCEPT DEPTNO AND DISPLAY THE DETAILS OF
ALL
EMPLOYEES OF THAT PARTICULAR DEPARTMENT.(HINT : CURSOR)
WRITE A PACKAGE WHICH INCLUDES ALL THESE PROCEDURES AND FUNCTIONS
76
DECLARE
F1RES NUMBER;
BEGIN
F1RES:=PACK.F1;
PRINT('THE RESULT OF FUNCTION IS '||F1RES);
PACK.P1(F1RES);
PACK.P2(&DEPTNO);
END;
77
create table OrdTab
(
OrdId Number,
Customer_Name varchar2(10),
OrdDate Date,
Total
Number
)
Partition By Range(OrdId)
(
Partition P1 VAlues Less Than (100),
Partition P2 Values Less Than (200),
partition p3 values less than(300)
);
For the column ordid of the ordtab table
specified values
99
98
100
150
199
200
250
290
when i was above to insert
78
200
SELECT * FROM ORDTAB PARTITION (P1);
ORDID CUSTOMER_N ORDDATE
TOTAL
--------- ---------- --------- --------90
TRY THE SAME THING WITH P2 AND P3.
SQL> SELECT
PARTITION_NAME
-----------------------------P1
P2
P3
SQL> ALTER TABLE ORDTAB SPLIT PARTITION P1 AT (50);
Table altered.
SQL> SELECT
PARTITION_NAME
-----------------------------P2
P3
SYS_P61
SYS_P62
SQL> SELECT * FROM ORDTAB PARTITION(SYS_P61);
ORDID CUSTOMER_N ORDDATE
TOTAL
--------- ---------- --------- --------45
SQL> SELECT * FROM ORDTAB PARTITION(SYS_P62);
ORDID CUSTOMER_N ORDDATE
TOTAL
--------- ---------- --------- --------90
65
ALTER TABLE ORDTAB SPLIT PARTITION P2 AT
(150) INTO (PARTITION P5,PARTITION P6);
Table altered.
SQL> SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS;
(ALSO GIVE THE COMMAND
SELECT PARTITION_NAME,TABLE_NAME FROM USER_tAB_PARTITIONS)
79
SELECT TABLE_NAME,PARTITION_NAME,HIGH_VALUE FROM
USER_tAB_PARTITIONS;
PARTITION_NAME
-----------------------------P5
P3
SYS_P61
SYS_P62
P6
ADD PARTITION
~~~~~~~~~~~~~
CREATE TABLE GG
( ACNO NUMBER(3),
actype varchar2(3),
acbal number(4))
partition by range(acbal)
(partition p1 values less than(5000),
partition p2 values less than(6000));
Table created.
SQL> alter table gg add partition maxp values less than(maxvalue);
Table altered.
DROP PARTITION
~~~~~~~~~~~~~~~~~
ALTER TABLE GG DROP PARTITION P1;
ALTER TABLE <TABLENAME> DROP PARTITION <PARTITION NAME>
RENAME PARTITION
~~~~~~~~~~~~~~~~~~
ALTER TABLE EMP RENAME PARTITION P5 TO P6;
create table ordtab
( ordid number(4),
prdid number(4),
ordname varchar2(10)
)
partition by range(ordid,prdid)
( partition p1 values less than(25,50),
partition p2 values less than(50,75),
partition p3 values less than(75,100)
);
************************************************************************
TO CREATE AN INDEXED PARTITION
create table OrdTab
(
OrdId Number,
80
Customer_Name varchar2(10),
OrdDate Date,
Total
Number
)
Partition By Range(OrdId)
(
Partition P1 VAlues Less Than (100),
Partition P2 Values Less Than (200),
partition p3 values less than(MAXVALUE)
);
~~~~~~~~~~~~~~~~~~~~
SIMPLE PL/SQL BLOCKS
~~~~~~~~~~~~~~~~~~~~
declare
a number;
b number;
begin
A:=25;
B:=50;
dbms_output.put_line('THE CONTENT OF A IS'||A);
dbms_output.put_line('THE CONTENT OF B IS'||B);
end;
declare
a number:=&A;
b numbeR:=&B;
begin
81
dbms_output.put_line('THE CONTENT OF A IS '||A);
dbms_output.put_line('THE CONTENT OF B IS '||B);
end;
declare
a number:=&A;
b numbeR:=&B;
PROD NUMBER;
begin
PROD:=A*B;
dbms_output.put_line('THE CONTENT OF A IS '||A);
dbms_output.put_line('THE CONTENT OF B IS '||B);
dbms_output.put_line('THE PRODUCT IS '||PROD);
end;
declare
a number:=10;
b number:=20;
res number;
begin
res:=a+b;
dbms_output.put_line(a|| '
'||b);
dbms_output.put_line('The sum is '||res);
end;
declare
a number:=&a;
b number:=&b;
res number;
begin
res:=a+b;
dbms_output.put_line(a|| '
'||b);
dbms_output.put_line('The sum is '||res);
end;
declare
a number:=&a;
b number:=&b;
begin
if (a>b) then
dbms_output.put_line('Biggest number is'||' '||a);
else
dbms_output.put_line('Biggest number is'||' '||b);
end if;
end;
declare
a number:=&a;
begin
if mod(a,5)=0 then
dbms_output.put_line('It is divisible by 5');
else
dbms_output.put_line('It is not divisible by 5');
82
end if;
end;
declare
n char(10):='&n';
begin
SELECT UPPER(N) INTO N FROM DUAL;
if n='F' then
dbms_output.put_line('FIRST CLASS');
ELSIF N='S' THEN
dbms_output.put_line('SECOND CLASS');
ELSIF N='T' THEN
dbms_output.put_line('THIRD CLASS');
else
dbms_output.put_line('FAILED');
END IF;
END;
declare
n number:=1;
begin
loop
dbms_output.put_line(n);
n:=n+1;
exit when n=11;
end loop;
end;
declare
a number:=1;
begin
while (a<=10) loop
dbms_output.put_line(a);
a:=a+1;
end loop;
end;
declare
begin
for a in 1..10 loop
dbms_output.put_line(a);
end loop;
end;
declare
begin
for a in reverse 1..10 loop
dbms_output.put_line(a);
end loop;
end;
declare
83
n number:=&n;
i number:=1;
begin
while i<=n loop
dbms_output.put_line(i);
i:=i+2;
end loop;
end;
declare
n number:=&n;
i number:=1;
begin
while i<=n loop
dbms_output.put(i);
i:=i+2;
end loop;
dbms_output.new_line;
end;
DECLARE
BEGIN
FOR I IN 1..10 LOOP
DBMS_OUTPUT.PUT_LINE(I);
IF I=5 THEN
EXIT;
END IF;
END LOOP;
END;
declare
n number:=&n;
begin
dbms_output.put_line('even numbers are');
for i in 1..n loop
if mod(i,2)=0 then
dbms_output.put_line(i);
end if;
end loop;
end;
to display numbers from 1 to n in
declare
n number:=&n;
begin
for i in 1..n loop
dbms_output.put(i);
end loop;
dbms_output.new_line;
end;
to display the sum of n numbers
declare
same line.
84
n number:=&n;
sum1 number:=0;
begin
dbms_output.put_line('the numbers are');
for i in 1..n loop
dbms_output.put_line(i);
sum1:=sum1+i;
end loop;
dbms_output.put_line('SUM IS '||SUM1);
END;
DECLARE
N NUMBER:=&N;
RES NUMBER;
BEGIN
FOR I IN 1..10 LOOP
RES:=N*I;
DBMS_OUTPUT.PUT_LINE(N || ' *
END LOOP;
END;
85
GENERAL PROBLEMS
1 . Write a PL/SQL Program to display
100.
2. Write a PL/SQL Program to list all the EVEN & ODD Number from 1 to
100 as Follows
Even Numbers
Odd Numbers
---------------------------------0
1
2
3
4
5
.
.
.
.
3. Write a PL/SQL Program to Find the sum of numbers between 1 and 100
that are divisible by 5 but not
divisible by 7
4. Write a PL/SQL Script to find all the PRIME NUMBERS from 1 to 100
5. Write a PL/SQL
NUMBERS
is
LEAP
No.of
from the
characters, No.of
86
************************************************************************
*****
CURSOR PROBLEMS
1. Write a PL/SQL Program to Copy the data from One table to
another which has the same structure with
the RECORD NUMBER.
2. Assume the following table for the given problem :
ID
NAME
MARK1
MARK2
MARK3
MARK4
1000
AYYAPPAN
100
99
90
95
1002
BASKER
30
20
25
70
1001
N.B.SING
90
60
50
35
Write a PL/SQL
Program to display all the student information
with the TOTAL, AVERAGE,
GRADE. The GRADE is base on the following condition.
1 . between 100 and 90
A GRADE
2. between 89 and 80
B GRADE
3. between 79 and 70
C GRADE
4. otherwise WASTE.
3. Write a PL/SQL Program to display the following output
base on the department :
Department No.
10
Bangalore
87
Empno
Hiredate
1000
12-MAR-98
1001
30-JAN-98
.......
...........
Ename
Sal
Comm
john
5000
100
SMITH
6000
NULL
.........
....... ........
Names
by
in the descending
************************************************************************
*****
EXCEPTION
Assume the following table for the problems given below:
Table Name :
BANK
Acc_no
Acc_name
Curr_balance
number(6)
varchar(40)
number(20,4)
88
c) invalid number and value error
4. Write a PL/SQL Program to DELETE account holder by entering the
account number. The exception
a)no data found
b)Before delete display the current balance
************************************************************************
*****
SUBPROGRAM
1. Write a PL/SQL Program to SWAP
the temporary variable, by
using the PROCEDURE.
without using
given input
************************************************************************
*****
DATABASE
TRIGGERS
1.
2.
Write a
3.
Write
disallow the
DELETE operation
from
a database
generate
digit
89
************************************************************************
*****
PACKAGES
1. Create a package that contains the following sub programs
(a) Procedure NEW_EMP to add a new employee to the emp table.
(b) Procedure UPDATE_EMP to update any empoyees details with
proper
error message
(c) Function CHECK_EMP to check if an employee is existing the
table
(d) Procedure DELETE_EMP to delete an employee `s record.
(e) Procedure ERROR_MESSAGE to display error message generated
by any
of the above
procedure or functions.
2. Create a package to conduct bank transactions involving the
following procedures and functions.
(a) Debit
(b) Credit
(c) New account
(d) Journal entry recording all transaction(Acct_id, Trans_type,
sysdate)
(e) Enter the transactions with status pending
BLOCKS CREATED ON
1. GOTO
2. EXIT
3. EXIT WHEN
4. GENERATE EVEN/ODD SERIES
5. GENERATE MULTIPLICATION TABLES
6. REVERSE OF NUMBER
7. REVERSE OF STRING
8. PRIME OR NOT
9. SQUARE
10. M TO POWER N
11. ODD AND EVEN SERIES TOGETHER
12. ACCEPT SYMBOL FROM USER AND DEPENDING ON THAT
ADD,SUBTRACT,MULTIPLY
OR DIVIDE 2 NUMBERS.
13. GENERATE NUMBERS IN FIBONACCI SERIES.
14. FACTORIAL OF NUMBER
1.---------GOTO STATEMENT
~~~~~~~~~~~~~~
DECLARE
BEGIN
FOR I IN 1..10 LOOP
90
DBMS_OUTPUT.PUT_lINE(I);
IF I=5 THEN
GOTO AA;
END IF;
END LOOP;
<<AA>>
DBMS_OUTPUT.PUT_lINE('OUTSIDE THE LOOP');
END;
OUTPUT IS
1
2
3
4
5
HELLO
DECLARE
BEGIN
A NUMBER:=&A;
B NUMBER:=&B;
a:=a+b+100;
if a>1000 then
goto zz;
else
dbms_output.put_line('out put not greater than 1000');
end if;
<<zz>>
dbms_output.put_line(a);
END ;
2.-----------------EXIT STATEMENT
~~~~~~~~~~~~~~
DECLARE
BEGIN
FOR I IN 1..10 LOOP
DBMS_OUTPUT.PUT_lINE(I);
IF I=5 THEN
EXIT;
END IF;
END LOOP;
END;
OUTPUT IS
1
2
3
4
5
91
FOR I IN 1..10 LOOP
DBMS_OUTPUT.PUT_lINE(I);
EXIT WHEN I=5;
END LOOP;
END;
OUTPUT IS
1
2
3
4
5
4.-----------------------WHILE LOOP
~~~~~~~~~~
GENERATE ODD/EVEN NUMBERS
DECLARE
N NUMBER:=&N;
I NUMBER:=1;
BEGIN
WHILE(I<N) LOOP
DBMS_OUTPUT.PUT_lINE(I);
I:=I+2;
END LOOP;
END;
(FOR EVEN SERIES REPLACE 1 WITH 0);
DECLARE
N NUMBER:=&N;
BEGIN
FOR I IN 1..N LOOP
IF MOD(I,2)=0 THEN
DBMS_OUTPUT.PUT_lINE(I);
END IF;
END LOOP;
END;
5.--------------------MULTIPLICATION TABLES
~~~~~~~~~~~~~~~~~~~~~
DECLARE
N NUMBER:=&N;
RES NUMBER;
BEGIN
DBMS_OUTPUT.PUT_lINE('THE MULTIPLICATION TABLE IS');
FOR I IN 1..10 LOOP
RES:=N*I;
DBMS_OUTPUT.PUT_LINE(N ||' * '||I ||'
=
'||RES);
END LOOP;
END;
92
~~~~~~~~~~~~~~~~~~~~~
6.----------------REVERSE OF A NUMBER
~~~~~~~~~~~~~~~~~~~
DECLARE
N NUMBER:=&N;
R NUMBER:=0;
L NUMBER;
BEGIN
L:=LENGTH(N);
FOR I IN 1..L LOOP
R:=R*10+MOD(N,10);
N:=FLOOR(N/10);
END LOOP;
--DBMS_OUTPUT.PUT_LINE(N);
DBMS_OUTPUT.PUT_LINE(R);
END;
DECLARE
N NUMBER:=&N;
R NUMBER;
L NUMBER;
BEGIN
DBMS_OUTPUT.PUT_LINE('THE NUMBER IS '||N);
L:=LENGTH(N);
FOR I IN 1..L LOOP
R:=R||MOD(N,10);
N:=FLOOR(N/10);
END LOOP;
DBMS_OUTPUT.PUT_LINE('THE REVERSE OF THE NUMBER IS
END;
7. ------------------REVERSE OF A STRING
'||R);
DECLARE
N VARCHAR2(12):='&N';
REV VARCHAR2(12);
LEN NUMBER;
BEGIN
DBMS_OUTPUT.PUT_LINE('STRING IS
'||N);
LEN:=LENGTH(N);
FOR I IN REVERSE 1..LEN LOOP
REV:=REV||SUBSTR(N,I,1) ;
END LOOP;
DBMS_OUTPUT.PUT_LINE('REVERSED STRING IS
END;
8---------------------PRIME OR NOT
~~~~~~~~~~~~
DECLARE
'||rEV);
93
N NUMBER:=&N;
FLAG NUMBER:=1;
BEGIN
FOR I IN 2..N-1 LOOP
IF MOD(N,I)=0 THEN
FLAG:=0;
EXIT;
END IF;
END LOOP;
IF FLAG=0 THEN
DBMS_OUTPUT.PUT_LINE('NUMBER IS NOT PRIME');
ELSE
DBMS_OUTPUT.PUT_lINE('NUMBER IS PRIME');
END IF;
END;
9.------------------DRAW A SQUARE
DECLARE
BEGIN
FOR I IN 1..10 LOOP
DBMS_OUTPUT.PUT('?');
DBMS_OUTPUT.PUT(' ');
END LOOP;
DBMS_OUTPUT.NEW_LINE;
FOR I IN 1..10 LOOP
DBMS_OUTPUT.PUT_LINE('?
END LOOP;
FOR I IN 1..10 LOOP
DBMS_OUTPUT.PUT('?');
DBMS_OUTPUT.PUT(' ');
END LOOP;
DBMS_OUTPUT.NEW_LINE;
END;
?');
94
FOR I IN 1..20
LOOP
IF MOD(I,2) = 0 THEN
DBMS_OUTPUT.PUT_LINE('
ELSE
DBMS_OUTPUT.PUT(I);
END IF;
END LOOP;
END;
'||I);
DECLARE
NUM1 NUMBER:=&NUMBER1;
SYB CHAR:='&SYMBOL';
NUM2 NUMBER:=&NUMBER2;
RESULT NUMBER;
BEGIN
IF SYB='+' THEN
RESULT:=NUM1+NUM2;
ELSE
IF SYB='-' THEN
RESULT:=NUM1-NUM2;
ELSE
IF SYB='*' THEN
RESULT:=NUM1*NUM2;
ELSE
IF SYB='/' THEN
RESULT:=NUM1/NUM2;
END IF;
END IF;
END IF;
END IF;
END;
DBMS_OUTPUT.PUT_LINE(RESULT);
95
96
PL/SQL Tables
Objects of type TABLE are called "PL/SQL tables," which are modelled
on (but not the same as) database tables. PL/SQL tables use a primary
key to give you array-like access to rows. The size of a PL/SQL table
is unconstrained. That is, the number of rows in a PL/SQL table can
increase dynamically.
PL/SQL tables can have one column and a primary key, neither of which
can be named. The column can belong to any scalar type, but the
primary
key must belong to type BINARY_INTEGER.
Declaring PL/SQL Tables
PL/SQL tables must be declared in two steps. First, you define a TABLE
type, then declare PL/SQL tables of that type. You can declare TABLE
types in the declarative part of any block, subprogram, or package
using the syntax
TYPE type_name IS TABLE OF
{ column_type | variable%TYPE | table.column%TYPE 'D [NOT NULL]
INDEX BY BINARY_INTEGER;
where "type_name" is a type specifier used in subsequent declarations
of PL/SQL tables and "column_type" is any scalar datatype such as CHAR,
DATE, or NUMBER. You can use the %TYPE attribute to specify a column
datatype.
In this example, you declare a TABLE type called "EnameTabTyp":
DECLARE
TYPE EnameTabTyp IS TABLE OF CHAR(10)
INDEX BY BINARY_INTEGER;
You could have used %TYPE to provide the column datatype, as follows:
DECLARE
TYPE EnameTabTyp IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
Once you define type "EnameTabTyp," you can declare PL/SQL tables of
that type, as follows:
ename_tab
EnameTabTyp;
97
The identifier "ename_tab" represents an entire PL/SQL table.
Like scalar variables, PL/SQL tables can be declared as the formal
parameters of procedures and functions.
PACKAGE emp_actions IS
TYPE EnameTabTyp IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
TYPE SalTabTyp IS TABLE OF emp.sal%TYPE
INDEX BY BINARY_INTEGER;
ename_tab EnameTabTyp;
sal_tab
SalTabTyp;
...
PROCEDURE hire_batch
(ename_tab EnameTabTyp,
sal_tab
SalTabTyp,
...);
PROCEDURE log_names
(ename_tab EnameTabTyp,
num
BINARY_INTEGER);
...
END emp_actions;
Referencing PL/SQL Tables
To reference rows in a PL/SQL table, you specify a primary key value
using the array-like syntax
plsql_table_name(primary_key_value)
where "primary_key_value" belongs to type BINARY_INTEGER.
For example,
98
job_tab JobTabTyp;
BEGIN
job_tab(1) := 'CLERK';
IF job_tab(2) = 'CLERK' THEN
-- raises NO_DATA_FOUND
...
END IF;
...
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- here because job_tab(2) does not exist
...
END;
Inserting/Fetching Rows
You must use a loop to INSERT values from a PL/SQL table into a
database
column. Likewise, you must use a loop to FETCH values from a database
column into a PL/SQL table. For example, given the declarations
DECLARE
TYPE EmpnoTabTyp IS TABLE OF NUMBER(4)
INDEX BY BINARY_INTEGER;
TYPE EnameTabTyp IS TABLE OF CHAR(10)
INDEX BY BINARY_INTEGER;
...
empno_tab EmpnoTabTyp;
ename_tab EnameTabTyp;
...
you might use the following procedure to INSERT values from the PL/SQL
tables into the "emp" database table:
PROCEDURE insert_emp_data
(rows
BINARY_INTEGER,
empno_tab EmpnoTabTyp,
ename_tab EnameTabTyp,
...) IS
BEGIN
FOR i IN 1..rows LOOP
INSERT INTO emp (empno, ename, ...)
VALUES (empno_tab(i), ename_tab(i), ...);
END LOOP;
END;
Conversely, you might use the next procedure to FETCH all rows from the
database table into PL/SQL tables "empno_tab" and "ename_tab":
PROCEDURE fetch_emp_data
(rows
OUT BINARY_INTEGER,
empno_tab OUT EmpnoTabTyp,
ename_tab OUT EnameTabTyp,
99
...) IS
BEGIN
rows := 0;
FOR emprec IN (SELECT * FROM emp) LOOP
rows := rows + 1;
empno_tab(rows) := emprec.empno;
ename_tab(rows) := emprec.ename;
...
END LOOP;
END;
However, you cannot reference PL/SQL tables in the INTO clause.
example, the following SELECT statement is illegal:
For
PROCEDURE fetch_emp_data
(rows
OUT BINARY_INTEGER,
empno_tab OUT EmpnoTabTyp,
ename_tab OUT EnameTabTyp,
...) IS
BEGIN
SELECT empno, ename
INTO empno_tab, ename_tab
FROM emp;
...
END;
-- illegal
Deleting Rows
You cannot delete individual rows from a PL/SQL table because the
DELETE statement cannot specify PL/SQL tables. However, you can use
a simple workaround to delete entire PL/SQL tables. When you want to
delete a PL/SQL table, simply assign a null to it, as shown in the
following example:
DECLARE
TYPE NumTabTyp IS TABLE OF NUMBER
INDEX BY BINARY_INTEGER;
sal_tab
NumTabTyp;
...
BEGIN
/* Load salary table. */
FOR i IN 1..50 LOOP
sal_tab(i) := i;
END LOOP;
...
/* Delete salary table. */
sal_tab := NULL; -- releases all PL/SQL table resources
...
END;
100
FETCH Statement, INSERT, DELETE
101
salary number(7,2);
desig varchar2(10);
begin
select empno,ename,sal,job into num,name,salary,desig
from emp where empno=NUM;
dbms_output.put_Line(num||' '||name||' '||salARY||' '||DESIG);
if desig='CLERK' THEN
UPDATE EMP SET SAL=SAL+200 WHERE EMPNO=NUM;
ELSIF DESIG='MANAGER' THEN
UPDATE EMP SET SAL=SAL+300 WHERE EMPNO=NUM;
END IF;
COMMIT;
end;
4. DELETE STATEMENT IN PL/SQL BLOCK
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
declare
num number(5);
name varchar(10);
salary number(7,2);
desig varchar2(10);
begin
select empno,ename,sal,job into num,name,salary,desig
from emp where empno=&n;
if desig='CLERK' THEN
DBMS_OUTPUT.PUT_LINE('RECORD DELETED');
DELETE FROM EMP WHERE EMPNO=NUM;
ELSE
DBMS_OUTPUT.PUT_LINE('RECORD NOT DELETED');
END IF;
dbms_output.put_Line(num||' '||name||' '||salARY||' '||DESIG);
end;
102
num number(5);
name varchar(10);
salary number(7,2);
desig varchar2(10);
begin
select empno,ename,sal,job into num,name,salary,desig
from emp where empno=&n;
if desig='CLERK' THEN
DBMS_OUTPUT.PUT_LINE('RECORD INSERTED');
INSERT INTO TEMP VALUES(NUM,NAME,SALARY,DESIG);
END IF;
dbms_output.put_Line(num||' '||name||' '||salARY||' '||DESIG);
COMMIT;
end;
7. DISPLAY NAME AND DESIGNATION OF MANAGERS
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(THE BLOCK GIVES ERRORS.
IT IS JUST TO ILLUSTRATE THAT
exact fetch returns more than requested number of rows )
DECLARE
N NUMBER;
NAME EMP.ENAME%TYPE;
DESIG EMP.JOB%TYPE;
BEGIN
SELECT COUNT(*) INTO N FROM EMP WHERE JOB='MANAGER';
FOR I IN 1..N LOOP
SELECT ENAME,JOB INTO NAME,DESIG FROM EMP WHERE JOB='MANAGER';
DBMS_OUTPUT.PUT_LINE(NAME||' '||DESIG);
END LOOP;
END;
103
COMMIT;
ELSIF DESIG='MANAGER' THEN
UPDATE EMP SET SAL=SALARY+200 WHERE EMPNO=ENO;
DBMS_OUTPUT.PUT_LINE('INCREMENTED SALARY IS '||TO_CHAR(SALARY+200));
END IF;
END;
8.SELECT MAX(DEPTNO) FROM DEPT TABLE AND INSERT TO TEMP TABLE
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DECLARE
MDEPNO NUMBER(3);
BEGIN
FOR I IN 1..4 LOOP
SELECT MAX(DEPTNO) INTO MDEPNO FROM DEPT5;
INSERT INTO TEMP VALUES(MDEPNO);
DBMS_OUTPUT.PUT_LINE(MDEPNO);
DELETE FROM DEPT5 WHERE DEPTNO=MDEPNO;
COMMIT;
END LOOP;
END;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~
9. 2 tables are created. In one table the quantiy and the product name
is stored and the other table is dummy table. If we give product name
the details will be displayed.If the number of products is below 5 then
insert into temp table out of stock and sysdate
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~
inventory table (inv)
~~~~~~~~~~~~~~~
quantity
prodname
9
Racket
8
Book
5
Pencil
1
Marker
create table inv(quantity number(3),prodname varchar(10));
temp
~~~~
prodname
comment
date1
104
update inv set quantity=quantity-1 where prodname=pname;
commit;
else
DBMS_OUTPUT.PUT_LINE('STOCK LEVEL IS BELOW ORDER LEVEL');
insert into temp values(pname,'out of stock',sysdate);
commit;
end if;
end;
10. example for constant
~~~~~~~~~~~~~~~~~~~~~~~~
declare
a constant number:=5;
begin
dbms_output.put_Line(a);
end;
(If we make a as an constant we cannot use a as a assignment target.
We can just print a+2,a+3 etc.....)
declare
a constant number:=5;
begin
dbms_output.put_Line(a);
dbms_output.put_Line(a+2);
end;
11.example for default
***********************
declare
a number default 3;
begin
dbms_output.put_Line(a);
end;
(hERE A CAN BE USED AS ASSIGNMENT TARGET).
12. Write a pl/sql block to fetch the details of all the employees
whose
number is 7902. Now if his sal is less than 4000 then fetch salary
mgr and name of the employees whose empno should be equal to
MGR.
13.
WAP TO CHECK THE BANK DETAILS. IN BANK TABLE ACCNO AND BALANCE
IS STORED. USER HAS TO ENTER THE ACCOUNT NUMBER AND WITHDRAW
AMOUNT.
IF WITHDRAWL AMOUNT < BALANCE THEN UPDATE BALANCE OF BANK TABLE
AND SUBTRACT THE WITHDRAWL AMOUNT FROM BALANCE ELSE INSERT A
MESSAGE LIKE INSUFFICIENT FUNDS TO TEMP TABLE
create table bank
( accno number(3),
bal number(6));
105
ACCNO
BAL
-------- --------10
5000
20
6000
30
20
create table temp
( accno number(3),
bal number(6),
rem varchar2(20));
declare
awith number(3):=&awith;
ac_no number(3):=&accno;
abal number(6);
begin
select bal into
abal from bank where accno=ac_no;
if abal>awith then
update bank set bal=bal-awith where accno=ac_no;
commit;
else
insert into temp values(ac_no,abal,'insuffunds');
commit;
end if;
end;
14. ILLUSTRATE %TYPE
*********************
declare
a emp.deptno%type;
begin
select deptno into a from emp where empno=&A;
dbms_output.put_line(a);
end;
15.ILLUSTRATE %ROWTYPE
***********************
declare
a emp%ROWtype;
begin
select * into a from emp where empno=&N;
dbms_output.put_line(A.ENAME||' '||A.SAL||' '||A.COMM);
end;
16
write a pl/sql block to calculate the sum and average salaries of
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
all the employees of a particular department.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DECLARE
NO NUMBER:=&DEPTNO;
SUM1 NUMBER(7,2);
106
BEGIN
AVG1 NUMBER(7,2);
SELECT SUM(SAL),AVG(SAL) INTO SUM1,AVG1
FROM EMP
WHERE DEPTNO=NO;
DBMS_OUTPUT.PUT_line('Sum of salary is'||SUM1);
DBMS_OUTPUT.PUT_Line('Average salary is'||AVG1);
END;
NESTED TABLE
CREATE OR REPLACE TYPE EMPLOYEE AS OBJECT
_
CREATE TYPE EMPLOYEE AS OBJECT
(NO NUMBER(4),
NAME VARCHAR2(20),
JOB VARCHAR2(10),
SAL NUMBER(7,2));
------------------------------------------CREATE TYPE EMPTAB AS TABLE OF EMPLOYEE;
107
------------------------------------------CREATE
(DNO
DNAME
EMPL
TABLE DEPTNEST
NUMBER(2),
VARCHAR2(20),
EMPTAB) NESTED TABLE EMPL STORE AS EMPNEST;
108
--------------------------------------------------------------#**************#
PROCEDURES
#**************#
#**************##**************##**************##**************##*******
*******#
1.
2.
3.
4.
5.
#**************##**************##**************##**************##*******
*******#
1.----------
109
BEGIN
LINE;
LINE;
FOR I IN C1 LOOP
DBMS_OUTPUT.PUT_LINE(I.ENAME||' '||I.JOB);
END LOOP;
LINE;
LINE;
FOR I IN C2 LOOP
DBMS_OUTPUT.PUT_LINE(I.ENAME||' '||I.JOB);
END LOOP;
LINE;
LINE;
END;
________________________________________________________________________
__
2---------------WRITE A PROCEDURE WHICH ACTS JUST LIKE
DBMS_OUTPUT.PUT_LINE
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CREATE OR REPLACE PROCEDURE PRINT( N VARCHAR2) is
begin
dbms_output.put_line(n);
end;
declare
A NUMBER:=25;
begin
PRINT(A);
print('BRAINWARE');
end;
________________________________________________________________________
3------------WRITE A PROCEDURE TO FETCH THE NAME AND JOB WHEN NO IS
PASSED
-------(this is to illustrate both in and out parameters)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CREATE OR REPLACE PROCEDURE DISP(N NUMBER)
IS
NAME EMP.ENAME%TYPE;
DESIG EMP.JOB%TYPE;
BEGIN
SELECT ENAME,JOB INTO NAME,DESIG FROM EMP WHERE EMPNO=N;
DBMS_OUTPUT.PUT_LINE(NAME||' '||DESIG);
END;
EXEC DISP(7499)
DECLARE
BEGIN
DISP(&N);
END;
110
OR
CREATE OR REPLACE PROCEDURE DISP1(ENO NUMBER,
NAME OUT VARCHAR,DESIG OUT VARCHAR)
IS
BEGIN
SELECT ENAME,JOB INTO NAME,DESIG FROM EMP WHERE EMPNO=ENO;
END;
DECLARE
NAME1 VARCHAR2(30);
DESIG1 VARCHAR2(10);
N NUMBER:=&EMPNO;
BEGIN
DISP1(N,NAME1,DESIG1);
DBMS_OUTPUT.PUT_LINE(NAME1||' '||DESIG1||' '||N);
END;
________________________________________________________________________
__
111
5-----------EXAMPLE TO ILLUSTRATE LOCAL PROCEDURE
------------I.E DYNAMIC CREATION OF PROCEDURES.(PROCEDURE WITHIN A
BLOCK)
DECLARE
A NUMBER:=10;
J VARCHAR2(10);
ENO NUMBER;
PROCEDURE DISPJOB(N NUMBER,J OUT VARCHAR2) IS
BEGIN
SELECT JOB INTO J FROM EMP WHERE EMPNO=N;
END;
BEGIN
ENO:=&EMPNO;
DBMS_OUTPUT.PUT_LINE('EMPLOYEE NUMBER IS'||ENO);
DISPJOB(ENO,J);
DBMS_OUTPUT.PUT_lINE('EMPNO='||ENO||'
JOB='||J);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('MESSAGE');
PRINT('SORRRY NO EMPLOYEE EXISTS WITH THAT NUMBER');
END;
_________________________________
______________________________________
CURSORS
------DECLARE
CURSOR C1 IS SELECT ENAME,COMM FROM EMP WHERE EMPNO=7900;
NAME EMP.ENAME%TYPE;
COMMISSION EMP.COMM%TYPE;
BEGIN
OPEN C1;
FETCH C1 INTO NAME,COMMISSION;
DBMS_OUTPUT.PUT_LINE('THE VALUES ARE'||' '||NAME||' '||COMMISSION);
CLOSE C1;
END;
DECLARE
CURSOR C1 IS SELECT EMPNO,ENAME ,DEPTNO FROM EMP;
EMPNUM EMP.EMPNO%TYPE;
EMPNAME EMP.ENAME%TYPE;
DEPTNUM EMP.DEPTNO%TYPE;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO EMPNUM,EMPNAME,DEPTNUM;
if c1%notfound then
exit;
else
dbms_output.put_line(EMPNUM||' '||EMPNAME||' '||DEPTNUM);
end if;
112
END LOOP;
end;
DECLARE
CURSOR C1 IS SELECT EMPNO,ENAME ,SAL FROM EMP WHERE DEPTNO=10;
EMPNUM EMP.EMPNO%TYPE;
NAME EMP.ENAME%TYPE;
SALARY EMP.SAL%TYPE;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO EMPNUM,NAME,SALARY;
IF C1%NOTFOUND THEN EXIT;
END IF;
INSERT INTO TEMP VALUES(EMPNUM,NAME,SALARY);
END LOOP;
--CLOSE C1;
END;
//CURSOR ALREADY OPEN
DECLARE
CURSOR C1 IS SELECT EMPNO,ENAME,DEPTNO FROM EMP;
EMPNUM EMP.EMPNO%TYPE;
EMPNAME EMP.ENAME%TYPE;
DEPTNUM EMP.DEPTNO%TYPE;
BEGIN
OPEN C1;
OPEN C1;
FOR I IN 1..5
LOOP
FETCH C1 INTO EMPNUM,EMPNAME,DEPTNUM;
IF C1% NOTFOUND THEN
EXIT;
END IF;
--INSERT INTO TEMP VALUES(EMPNUM,EMPNAME,DEPTNUM);
END LOOP;
CLOSE C1;
END;
DECLARE
CURSOR C1 IS SELECT EMPNO,SAL,COMM FROM EMP;
EMPCODE EMP.EMPNO%TYPE;
SALARY EMP.SAL%TYPE;
COM EMP.COMM%TYPE;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO EMPCODE,SALARY,COM;
EXIT WHEN C1%NOTFOUND;
INSERT INTO TEMP VALUES(EMPCODE,SALARY,COM);
END LOOP;
CLOSE C1;
END;
////////(ISOPEN WITH CLOSE)
113
DECLARE
CURSOR C1 IS SELECT EMPNO,SAL,COMM FROM EMP;
EMPCODE EMP.EMPNO%TYPE;
SALARY EMP.SAL%TYPE;
COM EMP.COMM%TYPE;
BEGIN
LOOP
IF C1%ISOPEN THEN
DBMS_OUTPUT.PUT_LINE('CURSOR IS OPEN');
EXIT;
ELSE
OPEN C1;
FETCH C1 INTO EMPCODE,SALARY,COM;
EXIT WHEN C1%NOTFOUND;
INSERT INTO TEMP VALUES(EMPCODE,SALARY,COM);
END IF;
END LOOP;
CLOSE C1;
END;
DECLARE
CURSOR C1 IS SELECT EMPNO,ENAME,COMM FROM EMP;
BEGIN
--OPEN C1;
FOR I IN C1
LOOP
DBMS_OUTPUT.PUT_LINE(I.EMPNO||' '||I.ENAME||' '||I.COMM);
INSERT INTO TEMP VALUES(I.EMPNO,I.ENAME,I.COMM);
END LOOP;
--CLOSE C1;
END;
%ROWTYPE
-------DECLARE
CURSOR C1 IS SELECT * FROM EMP;
TEMPROW EMP%ROWTYPE;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO TEMPROW;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(TEMPROW.EMPNO||' '||TEMPROW.SAL);
END LOOP;
CLOSE C1;
DECLARE
CURSOR C1 IS SELECT EMPNO,ENAME,SAL FROM EMP;
TEMPROW C1%ROWTYPE;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO TEMPROW;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(TEMPROW.EMPNO||' '||TEMPROW.SAL);
114
END LOOP;
CLOSE C1;
END;
END;
IMPLICIT CURSOR
---------------BEGIN
UPDATE EMP SET HIREDATE='01-SEP-98' WHERE DEPTNO=20;
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT||'ROW UPDATED');
END;
ROWCOUNT
-------DECLARE CURSOR C1 IS SELECT * FROM EMP;
A C1%ROWTYPE;
BEGIN
IF NOT C1%ISOPEN THEN
OPEN C1;
END IF;
LOOP
FETCH C1 INTO A;
IF C1%FOUND THEN
IF C1%ROWCOUNT<5 THEN
DBMS_OUTPUT.PUT_LINE(A.EMPNO||' '||A.ENAME||' '||A.DEPTNO);
ELSE
EXIT;
END IF;
ELSE
EXIT;
END IF;
END LOOP;
CLOSE C1;
END;
EXCEPTION;
---------(ZERO_DIVIDE)
-----------DECLARE
A NUMBER:=&A;
B NUMBER:=&B;
C NUMBER;
BEGIN
C:=A/B;
DBMS_OUTPUT.PUT_LINE(C);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('THE DENOMINATOR IS ZERO');
B:=A;
C:=A/B;
DBMS_OUTPUT.PUT_LINE(C);
END;
115
VALUE error;
--------------DECLARE
EMPNUM NUMBER(3);
NAME VARCHAR2(10);
NO NUMBER:=&NO;
BEGIN
SELECT EMPNO,ENAME INTO EMPNUM,NAME FROM EMP WHERE EMPNO=NO;
DBMS_OUTPUT.PUT_LINE(EMPNUM||' '||NAME);
EXCEPTION
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('WIDTH IS NOT SUFFICIENT');
DECLARE
ENUM EMP.EMPNO%TYPE;
BEGIN
SELECT EMPNO,ENAME INTO ENUM,NAME FROM EMP WHERE EMPNO=NO
;
DBMS_OUTPUT.PUT_LINE(ENUM||' '||NAME);
END;
END;
INVALID NUMBER;
--------------DECLARE
NAME VARCHAR2(10):='&NAME';
NUM NUMBER(3);
BEGIN
SELECT TO_NUMBER(NAME) INTO NUM FROM DUAL;
DBMS_OUTPUT.PUT_LINE(NUM);
EXCEPTION
WHEN INVALID_NUMBER THEN
DBMS_OUTPUT.PUT_LINE('INVALID NUMBER IS RAISED');
END;
TOO MANY ROWS:
-------------DECLARE
NAME emp.ENAME%type;
EJOB EMP.JOB%TYPE:='&JOB';
BEGIN
select ENAME into NAME from emp WHERE JOB=EJOB;
dbms_output.put_line(NAME);
exception
when too_many_rows then
dbms_output.put_line('too many rows are found');
DECLARE
CURSOR C1 IS SELECT ENAME,JOB,SAL FROM EMP WHERE JOB=EJOB;
BEGIN
IF C1%ISOPEN THEN
DBMS_OUTPUT.PUT_LINE('CURSOR IS OPEN');
END IF;
FOR I IN C1 LOOP
116
END;
NO_DATA_FOUND
------------DECLARE
NO EMP.EMPNO%TYPE;
NAME EMP.ENAME%TYPE;
SALARY EMP.SAL%TYPE;
DESIG EMP.JOB%TYPE;
BEGIN
SELECT EMPNO,ENAME,SAL,JOB INTO NO,NAME,SALARY,DESIG
FROM EMP WHERE EMPNO=&EMPNO;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE(NO||' '||NAME||' '||SALARY||' '||DESIG);
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('NO DATA FOUND');
DECLARE
NEWNO EMP.EMPNO%TYPE;
NAME EMP.ENAME%TYPE;
DESIG EMP.JOB%TYPE;
BEGIN
SELECT ENAME,JOB INTO NAME,DESIG FROM EMP WHERE EMPNO=&NEWNO;
DBMS_OUTPUT.PUT_LINE(NAME||' '||dESIG);
END;
END;
CURSOR_ALREADY_OPEN
-------------------DECLARE
117
CURSOR C1 IS SELECT * FROM EMP ;
A C1%ROWTYPE;
BEGIN
open c1;
LOOP
OPEN C1;
FETCH C1 INTO A;
EXIT WHEN C1%NOtFOUND;
DBMS_OUTPUT.PUT_LINE(a.sal||' '||a.ename);
END LOOP;
CLOSE C1;
exception
when cursor_already_open then
dbms_output.put_line('cursor already openED');
END;
WHEN OTHERS
-----------DESC TEMP
A VARCHAR2(10)
B VARCHAR2(25)
C VARCHAR2(25)
DECLARE
ENO NUMBER(4);
NAME VARCHAR2(10);
DEPNO NUMBER(3);
ACODE NUMBER(4);
BMSG VARCHAR2(40);
EMPNO NUMBER(4);
BEGIN
SELECT EMPNO,ENAME,DEPTNO INTO ENO,NAME,DEPNO FROM EMP
WHERE empno=&empno;
DBMS_OUTPUT.PUT_LINE(ENO||' '||NAME||' '||DEPNO);
EXCEPTION
WHEN OTHERS THEN
ACODE:=SQLCODE;
BMSG:=SQLERRM;
DBMS_OUTPUT.PUT_LINE('ACODE:'||' '||ACODE||' '||BMSG);
--INSERT INTO temp VALUES(ACODE,BMSG ,'asds');
END;
DUP_VAL_ON_INDEX
----------------create table temp(a number(3) primary key,
b varchar2(10),c varchar2(10));
declare
dno dept.deptno%type;
dname dept.dname%type;
loc dept.loc%type;
begin
insert into DEPT values(&deptno,'&dname','&loc');
exception
when dup_val_on_index then
118
dbms_output.put_line('DUP_VALUES_ON_INDEX');
end;
USER_DEFINED_EXCEPTION
---------------------DECLARE
SALARY EMP.SAL%TYPE;
COM EMP.COMM %TYPE;
MIS_COMM EXCEPTION;
NETSAL NUMBER(7);
BEGIN
SELECT SAL,COMM INTO SALARY,COM FROM EMP WHERE EMPNO=&N;
DBMS_OUTPUT.PUT_LINE(SALARY||' '||COM);
IF COM IS NULL THEN
RAISE MIS_COMM;
ELSE
NETSAL:=SALARY+COM;
DBMS_OUTPUT.PUT_LINE(SALARY||' '||COM||' '||NETSAL);
END IF;
EXCEPTION
WHEN MIS_COMM THEN
DBMS_OUTPUT.PUT_lINE('ORA421'||' '||'MISS_COMM EXCEPTION');
END;
PARAMETER(ERROR)
---------DECLARE
I EMP%ROWTYPE;
CURSOR C1(TEMPENO NUMBER) IS
SELECT * FROM EMP WHERE EMPNO=TEMPENO;
BEGIN
OPEN C1(7499);
FETCH C1 INTO I ;
119
INSERT INTO EMP(EMPNO,ENAME,DEPTNO) VALUES(I.EMPNO,I.ENAME,I.DEPTNO);
--EXIT WHEN C1%NOT FOUND;
--END LOOP;
END;
WEAK CURSOR(NO RETURN TYPE DECLARATION)
--------------------------------------DECLARE
TYPE T1 IS REF CURSOR;
T2 T1;
A EMP%ROWTYPE;
BEGIN
OPEN T2 FOR SELECT * FROM EMP;
LOOP
FETCH T2 INTO A;
EXIT WHEN T2%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(A.EMPNO);
END LOOP;
CLOSE T2;
END;
DATA BASE TRIGGER:
-----------------BEFORE/AFTER INSERT OR UPDATE OR DELETE
ON
(ERROR)
CREATE OR REPLACE TRIGGER T1 BEFORE INSERT ON EMP
DECLARE
A VARCHAR2(10);
BEGIN
SELECT TO_CHAR(SYSDATE,'DAY') INTO A FROM DUAL;
IF A ='TUESDAY' THEN
RAISE_APPLICATION_ERROR(-20909,'INSERTION NOT POSSIBLE');
END IF;
END;
ERROR NO:
-20000 TO -20999
(FIND T1 OR T2 )(OK)
CREATE OR REPLACE TRIGGER T2 BEFORE INSERT ON EMP FOR EACH ROW
DECLARE
A NUMBER;
BEGIN
SELECT COUNT(*) INTO A FROM EMP WHERE DEPTNO=:NEW.DEPTNO;
IF A>=1 THEN
RAISE_APPLICATION_ERROR(-20101,'PRIMARY KEY VIOLATION');
END IF;
END;
CREATE OR REPLACE TRIGGER DELDEPT
AFTER DELETE ON DEPT
FOR EACH ROW
120
BEGIN
DELETE EMP WHERE DEPTNO=:OLD.DEPTNO;
DBMS_OUTPUT.PUT_LINE('PARENT CHILD DELETED');
END;
CREATE OR REPLACE TRIGGER CHECK_SAL
BEFORE update ON emp
FOR EACH ROW
BEGIN
IF :NEW.SAL<1000 OR :NEW.SAL>5000 THEN
RAISE_APPLICATION_ERROR(-20001,'CHECK SAL ');
END IF;
END;
CREATE OR REPLACE TRIGGER T1 BEFORE INSERT ON DEPT FOR EACH ROW
DECLARE
A DEPT.DEPTNO%TYPE;
BEGIN
SELECT COUNT(DEPTNO) INTO A FROM DEPT
WHERE DEPTNO=:NEW.DEPTNO;
IF A>=1 THEN
RAISE_APPLICATION_ERROR(-20001,'MASTER EXIST');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('-20001 NO MASTER RECORD');
END;
(MUTATING ERROR)
CREATE OR REPLACE TRIGGER T3 AFTER UPDATE ON EMP FOR EACH ROW
DECLARE
A NUMBER(1);
BEGIN
SELECT COUNT(*) INTO A FROM EMP WHERE DEPTNO=:old.DEPTNO;
dbms_output.put_line('new.depttno'||' '||:old.deptno);
IF A>1 THEN
RAISE_APPLICATION_ERROR(-20001,'UPDATED');
END IF;
END ;
VARRAY SELECT STATEMENT
----------------------/*DECLARE
CURSOR C1 IS SELECT * FROM TABLENAME;
A CI%ROWTYPE;
BEGIN
FOR I IN C1
LOOP
DBMS_OUTPUT.PUT_LINE('SDFS :'||
);
FOR I IN C1.COUNT
LOOP
DBMS_OUTPUT.PUT_LINE(SDA);
END LOOP;
END LOOP
*/
121
END;
NESTED TABLES:
-------------SELECT X.NAME FROM THE (SELECT EMPL FROM DEPTNEST WHERE DNO=10) X
WHERE X.NAME='YYYY';
SUBPROGRAMS
1. PROCEDURE Syntax:
CREATE OR REPLACE PROCEDURE <PROCNAME> (PARAMETERLIST)
<DECLARATION>
BEGIN
EXECUTABLE STATEMENTS
EXCEPTION HANDLERS
END;
IS
Eg.:
CREATE OR REPLACE PROCEDURE P1 (A NUMBER,B NUMBER) IS
COMMISSION NUMBER;
NULL_COMM EXCEPTION;
BEGIN
SELECT COMM INTO COMMISSION FROM EMP WHERE EMPNO=A;
IF COMMISSION IS NULL THEN
RAISE NULL_COMM;
ELSE
UPDATE EMP SET COMM=SAL+B WHERE EMPNO=A;
END IF;
EXCEPTION WHEN NULL_COMM THEN
DBMS_OUTPUT.PUT_LINE('THE VALUE COMM IS NULL');
END;
EXEC P1(7499,1000);
1.1 IN PARAMETER
CREATE OR REPLACE PROCEDURE P2 (NO IN NUMBER) IS PRICE NUMBER;
BEGIN
SELECT ACTUALPRICE INTO PRICE FROM ITEM WHERE ITEMID=NO;
DBMS_OUTPUT.PUT_LINE('ORIGINAL PRICE IS'||'
'||TO_CHAR(PRICE));
IF PRICE IS NULL THEN
DBMS_OUTPUT.PUT_LINE('PRICE IS NULL');
END IF;
END;
EXEC P2(10);
1.2 IN OUT PARAMETER
122
DECLARE
INNER NUMBER;
A NUMBER;
BEGIN
P3 (7499,A);
DBMS_OUTPUT.PUT_LINE('THE OUT VALUE IS '||' '||TO_CHAR(A));
END;
CREATE OR REPLACE PROCEDURE SAMPLE (A IN NUMBER,B IN OUT NUMBER)
IS ID NUMBER;
BEGIN
SELECT ORDID,PRODID INTO ID ,B FROM ITEM WHERE ITEMID=A;
IF B<500 THEN
B:=B+100;
END IF;
END;
DECLARE
A NUMBER;
B NUMBER;
BEGIN
END;
SAMPLE(10,B);
DBMS_OUTPUT.PUT_LINE('B VALUE IS'||' '||B);
FUNCTIONS
--------<CREATE OR REPLACE FUNCTION NAME> {(ARGUMENT) - IN ,OUT ,IN OUT}
RETURN DATATYPE IS >
DECLARATION
BEGIN
EXECUTABLE STATEMENTS
EXCEPTION
EXCEPTION HANDLERS
END;
create or replace function f1 return number is
a emp.sal%type;
begin
SELECT SAL INTO A FROM EMP WHERE ENAME='ALLEN';
RETURN A;
123
END;
DECLARE
B NUMBER;
BEGIN
B:=F1;
DBMS_OUTPUT.PUT_LINE(B);
END;
CREATE OR REPLACE FUNCTION FUN(ID NUMBER,AMOUNT NUMBER)
RETURN BOOLEAN IS
MINI NUMBER;
MAXI NUMBER;
BEGIN
SELECT MINPRICE,STDPRICE INTO MINI,MAXI FROM PRICE WHERE PRODID=ID;
RETURN (MINI>=AMOUNT) OR (MAXI>=AMOUNT);
END;
TO EXECUTE IT:
DECLARE
BEGIN
ELSE
ID NUMBER;
AMOUNT NUMBER;
REMARK BOOLEAN;
ID:=&A;
AMOUNT:=&B;
REMARK:=FUN(ID,AMOUNT);
IF REMARK=TRUE THEN
DBMS_OUTPUT.PUT_LINE('TRUE');
DBMS_OUTPUT.PUT_LINE('FALSE');
END IF;
END;
CREATE OR REPLACE FUNCTION FUN(N VARCHAR2)
RETURN VARCHAR2 IS
J VARCHAR2(10);
BEGIN
SELECT JOB INTO J FROM EMP WHERE ENAME=N;
RETURN J;
END;
SELECT FUN('BLAKE') FROM DUAL;
IN PARAMETER
------------CREATE OR REPLACE FUNCTION F1(NAME IN VARCHAR2) RETURN NUMBER IS
A EMP.SAL%TYPE;
BEGIN
SELECT SAL INTO A FROM EMP WHERE ENAME=NAME;
RETURN A;
END;
124
DECLARE
B NUMBER;
BEGIN
B:=F1('&A');
DBMS_OUTPUT.PUT_LINE(B);
END;
IN AND OUT
---------CREATE OR REPLACE FUNCTION F1(NAME IN VARCHAR2,B OUT VARCHAR2) RETURN
NUMBER IS
A EMP.SAL%TYPE;
BEGIN
SELECT SAL,JOB INTO A,B FROM EMP WHERE ENAME=NAME;
RETURN A;
END;
DECLARE
A NUMBER;
JOB VARCHAR2(20);
BEGIN
A:=F1('&c',JOB);
DBMS_OUTPUT.PUT_LINE(A||' '||JOB);
END;
IN OUT
-----CREATE OR REPLACE function F1(A IN number,c OUT NUMBER) RETURN NUMBER
IS
B EMP.COMM%TYPE;
BEGIN
SELECT SAL,COMM INTO sal1,comm1 FROM EMP WHERE EMPNO=A;
RETURN sal1;
END;
/* ERROR */
DECLARE
M2 NUMBER(5);
M3 NUMBER;
M1 NUMBER;
SALARY NUMBER;
BEGIN
M1:=F1(&M2,M3);
DBMS_OUTPUT.PUT_LINE(M2||' '||SALARY);
END;
PACKAGE SPECIATION
------------------CREATE OR REPLACE PACKAGE PACK1 IS
PROCEDURE P1;
FUNCTION F1 RETURN NUMBER;
A NUMBER;
END PACK1;
CREATE OR REPLACE PACKAGE BODY PACK1 IS
125
PROCEDURE P1 IS
BEGIN
DBMS_OUTPUT.PUT_LINE('P1 PACKAGE');
END P1;
FUNCTION F1 RETURN NUMBER IS
BEGIN
A:=1000;
RETURN A;
END F1;
END PACK1;
DECLARE
N NUMBER;
BEGIN
N:=PACK1.F1;
DBMS_OUTPUT.PUT_LINE(N);
PACK1.P1;
END;
/*
CREATE OR REPLACE PACKAGE PACK2 IS
PROCEDURE DDEP;
FUNCTION BALANCE RETURN NUMBER;
NAME VARCHAR2(15);
END PACK2;
126
LOOP
T2(M) :=I*10;
DBMS_OUTPUT.PUT_LINE(T2(M)||' '||m);
M:=M+1;
END LOOP;
END;
DECLARE
TYPE T1 IS TABLE OF EMP.ENAME%TYPE
INDEX BY BINARY_INTEGER;
M BINARY_INTEGER:=0;
T2 T1;
BEGIN
FOR I IN (SELECT ENAME FROM EMP )
LOOP
T2(M):=I.ENAME;
--INSERT INTO DEPT1(DNAME) VALUES(T2(M));
dbms_output.put_line(t2(m)||' '||m);
M:=M+1;
END LOOP;
END;
DECLARE
TYPE T1 IS TABLE OF EMP.ENAME%TYPE
INDEX BY BINARY_INTEGER;
M BINARY_INTEGER :=1;
T2 T1;
T3 T1;
BEGIN
FOR I IN(SELECT ENAME FROM EMP)
LOOP
T2(M) :=I.ENAME;
T3(M):=T2;
DELETE FROM EMP WHERE ENAME=T2(M);
DBMS_OUTPUT.PUT_LINE(T3(M));
M:=M+1;
END LOOP;
END;
DECLARE
TYPE T1 IS TABLE OF DEPT%ROWTYPE
INDEX BY BINARY_INTEGER;
T2 T1;
M BINARY_INTEGER :=1;
BEGIN
FOR I IN (SELECT * FROM DEPT)
LOOP
T2(M).DEPTNO :=I.DEPTNO;
T2(M).DNAME :=I.DNAME;
T2(M).LOC
:=I.LOC;
DBMS_OUTPUT.PUT_LINE(T2(M).DEPTNO||' '||T2(M).DNAME||' '||T2(M).LOC);
M :=M+1;
END LOOP;
END;
--RECORD(ONE ROW)
127
DECLARE
TYPE T1 IS RECORD
(A NUMBER(3),B VARCHAR2(30),C VARCHAR2(30));
T2 T1;
BEGIN
SELECT * INTO T2 FROM DEPT WHERE DEPTNO=10;
DBMS_OUTPUT.PUT_LINE(T2.A||T2.B||T2.C);
END;
BEGIN
END;
----------------------------------------BEGIN
END;
----------------------------------------DECLARE
I NUMBER :=7788;
J NUMBER :=10000;
BEGIN
UPDATE EMP SET SAL=J WHERE EMPNO=I;
END;
----------------------------------------DECLARE
I NUMBER:=&I;
J NUMBER:=&J;
BEGIN
UPDATE EMP SET SAL=J WHERE EMPNO=I;
-----------------------------------------DECLARE
I NUMBER;
J NUMBER;
BEGIN
UPDATE EMP SET SAL=&J WHERE EMPNO=&I;
END;
-----------------------------------------FOR LOOP
-------FOR <VAR> IN <MIN>..<MAXVALUE>
LOOP
-
128
END LOOP;
------------------------------------------declare
begin
FOR I IN 1..5
LOOP
INSERT INTO TEMP VALUES (I);
END LOOP;
end;
------------------------------------------WHILE LOOP
---------WHILE <CONDITION>
LOOP
END LOOP;
------------------------------------------DECLARE
A NUMBER(2);
BEGIN
A:=&A;
FOR COUNT IN 1..A
LOOP
INSERT INTO TEMP VALUES (COUNT);
END LOOP;
END;
------------------------------------------DECLARE
I NUMBER:=10;
BEGIN
WHILE I <=15
LOOP
INSERT INTO TEMP VALUES (I);
I:=I+1;
END LOOP;
END;
------------------------------------------DECLARE
I NUMBER:=1;
BEGIN
WHILE I<=10
LOOP
INSERT INTO TEMP VALUES(I,'XXXX');
IF I>5 THEN
EXIT;
END IF;
129
I:=I+1;
END LOOP;
INSERT INTO TEMP VALUES(I,'YYYY');
END;
------------------------------------------GO TO STATEMENT
--------------DECLARE
I NUMBER:=1;
BEGIN
WHILE I<=10
LOOP
INSERT INTO TEMP VALUES(I,'XXXX');
IF I=5 THEN
GOTO PROC;
END IF;
I:=I+1;
END LOOP;
<<PROC>>
INSERT INTO TEMP VALUES(I,'PROC');
END;
-----------------------------------------------------------USING INTO CLASS
---DECLARE
BEGIN
TEMP
NUMBER: = &TEMPNO;
TEMPSAL NUMBER;
SELECT SAL INTO TEMPSAL FROM EMP WHERE EMPNO=TEMP;
DBMS_OUTPUT.PUT_LINE(TEMPSAL);
END;
SET SERVEROUT ON;
-----------------------------------------------------------////////////////(UPDATE ERROR)
DECLARE
TNO
NUMBER:=&TEMPNO;
TEMPSAL NUMBER;
TEMPCOMM NUMBER;
BEGIN
SELECT SAL,COMM INTO TEMPSAL,TEMPCOMM FROM EMP WHERE
EMPNO=TNO;
IF TEMPCOMM >1000 AND TEMPSAL <=5000 THEN
UPDATE EMP SET SAL=SAL+2000 WHERE EMPNO=TNO;
ELSIF TEMPSAL >2000 THEN
UPDATE EMP SET SAL=SAL+1000 WHERE EMPNO=TNO;
END IF;
END;
-------------------------------------------------------------------
130
DECLARE
BEGIN
THEN
TEMPEMPNO NUMBER:=&TEMPEMPNO;
TEMPHIREDATE DATE;
TEMPNAME VARCHAR2(20);
SELECT HIREDATE,ENAME INTO TEMPHIREDATE,TEMPNAME FROM EMP
WHERE EMPNO=TEMPEMPNO;
IF TEMPHIREDATE >='01-JAN-80' AND TEMPHIREDATE <='30-JAN-85'
UPDATE EMP SET COMM=COMM+COMM*0.1 WHERE EMPNO=TEMPEMPNO;
END IF;
END;
------------------------------------------------------------------DECLARE
TEMPEMPNO NUMBER:=&TEMPEMPNO;
TEMPDEPTNO NUMBER;
BEGIN
END;
------------------------------------------------------------------DECLARE
BEGIN
A NUMBER;
B NUMBER;
C NUMBER;
A:=&A;
B:=&B;
C:=A+B;
DBMS_OUTPUT.PUT_LINE(C);
END;
-----------------------------------------------------------------------%TYPE
-------DECLARE
SALARY EMP.SAL%TYPE;
DOJ
EMP.HIREDATE%TYPE;
BEGIN
END;
------------------------------------------------------------------------
131