Prog

Embed Size (px)

DESCRIPTION

prg

Citation preview

*)Another Program:-------------------------DECLARE vword VARCHAR2(30) := 'Oracle';BEGIN FOR v1 IN 1..5 LOOPDBMS_OUTPUT.PUT_LINE(v1||'.'||vword); END LOOP;END;/

*)Display each character in a new line of word 'Oracle'?--------------------------------------------------------------------------DECLARE vword VARCHAR2(30) := 'Oracle';BEGIN FOR v1 IN 1..LENGTH(vword) LOOPDBMS_OUTPUT.PUT_LINE(SUBSTR(vword,v1,1)); END LOOP;END;/*)Display only odd number of chars in a new line of above?------------------------------------------------------------------------------DECLARE vword VARCHAR2(30) := 'Oracle';BEGIN FOR v1 IN 1..LENGTH(vword) LOOP IF MOD(v1,2)=1 THENDBMS_OUTPUT.PUT_LINE(SUBSTR(vword,v1,1)); END IF; END LOOP;END;/ *) How to take input from keyboard?-------------------------------------------------SQL*PLUS provides Replacement variable that takes input from keyboard and passes to statementor variable.Replacement variables are not memory variables (in other words they are removed as soonas value is assigned to target statement or variable).

syntax:& example: vword VARCHAR2(30) := '&name';Note: For character variables replacement variable is to be kept in single quots.

*)Display the name of 'Oracle' in reverse order (each word in ----------------------------------------------------------------------------new line?-----------sol):DECLAREvword VARCHAR2(30) := 'Oracle';chrlen NUMBER :=length(vword);BEGIN FOR v1 IN REVERSE 1..chrlen LOOP DBMS_OUTPUT.PUT_LINE(SUBSTR(vword,v1,1)); END LOOP;END;/

*)Display the name of 'Oracle' in reverse order?--------------------------------------------------------------DECLAREvword VARCHAR2(30) := 'Oracle'; vAppend VARCHAR2(20);BEGIN FOR v1 IN REVERSE 1..LENGTH(vword) LOOP vAppend :=vAppend||SUBSTR(vword,v1,1); END LOOP;DBMS_OUTPUT.PUT_LINE(vAppend);END;/

*)Display the following Output?------------------------------------------OOrOraOracOraclOracle

sol):DECLAREvword VARCHAR2(30) := 'Oracle';chrlen NUMBER :=length(vword);BEGIN FOR v1 IN REVERSE 1..chrlen LOOP DBMS_OUTPUT.PUT_LINE(SUBSTR(vword,1,chrlen+1-v1)); END LOOP;END;/

*)Display the following output?-----------------------------------------OracleOraclOracOraOrOsol):DECLAREvword VARCHAR2(30) := 'Oracle';chrlen NUMBER :=length(vword);BEGIN FOR v1 IN REVERSE 1..chrlen LOOP DBMS_OUTPUT.PUT_LINE(SUBSTR(vword,1,v1)); END LOOP;END;/

*)Display the following output?------------------------------------------ORRAAACCCCLLLLLEEEEEE

sol):

DECLARE v1 VARCHAR2(20) := '&name';v2 VARCHAR2(20); BEGIN FOR i IN 1..LENGTH(v1) LOOPFOR j IN 1..i LOOP v2 := v2||SUBSTR(v1,i,1);END LOOP;DBMS_OUTPUT.PUT_LINE(v2);v2 := ''; END LOOP;END;/*)Display sum of values between 1 and 10?----------------------------------------------------------sol):DECLAREv1 NUMBER :=0;BEGIN FOR i iN 1..10 LOOPv1 := v1+i; END LOOP; DBMS_OUTPUT.PUT_LINE(v1);END;/

*)How to use SELECT in PL/SQL BLOCK:--------------------------------------------------------syntax:SELECT .............INTO FROM .........................WHERE .......................................

Write a program to take input of one salary & display the------------------------------------------------------------------------------employee name?-----------------------

DECLARE vSal NUMBER := &Salary; vName VARCHAR2(200);BEGINSELECT ename INTO vNameFROM empWHERE sal=vSal;DBMS_OUTPUT.PUT_LINE(vName);EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('Invalid salary');

WHEN TOO_MANY_ROWS THEN dbms_output.put_line('many emps for salary'); WHEN OTHERS THEN dbms_output.put_line('Unexpected Error');END;/

*)How to get PL/SQL error code of message?------------------------------------------------------------There are two functions provided by PL/SQL: 1)SQLCODE -returns current error code. 2)SQLERRM-returns current error message.example: DBMS_OUTPUT.PUT_LINE('Unexpected:'||SQLERRM);

*)Take input of dept no,deptname and location. Insert new ------------------------------------------------------------------------------department if the dept no is not in the table?------------------------------------------------------------

DECLARE vDeptNo NUMBER :=&DeptNo; vDName VARCHAR2(200) :='&DName'; vLoc VARCHAR2(200) := '&Location'; vTemp char(1);BEGIN SELECT 'x' INTO vTemp FROM dept WHERE deptno=vdeptno; dbms_output.put_line('Duplicate Deptno');

EXCEPTION WHEN NO_DATA_FOUND THEN INSERT INTO dept(deptno,dname,loc) VALUES (vDeptno,vDname,vLoc); COMMIT; dbms_output.put_line('Record added');END;/

*)Take input of Job and display count of employees working --------------------------------------------------------------------------------for the job?---------------

DECLARE vJob VARCHAR2(200) := '&Job'; vCount NUMBER; BEGIN SELECT COUNT(*) INTO vCount FROM emp WHERE UPPER(LTRIM(RTRIM(job))) =UPPER(vJob); dbms_output.put_line('Total Emps=' || vCount);END;/

Note: When we are using group functions then there is no need to specify Exception Handler.

PL/SQL specific data types:------------------------------------- 1).%TYPE --> Used to declare a variable based on column or variables.

2).%ROWTYPE3).BOOLEAN

Syntax for %TYPE:-------------------------- %TYPE [:=value];

or%TYPE [;=value>];

example:DECLARE v1 Emp.Deptno %TYPE; v2 v1 %TYPE;

%ROWTYPE:-------------------It declares variables to keep one complete record.It is also known as composite data type, since itdeclares a variable with many numbers of differenttypes.

Syntax for %ROWTYPE:-------------------------------- %ROWTYPE;or %ROWTYPE;example:DECLARE v1 Dept %ROWTYPE;

*)How to fetch multiple records from database?---------------------------------------------------------------*)PL/SQL Provides a method known as cursor. It is combination of SELECT statement and PL/SQL routines(programs) to manage memory. With this method SELECT statement retrieves records from database and keeps them into buffer.And from buffer records are retrieved one-by-one into local variables.Cursor method requires following steps:

1)Declaration of cursor:------------------------------- i.e Cursor Name & SELECT statement(it can be sub query or join query) are provided. No internal process is done.2)Opening of cursor: -----------------------------Parsing(Evaluation of SELECT statement.-Memory(Buffer) allocation for Cursor.-Fetching Data from Cursor. records are loaded into buffer and record pointer is located on first record. values from current records are copied into local variables.This step should be repeated to fetch more than one record.

3)Closing The Cursor:-----------------------------Buffer allocated for buffer is released.

Syntax for Cursor:------------------------1) CURSOR IS ;2) OPEN 3) FETCH INTO ;4) CLOSE ;

Note1: -First step is declaration of cursor -Second step is Opening a cursor. -Third step is fetching data from cursor.(it is to be repeated till our requirement). -Fourth step is closing the cursor.

Note2:--------Cursor Declaration is to be done at DECLARE partof PL/SQL.Remaining steps will be in BEGIN or EXCEPTIONsection.

CURSOR Attributes:-----------------------------> FOUND -- Boolean-->NOTFOUND -- Boolean-->ROWCOUNT-- Number-->ISOPEN-- Boolean

Cursor attributes are predefined variables attachedto each cursor.These variables keeps current information about cursor.

FOUND:----------This attribute will be true when fetch is successful.Otherwise false.

NOTFOUND:-----------------This attribute will be true when fetch is not successful.Otherwise false.

ROWCOUNT:------------------This attribute keeps count of records fetched fromcursor to local variables.It is like a counter variable.

ISOPEN:------------This attribute is true when cursor is already open.Other wise false.

syntax: %

*)How to display all employee names?---------------------------------------------------DECLARE CURSOR c1 IS SELECT ename FROM emp; vEname EMP.Ename %TYPE;

BEGIN OPEN c1; LOOP FETCH c1 INTO vEname; EXIT WHEN c1%FOUND=FALSE; dbms_output.put_line(vEname);END LOOP; CLOSE c1;END;/ *)Display employee names with Dept name?----------------------------------------------------------DECLARE CURSOR c1 ISSELECT E.ename,D.dnameFROM emp E,dept DWHERE E.deptno=D.deptno;

vEname Emp.Ename %TYPE;vDname Dept.Dname %TYPE;

BEGIN OPEN c1;

LOOP FETCH c1 INTO vEname,vDname; EXIT WHEN c1%FOUND=FALSE; dbms_output.put_line(vEname || '---' || vDname);END LOOP; CLOSE c1;END;/

*)Display each job with count of employee?-----------------------------------------------------------------

DECLARE CURSOR c1 ISSELECT job,COUNT(*) TotalFROM empGROUP BY job;

vJob Emp.Job %TYPE; vCount NUMBER;BEGIN OPEN c1;

LOOP FETCH c1 INTO vJob,vCount; EXIT WHEN c1%FOUND=FALSE; dbms_output.put_line(vJob|| '=' ||vCount);END LOOP; CLOSE c1;END;/

*)How to check the primary key value or foreign key value?------------------------------------------------------------------------------

DECLARE vDeptno NUMBER := &Deptno; vDname VARCHAR2(2000) := '&Dname'; vLoc VARCHAR2(2000) := '&Location'; vTemp CHAR(1);

CURSOR c1 ISSELECT 'x' FROM deptWHERE deptno=vDeptno;

BEGIN OPEN c1;FETCH c1 INTO vTemp; CLOSE c1;

IF vTemp IS NULL THEN INSERT INTO dept(deptno,dname,loc) VALUES (vDeptno,vDname,vLoc); COMMIT; dbms_output.put_line('Department added');ELSE dbms_output.put_line('Duplicate deptno');END IF;END;/

Note: When we use SELECT with cursor,then no exception will will be found.

CURSOR For Loop:--------------------------Cursor For loop is advanced method of handling cursor.It is combination of For Loop and Cursor.Using this method use avoid following steps of oldCursor style:

1) Declaration of cursor2) Opening of cursor3) Fetching from cursor4) status check for fetch.5) closing cursor

Cursor For Loop Syntax:--------------------------------FOR IN ()LOOP................................END LOOP;orFOR IN LOOP .................END LOOP;

Note: --> It of %ROWTYPE on cursor.

*) How to display job type,No of employee in the Job?------------------------------------------------------------------------BEGIN FOR c1 IN(SELECT job,COUNT(*) TotalFROM emp GROUP BY job)LOOP dbms_output.put_line(c1.job|| '=' ||c1.total);END LOOP;END;/

*)The same above program with cursor declaration-------------------------------------------------------------------(This is the better Apparoach).----------------------------------------

DECLARE CURSOR emp_cur IS SELECT job,COUNT(*) TotalFROM emp GROUP BY job;BEGINFOR x in emp_curLOOPdbms_output.put_line(x.job||'='||x.Total);END LOOP;END;

*)Display ename,dname and his grade for all emps?----------------------------------------------------------------------DECLARE CURSOR c1 IS SELECT ename,dname,grade FROM emp,dept,salgradeWHERE emp.deptno=dept.deptnoAND grade=(SELECT grade FROM salgrade WHERE emp.sal BETWEEN losal andhisal);

vEname emp.ename %TYPE; vDname dept.dname %TYPE; vGrade salgrade.grade %TYPE;

BEGIN OPEN c1;LOOP FETCH c1 INTO vEname,vDname,vGrade; EXIT WHEN c1 %FOUND=FALSE; dbms_output.put_line(vEname||'--'||vDname||'--'||vGrade);END LOOP;

CLOSE c1;END;/

*)Display each employee name in reverse order?------------------------------------------------------------------(with in cursor for loop,reverse logic)------------------------------------------------

DECLARE vEname VARCHAR2(20);BEGINFOR c1 IN (SELECT ename FROM emp)LOOP vEname:=null; FOR v1 IN REVERSE 1..LENGTH(c1.ename) LOOP vEname:=vEname||SUBSTR(c1.ename,v1,1); END LOOP; dbms_output.put_line(vEname);END LOOP;END;/

*)Take input of one character ,count and display occurence--------------------------------------------------------------------------------of character with in employee name?------------------------------------------------

DECLARE vChar char(1) := UPPER('&EnterChar'); vEname VARCHAR2(20); vCounter NUMBER(2);

BEGINFOR c1 IN (SELECT ename FROM emp)LOOP vEname :=null; vCounter :=0; FOR v1 IN 1..LENGTH(c1.ename) LOOP IF SUBSTR(c1.ename,v1,1)=vChar THENvCounter := vCounter +1; END IF; vEname := vEname||SUBSTR(c1.ename,v1,1); END LOOP; dbms_output.put_line(vEname||'--'||vCounter);END LOOP;END;/

*)Take input of Deptno,and display Total salary paid by dept---------------------------------------------------------------------------------with out using SUM Function?---------------------------------------

DECLARE vDeptno emp.deptno %TYPE :=&DeptNumber; vSal emp.sal %TYPE := 0;BEGIN FOR c1 IN(SELECT sal FROM emp WHERE deptno = vDeptno) LOOPvSal := vSal +c1.sal; END LOOP;dbms_output.put_line(vSal);END;/

*)Take input of manager name, and display employee names----------------------------------------------------------------------------------working under him?--------------------------

DECLARE vMname emp.ename %TYPE :=UPPER('&ManagerName');BEGIN FOR c1 IN (SELECT ename FROM emp WHERE mgr IN (SELECT empno FROM emp WHERE ename=vMname)) LOOPdbms_output.put_line(c1.ename); END LOOP;END;/

*)Display following output?-------------------------------------

dname empname .............. .............. ..............dname empname .............. .............. ..............

BEGINFOR c1 IN (SELECT * FROM dept)LOOP dbms_output.put_line(c1.dname); FOR c2 IN(SELECT ename FROM emp WHERE emp.deptno = c1.deptno) LOOPdbms_output.put_line('-----'||c2.ename); END LOOP;END LOOP;END;/