Download - Plsql My Notes
-
8/6/2019 Plsql My Notes
1/33
-
8/6/2019 Plsql My Notes
2/33
EMP_REC E_REC_T;
BEGINSELECT EMPNO,ENAME,JOB,SAL INTO EMP_REC FROM EMP
WHERE EMPNO=7369;DBMS_OUTPUT.PUT_LINE( EMP_REC.EMPNO ||' ' ||
EMP_REC.ENAME ||' ' ||EMP_REC.JOB ||' ' ||EMP_REC.SAL );END;
/
1)A FUNCTIONALLY SIMILAR BLOCK, ADDING A DECLARATION SECTION
DECLAREV_DATE VARCHAR2(10);BEGINV_DATE := SYSDATE;DBMS_OUTPUT.PUT_LINE(V_DATE);END;/
2) DIFFERENT WAYS OF INITIALIZING THE VARIABLES IN THE DECLARATIONSECTION
DECLARE
V_NO NUMBER(2) :=10;V_NAME VARCHAR2(10) DEFAULT 'SAIBABA';V_SAL NUMBER(5) NOT NULL := 5000;V_JOB CONSTANT VARCHAR2(100) := 'MANAGING DIRECTOR OF ORACLE';
BEGIN
DBMS_OUTPUT.PUT_LINE(V_NO);DBMS_OUTPUT.PUT_LINE(V_NAME);DBMS_OUTPUT.PUT_LINE(V_SAL);DBMS_OUTPUT.PUT_LINE(V_JOB);
END;
/
3) WAP TO PRINT THE FOLLOWING
WELCOME TO PL/SQL PROGRAMMING
DECLAREV_MESSAGE VARCHAR2(100) := 'WELCOME TO PL/SQL PROGRAMMING';
-
8/6/2019 Plsql My Notes
3/33
BEGINDBMS_OUTPUT.PUT_LINE(V_MESSAGE);V_MESSAGE := 'WILSHIRE SOFTWARE TECHNOLOGIES';DBMS_OUTPUT.PUT_LINE(V_MESSAGE);DBMS_OUTPUT.PUT_LINE('HAI ');END;/
4) WAP TO ACCEPT THE TEMP IN CENTIGRADE AND CONVERT IT INTO FARENHEITF=C*1.8+32
DECLAREC NUMBER := &C;F NUMBER;
BEGIN
F := C*1.8+32;
DBMS_OUTPUT.PUT_LINE('FARENHEIT=' || F);
END;/
5) WAP TO ACCEPT A SENTANCE AND COUNT THE NO. OF CHARACTERS IN THATSENTANCE
DECLARESTR VARCHAR2(100) := '&STR';I NUMBER;
BEGIN
I := INSTR(STR,'.');
I := LENGTH(STR);
DBMS_OUTPUT.PUT_LINE('NO OF CHARACTERS=' || I);
DBMS_OUTPUT.PUT_LINE('LENGTH = ' || I);
END;
/
6)WAP TO ACCEPT THE TWO STRINGS AND CONCAT THE TWO STRINGS
DECLARE
STR VARCHAR2(20) := '&STR';
STR1 VARCHAR2(20) := '&STR1';
-
8/6/2019 Plsql My Notes
4/33
V VARCHAR2(40);
BEGIN
V := STR || ' , ' || STR1;
DBMS_OUTPUT.PUT_LINE(V);
END;
/
7) WAP TO ACCEPT THE MGR AND FIND HOW MANY EMPS ARE WORKING UNDER THATMGR
DECLARE
V_MGR NUMBER(4) := &V_MGR;
N NUMBER :=0;
BEGIN
SELECT COUNT(*)INTO N
FROM EMPWHERE MGR=V_MGR;
DBMS_OUTPUT.PUT_LINE('NO OF EMPLOYEES = ' || N);
END;
/
8) WAP TO ACCEPT 2 NO.S FIND THE REMAINDER WHEN THE FIRST NUMBER ISDIVIDED BY THE SECOND NUMBERDON'T USE THE MOD FUNCTION
DECLARE
A NUMBER := &A;
B NUMBER := &B;
C NUMBER ;
M NUMBER ;
BEGIN
-
8/6/2019 Plsql My Notes
5/33
C := TRUNC (A/B);
M := A-C*B;
DBMS_OUTPUT.PUT_LINE('REMAINDER IS = ' || M);
END;
/
9) USING THE MOD FUNCTION
DECLARE
A NUMBER := &A;
B NUMBER := &B;
C NUMBER;
BEGIN
C := MOD(A,B);
DBMS_OUTPUT.PUT_LINE('REMAINDER = ' || C);
END;
/10) WAP TO ACCEPT THE TIME IN HH,MIN FORMAT AND FIND THE TOTAL SECONDS
DECLARE
H NUMBER := &HOUR;
M NUMBER := &MINUTE;
S NUMBER(10);
BEGIN
S := (H*60*60)+(M*60);
DBMS_OUTPUT.PUT_LINE('TOTAL SECONDS = ' || S);
END;
/
11) GO TO STATEMENT
BEGIN
GOTO SECOND_OUTPUT;
-
8/6/2019 Plsql My Notes
6/33
-
8/6/2019 Plsql My Notes
7/33
/15) LOOPS
DECLARE
V_NAME VARCHAR2(10) := 'SAI';
V_C NUMBER(2) :=0;
BEGIN
LOOP
V_C := V_C+1;
--DBMS_OUTPUT.PUT_LINE(V_NAME);
EXIT WHEN V_C>10;
--DBMS_OUTPUT.PUT_LINE(V_NAME);
END LOOP;
DBMS_OUTPUT.PUT_LINE(V_NAME);
END;
/
16) WHILE LOOP
WAP TO PRINT THE NUMBERS FROM 1 TO 10
DECLARE
v_N NUMBER(3):= 1;
v_V VARCHAR2(100) ;
BEGIN
WHILE v_N
-
8/6/2019 Plsql My Notes
8/33
BEGIN
FOR I IN 1..10 LOOP
DBMS_OUTPUT.PUT_LINE('HELLO');
END LOOP;
END;
/18) FOR LOOP EXAMPLE
DECLARE
V_L NUMBER(2) :=1;
V_H NUMBER(2) :=10;
BEGIN
FOR I IN V_L..V_H LOOP
DBMS_OUTPUT.PUT_LINE('HELLO');
END LOOP;
END;
/19) FOR LOOP EXAMPLE WITH BOND VALUE CHANGING
DECLARE
V_L NUMBER(2) :=1;
V_H NUMBER(2) :=10;
BEGIN
FOR I IN V_L..V_H LOOP
DBMS_OUTPUT.PUT_LINE('HELLO');
V_L :=20;
V_H :=40;
END LOOP;
END;
/
20) FOR LOOP PRINTING THE VALUES OF THE COUNTER
-
8/6/2019 Plsql My Notes
9/33
BEGIN
FOR I IN 1..10 LOOP
DBMS_OUTPUT.PUT_LINE(I || 'HELLO');
END LOOP;
END;
/
21) %TYPE
SYNTAX:
IDENTIFIER TABLE.COLUMN_NAME%TYPE;
DECLARE
V_SAL EMP.SAL%TYPE;V_ENAME EMP.ENAME%TYPE;
BEGIN
SELECT SAL,ENAMEINTO V_SAL,V_ENAMEFROM EMPWHERE EMPNO=7369;DBMS_OUTPUT.PUT_LINE(V_ENAME || ' AND HIS SALARY IS ' || V_SAL);
END;
/22) WITH OUT USING %TYPE
DECLARE
V_SAL NUMBER(2);
BEGIN
SELECT SAL INTO V_SAL
FROM EMPWHERE EMPNO=7369;
DBMS_OUTPUT.PUT_LINE(V_SAL);
END;
/
-
8/6/2019 Plsql My Notes
10/33
23) WITH OUT USING %TYPE
DECLARE
V_SAL VARCHAR2(10);
BEGIN
SELECT SAL INTO V_SAL
FROM EMP
WHERE EMPNO=7369;
DBMS_OUTPUT.PUT_LINE(V_SAL);
END;
/
24) %TYPE BASED ON THE PREVIOUSLY DEFINED VARIABLE
DECLARE
V_ENAME EMP.ENAME%TYPE;
V_JOB V_ENAME%TYPE;
BEGIN
SELECT ENAME,JOB
INTO V_ENAME,V_JOB
FROM EMP
WHERE EMPNO=7369;
DBMS_OUTPUT.PUT_LINE(V_ENAME);
END;
/
25) SYNTAXT FOR %ROWTYPE
DECLARE
IDENTFIER REFERENCE%ROWTYPE;
-
8/6/2019 Plsql My Notes
11/33
WHERE
IDENTIFIER IS THE NAME CHOOSEN FOR A RECORD AS A WHOLE
REFERENCE IS THE NAME OF THE TABLE,VIEW, CURSOR OR CURSOR VARIABLE ONWHICHTHE RECORD IS BASED.
TO REFERENCE AN INDIVIDUAL FIELD, WE USE DOT NOTATION
FOR EXAMPLE:
RECORD_NAME.FIELD_NAME;
FOR EXAMPLE, YOU REFERENCE THE ENAME FIELD IN THE EMP_RECORD RECORD ASFOLLOWS
EMP_RECORD.ENAME;
YOU CAN THEN ASSIGN A VALUE TO THE RECORD FIELD AS FOLLOWS;
EMP_RECORD.ENAME:='BOND';
26) %ROWTYPE ATTRIBUTE
--DECLARE A VARIABLE TO STORE THE INFORMATION ABOUT A DEPARTMENT FROMTHE--DEPT TABLE
DEPT_RECORD DEPT%ROWTYPE;
--DECLARE A VARIABLE TO STORE THE INFORMATION ABOUT AN EMPLOYEE FROMTHE--EMP TABLE
EMP_RECORD EMP%ROWTYPE;
27) ADVANTAGES OF USING %ROWTYPE
THE NUMBER AND DATA TYPES OF THE UNDERLYING COLUMNS NEED NOT BE KNOWN.
THE NUMBER AND DATA TYPES OF THE UNDERLYING DATABASE COLUMNS MAY CHANGEAT RUNTIME.
THE ATTRIBUTE IS USEFULL WHEN RETRIEVING A ROW WITH THESELECT * STATMENT.28) %ROWTYPE WITH DEPT TABLE
DECLARE
DEPT_RECORD DEPT%ROWTYPE;
BEGIN
-
8/6/2019 Plsql My Notes
12/33
SELECT * INTO DEPT_RECORD
FROM DEPT
WHERE DEPTNO=10;
DBMS_OUTPUT.PUT_LINE(DEPT_RECORD.DNAME);
DBMS_OUTPUT.PUT_LINE(DEPT_RECORD.LOC);
DBMS_OUTPUT.PUT_LINE(DEPT_RECORD.DEPTNO);
END;
/29) %ROWTYPE GETTING THE VALUES FROM OTHER TABLE CONCEPT
DECLARE
EMP_RECORD EMP%ROWTYPE;
BEGIN
SELECT *INTO EMP_RECORDFROM EMP1WHERE EMPNO=7369;
DBMS_OUTPUT.PUT_LINE(EMP_RECORD.ENAME);
END;
/30) CREATING A PL/SQL RECORD
SYNTAX:
TYPE type_name IS RECORD
(field_declaration ...........);
identifier type_name;
WHERE field_declration is
field_name (field_type | variable%type | table.column%type | table%rowtype )
where
TYPE_NAME IS THE NAME OF THE RECORD TYPE
FIELD_NAME IS THE NAME OF A FIELD WITHIN THE RECORD
-
8/6/2019 Plsql My Notes
13/33
FIELD_TYPE IS THE DATATYPE OF THE FIELD
NOTE:- HERE WE CAN'T USE REF CURSOR
31) VARIABLE%TYPE EXAMPLE
DECLARE
TYPE EMP_RECORD_TYPE IS RECORD
(ENAME VARCHAR2(10),JOB ENAME%TYPE,SAL NUMBER(7,2),EMPNO SAL%TYPE);
EMP_RECORD EMP_RECORD_TYPE;
BEGIN
SELECT ENAME,JOB,SAL,EMPNOINTO EMP_RECORDFROM EMPWHERE EMPNO=7369;
DBMS_OUTPUT.PUT_LINE(EMP_RECORD.ENAME);DBMS_OUTPUT.PUT_LINE(EMP_RECORD.EMPNO);
END;
/
32) PL/SQL RECORD WITH %TYPE
DECLARE
TYPE EMP_RECORD_TYPE IS RECORD
(EMPNO EMP.EMPNO%TYPE,ENAME EMP.ENAME%TYPE);
EMP_RECORD EMP_RECORD_TYPE;
BEGIN
SELECT EMPNO,ENAME
INTO EMP_RECORD
FROM EMP
WHERE EMPNO=7369;
-
8/6/2019 Plsql My Notes
14/33
-
8/6/2019 Plsql My Notes
15/33
INDEX BY TABLES (PL/SQL TABLES)
1) ARE COMPOSED OF TWO COMPONENTS
A) PRIMARY KEY OF DATA TYPE BINARY_INTEGER.
B) COLUMN OF SCALAR OR RECORD DATA TYPE
NOTE:-
1) CAN INCREASE IN SIZE DYNAMICALLY BECAUSE THEY ARE UNCONSTRAINED
2) OBJECTS OF THE TABLE TYPE ARE CALLED INDEX BY TABLES
3) THEY ARE MODELED AS (BUT NOT THE SAME AS) DATABASE TABLES
4) INDEX BY TABLES USE A PRIMARY KEY TO PROVIDE YOU WITH ARRAY-LIKEACCESS TO
ROWS
5) SIMPLY WE CAN SAY INDEX BY TABLE IS JUST LIKE A ARRAY
36) - SYNTAX:
TYPE TYPE_NAME IS TABLE OF
COLUMN_TYPE | VARIABLE%TYPE | TABLE.COLUMN%TYPE | TABLE%ROWTYPE
INDEX BY BINARY_INTEGER;
IDENTIFIER TYPE_NAME;
INDEX BY TABLE STRUCURE
UNIQUE IDENTIFIER COLUMN
1 JONES2 SMITH3 MADURO
BINARY_INTEGER SCALAR
NOTE:-
1) THE COLUMNS CANNOT BE NAMED
2) WE CANNOT INITIALIZE AN INDEX BY TABLE IN ITS DECLARATION.
3) AN INDEX BY TABLE IS NOT POPULATED AT THE TIME OF THE DECLARATION
4) IT CONTAINS NO KEYS OR NO VALUES
-
8/6/2019 Plsql My Notes
16/33
5) AN EXPLICIT EXECUTABLE STATMENT IS REQUIRED TO INITIALIZE(POPULATE)THE
INDEX BY TABLE
37) --EXAMPLE OF INDEX BY TABLE OF RECORDS
DECLARE
TYPE EMP_TABLE_TYPE IS TABLE OFEMPLOYEES%ROWTYPEINDEX BY BINARY_INTEGER;
MY_EMP_TABLE EMP_TABLE_TYPE;V_COUNT NUMBER(2) :=4;
BEGIN
FOR I IN 1..V_COUNT LOOP
SELECT * INTOMY_EMP_TABLE(I)FROM EMPLOYEESWHERE EMPNO=I;
dbms_output.put_line(my_emp_table(i).ename);
END LOOP;
--FOR I IN MY_EMP_TABLE.FIRST..MY_EMP_TABLE.LAST LOOP
--DBMS_OUTPUT.PUT_LINE(MY_EMP_TABLE(I).ENAME);--DBMS_OUTPUT.PUT_LINE(MY_EMP_TABLE.COUNT);--DBMS_OUTPUT.PUT_LINE(MY_EMP_TABLE.NEXT(1);--DBMS_OUTPUT.PUT_LINE(MY_EMP_TABLE.PRIOR(3);
--END LOOP;
IF MY_EMP_TABLE.EXISTS(1) THENDBMS_OUTPUT.PUT_LINE('FIRST RECORD IS EXISTING');
END IF;
END;
38) NOTE:- IN SCALAR IT'S NOT POSSIBLE TO DISPLAY THE VALUE-- ONLY WE CAN MAKE A DECISION BY USING EXISTS METHOD
DECLARE
-
8/6/2019 Plsql My Notes
17/33
TYPE ENAME_TABLE_TYPE IS TABLE OF
EMPLOYEES.ENAME%TYPE
INDEX BY BINARY_INTEGER;
ENAME_TABLE ENAME_TABLE_TYPE;
BEGIN
FOR I IN 1..10 LOOP
SELECT ENAME INTO ENAME_TABLE(I) FROM EMPLOYEESWHERE EMPNO=I;--dbms_output.put_line(ename_table(i).ename);
END LOOP;
IF ENAME_TABLE.EXISTS(1) THENDBMS_OUTPUT.PUT_LINE('IT EXISTS');
END IF;
END;
/
39) NOTE:- IN SCALAR IT'S NOT POSSIBLE TO DISPLAY THE VALUE-- ONLY WE CAN MAKE A DECISION BY USING EXISTS METHOD
DECLARE
TYPE ENAME_TABLE_TYPE IS TABLE OF
EMPLOYEES.ENAME%TYPE
INDEX BY BINARY_INTEGER;
ENAME_TABLE ENAME_TABLE_TYPE;
BEGIN
FOR I IN 1..10 LOOP
SELECT ENAME INTO ENAME_TABLE(I) FROM EMPLOYEESWHERE EMPNO=I;--dbms_output.put_line(ename_table(i).ename);
END LOOP;
IF ENAME_TABLE.EXISTS(1) THENDBMS_OUTPUT.PUT_LINE('IT EXISTS');END IF;
END;
/40) INDEX BY TABLE METHODS
-
8/6/2019 Plsql My Notes
18/33
-
8/6/2019 Plsql My Notes
19/33
1) IMPLICIT CURSORS2) EXPLICIT CURSORS
IMPLICIT CURSORS:- DECLARED FOR ALL DML, PL/SQL SELECT STATEMENTS
EXPLICIT CURSORS:- DECLARED AND NAMED BY THE PROGRAMMER
NOTE:- THE ORACLE SERVER USES WORK AREAS, CALLED PRIVATE SQL AREAS,TO EXECUTE SQL STATEMENTS AND TO STORE PROCESSING INFORMATION
YOU CAN USE PL/SQL CURSORS TO NAME A PRIVATE SQL AREA ANDACCESS ITS STORED INFORMATION
IMPLICIT CURSORS:- IMPLICIT CURSORS ARE DECLARED BY THE PL/SQLIMPLICITYLY
FOR ALL DML AND PL/SQL SELECT STATEMENTS, INCLUDINGQUERIES
THAT RETURN ONLY ONE ROW.
EXPLICIT CURSORS:- FOR QUERIES THAT RETURN MORE THAN ONE ROW, EXPLICITCURSORS
ARE DECLARED AND NAMED BY THE PROGRAMMER AND MANIPULATEDTHROUGH SPECIFIC STATEMENTS IN THE BLOCK'S EXECUTABLE
ACTIONS
CONTROLLING EXPLICIT CURSORS STEPS
1) OPEN THE CURSOR2) FETCH A ROW3) CLOSE THE CURSOR
EXPLICIT CURSOR ATTRIBUTES:-
ARE USED TO OBTAIN STATUS INFORMATION ABOUT A CURSOR
ATTRIBUTES:-
%ISOPEN BOOLEAN%NOTFOUND BOOLEAN%FOUND BOOLEAN%ROWCOUNT NUMBER
%ISOPEN:- EVALUATES TO TRUE IF THE CURSOR IS OPEN%NOTFOUND:- EVALUATES TO TRUE IF THE MOST RECENT FETCH DOES NOT RETURNA ROW%FOUND:- EVALUATES TO TRUE IF THE MOST RECENT FETCH RETURNS A ROW;
COMPLIMENT OF %NOTFOUND%ROWCOUNT:- EVALUATES TO THE TOTAL NUMBER OF ROWS RETURNED SO FAR
NOTE:- WE CANNOT REFERENCE CURSOR ATTRIBUTES DIRECTLY IN A SQL STATEMENT
-
8/6/2019 Plsql My Notes
20/33
-
8/6/2019 Plsql My Notes
21/33
-
8/6/2019 Plsql My Notes
22/33
DBMS_OUTPUT.PUT_LINE(V_ENAME);EXIT WHEN EMP_CURSOR%FOUND;END LOOP;CLOSE EMP_CURSOR;
END;
/45) %IS OPEN ATTRIBUTE
DECLARECURSOR EMP_CURSOR IS SELECT EMPNO FROM EMP;V_EMPNO EMP.EMPNO%TYPE;
BEGIN
IF NOT EMP_CURSOR%ISOPEN THENOPEN EMP_CURSOR;END IF;
LOOP
FETCH EMP_CURSOR INTO V_EMPNO;
DBMS_OUTPUT.PUT_LINE(V_EMPNO);
EXIT WHEN EMP_CURSOR%NOTFOUND;
END LOOP;
END;
/46) CURSORS AND RECORDS
DECLARECURSOR EMP_CURSOR IS SELECT * FROM EMP;EMP_RECORD EMP_CURSOR%ROWTYPE;
BEGIN
OPEN EMP_CURSOR;LOOP
FETCH EMP_CURSOR INTO EMP_RECORD;DBMS_OUTPUT.PUT_LINE(EMP_RECORD.ENAME);
EXIT WHEN EMP_CURSOR%NOTFOUND;
END LOOP;
CLOSE EMP_CURSOR;
END;
/
-
8/6/2019 Plsql My Notes
23/33
SYNTAX:-
FOR RECORD_NAME IN CURSOR_NAME LOOPSTATEMENT1;STATEMENT2;END LOOP;
NOTE:-
1) THE CURSOR FOR LOOP IS A SHORTCUT TO PROCESS EXPLICIT CURSORS2) IMPLICIT OPEN,FETCH,EXIT AND CLOSE OCCUR.3) THE RECORD IS IMPLICITLY DECLARED
A CURSOR FOR LOOP PROCESS ROWS IN AN EXPLICIT CURSOR.IT IS A SHORTCUT BECAUSE THE CURSOR IS OPENED ,ROWS ARE FETCHED ONCE FOR EACH ITERATION IN THE LOOP,THE LOOP EXITS WHEN THE LAST ROWS IS PROCESSED,AND THE CURSOR IS CLOSED AUTOMATICALLY.
THE LOOP IS TERMINATED AUTOMATICALLY AT THE END OF THE ITERATION
NOTE:- DO NOT USE THE CURSOR FOR LOOPWHEN THE CURSOR OPERATION MUST BE HANDLED EXPLICITLY
48) CURSOR FOR LOOP EXAMPLE
DECLARECURSOR EMP_CURSOR IS SELECT ENAME,DEPTNO FROM EMP;BEGINFOR EMP_RECORD IN EMP_CURSOR LOOPIF EMP_RECORD.DEPTNO=10 THENDBMS_OUTPUT.PUT_LINE(EMP_RECORD.ENAME);END IF;END LOOP;END;/
49) CURSOR FOR LOOPS USING SUBQUERIES
-- NOTE:- NO NEED TO DECLARE THE CURSOR
BEGIN
FOR EMP_RECORD IN (SELECT * FROM EMP) LOOP
IF EMP_RECORD.DEPTNO=10 THENDBMS_OUTPUT.PUT_LINE(EMP_RECORD.ENAME);END IF;
END LOOP;
END;
-
8/6/2019 Plsql My Notes
24/33
/50) ADVANCED EXPLICIT CURSOR CONCEPTS
1) CURSORS WITH PARAMETERS2) THE FOR UPDATE CLAUSE3) THE WHERE CURRENT OF CLAUSE
A) CURSORS WITH PARAMETERS
SYNTAX:-
CURSOR CURSOR_NAME (PARAMETER_NAME DATATYPE, PARAMETER_NAME1DATATYPE.....)ISSELECT STATEMENT;
PASS PARAMETER VALUES TO A CURSOR WHEN THE CURSOR IS OPENED AND THEQUERY
IS EXECUTED
OPEN AN EXPLICIT CURSOR SEVERAL TIMES WITH A DIFFERENT ACTIVE SET EACHTIME
EG:- OPEN CURSOR_NAME(PARAMETER_VALUE....);
NOTEPOINT:-
IT IS POSSIBLE TO TERMINATE THE PL/SQL BLOCK WITHOUT CLOSING THECURSORS,BUT WE SHOULD MAKE IT A HABIT TO CLOSE ANY CURSOR THAT YOU DECLAREEXPLICITYLY TO FREE UP RESOURCES
THERE IS A MAXIMUM LIMIT TO THE NUMBER OF OPEN CURSORS PER USER,WHICH IS DETERMINED BY THE OPEN_CURSORS PARAMETER IN THE DATABASEPARAMETER FILE.
FOR EG:- OPEN_CURSORS=50 BY DEFAULT51) SIMPLE CURSOR EXAMPLE WITH OUT PASSING ANY PARAMETER-- NOTE POINT:- ALWAYS USE CURSORNAME IN FETCH STATEMENT--FETCH STATEMENT IS ALWAYS USED WITH CURSORS ONLY
DECLARECURSOR EMP_CURSOR ISSELECT * FROM EMP
WHERE DEPTNO=10;EMP_RECORD EMP_CURSOR%ROWTYPE;
BEGINOPEN EMP_CURSOR;LOOPFETCH EMP_CURSOR INTO EMP_RECORD;DBMS_OUTPUT.PUT_LINE(EMP_RECORD.ENAME);EXIT WHEN EMP_CURSOR%NOTFOUND;END LOOP;
-
8/6/2019 Plsql My Notes
25/33
CLOSE EMP_CURSOR;END;/
52) CURSOR WITH PARAMETERS-- FOR PARAMETER DATA TYPE WE SHOULD NOT SPECIFY THE SIZE-- I.E. THE SIZE SHOULD NOT BE CONSTRAINED(NO RESTRICTION ON SIZE)
DECLARE
CURSOR EMP_CURSOR(P_DEPTNO NUMBER) ISSELECT * FROM EMPWHERE DEPTNO=P_DEPTNO;
EMP_RECORD EMP_CURSOR%ROWTYPE;
BEGIN
OPEN EMP_CURSOR(10);LOOP
FETCH EMP_CURSOR INTO EMP_RECORD;DBMS_OUTPUT.PUT_LINE('THESE EMPLOYEES ARE WORKING IN DEPT10');DBMS_OUTPUT.PUT_LINE(EMP_RECORD.ENAME);DBMS_OUTPUT.PUT_LINE('----------------------------');EXIT WHEN EMP_CURSOR%NOTFOUND;END LOOP;CLOSE EMP_CURSOR;
OPEN EMP_CURSOR(20);LOOPFETCH EMP_CURSOR INTO EMP_RECORD;DBMS_OUTPUT.PUT_LINE('THESE EMPLOYEES ARE WORKING IN DEPT20');DBMS_OUTPUT.PUT_LINE(EMP_RECORD.ENAME);EXIT WHEN EMP_CURSOR%NOTFOUND;END LOOP;CLOSE EMP_CURSOR;
END;
/53) THE FOR UPDATE CLAUSE
SYNTAX:-
SELECT ........FROM
FOR UPDATE [OF COLUMN_REFERENCE] [NOWAIT];
1) USE EXPLICIT LOCKING TO DENY ACCESS FOR THE DURATION OF ATRANSACTION.2) LOCK THE ROWS BEFORE THE UPDATE OR DELETE.
COLUMN_REFERENCE:-1) IS A COLUMN IN THE TABLE AGAINST THE QUERY IS PROCESSED2) A LIST OF COLUMNS MAY ALSO BE USED
-
8/6/2019 Plsql My Notes
26/33
NOWAIT:- RETURNS AN ORACLE ERROR IF THE ROWS ARE LOCKED BY ANOTHERSESSION
NOTE:- FOR UPDATE CLAUSE IS THE LAST CLAUSE IN A SELECT STATEMENT, EVENAFTER THE ORDER BY, IF ONE EXISTS.
FOR UPDATE OF COL_NAMES(S) LOCKS ROWS ONLY IN TABLES THAT CONTAIN THECOL_NAMES(S)
NOWAIT:- IT TELLS ORACLE NOT TO WAIT IF REQUESTED ROWS HAVE BEEN LOCKEDBYANOTHER USER
CONTROL IS IMMEDIATELY RETURNED TO YOUR PROGRAMM SO THAT IT CAN DOOTHER WORKBEFORE TRYING AGAIN TO ACQUIRE THE LOCK.
IF YOU OMIT THE NOWAIT KEYWORD, ORACLE WAITS UNTIL THE ROWS AREAVAILABLE
NOTE:- IF THE ORACLE SERVER CANNOT ACQUIRE THE LOCKS ON THE ROWS ITNEEDS IN ASELECT FOR UPDATE, IT WAITS INDEFINITELY.54) THE WHERE CURRENT OF CLAUSE
SYNTAX :-
WHERE CURRENT OF CURSOR;
USE CURSORS TO UPDATE OR DELETE THE CURRENT ROW.
INCLUDE THE FOR UPDATE CLAUSE IN THE CURSOR QUERY TO LOCK THE ROWS FIRST
USE THE WHERE CURRENT OF CLAUSE TO REFERENCE THE CURRENT ROW FROM AN
EXPLICIT CURSOR
CURSOR:- IS THE NAME OF A DECLARE CURSOR (THE CURSOR MUST HAVE BEENDECLAREDWITH THE FOR UPDATE CLAUSE)
NOTE:- THE WHERE CURRENT OF CLAUSE IS USED TO UPDATE OR DELETE THECURRENT ROWBEING ADDRESSED WITHOUT THE NEED TO EXPLICITLY REFERENCE THE ROWID
55) EXAMPLE
DECLARECURSOR SAL_CURSOR ISSELECT SAL FROM EMPWHERE DEPTNO=10FOR UPDATE OF SAL NOWAIT;
BEGIN
-
8/6/2019 Plsql My Notes
27/33
FOR EMP_RECORD IN SAL_CURSOR LOOP
IF EMP_RECORD.SAL
-
8/6/2019 Plsql My Notes
28/33
STATEMENT1;
EXCEPTION:- IS THE STANDARD NAME OF A PREDEFINED EXCEPTION ORTHE NAME OF A USER DEFINED EXCEPTION DECLARED WITH IN THEDECLARATIVE SECTION
STATEMENT:- IS ONE OR MORE PL/SQL OR SQL STATEMENTS
OTHERS :- IS AN OPTIONAL EXCEPTIONAL-HANDLING CLAUSE THAT TRAPSUNSPECIFIED
EXCEPTIONS
NOTE:- THE OTHERS HANDLER TRAPS ALL EXCEPTIONS NOT ALREADY TRAPPED.SOME ORACLE TOOLS HAVE THEIR OWN PREDEFINED EXCEPTIONS THAT YOU
CANRAISE TO CAUSE EVENTS IN THE APPLICATION.THE OTHERS HANDLER CAN ALSO TRAP THESE EXCEPTION
TRAPPING EXCEPTIONS GUIDELINES
THE EXCEPTION KEYWORD STARTS EXCEPTION-HANDLING SECTIONSEVERAL EXCEPTION HANDLERS ARE ALLOWEDONLY ONE HANDLER IS PROCESSED BEFORE LEAVING THE BLOCKWHEN OTHERS IS THE LAST CLAUSEYOU CAN HAVE ONLY ONE OTHERS CLAUSEEXCEPTIONS CANNOT APPEAR IN ASSIGNMENT STATEMENTS OR SQL STATEMENTS
SAMPLE PREDEFINED EXCEPTIONS
NO_DATA_FOUNDTOO_MANY_ROWSINVALID_CURSORZERO_DIVIDEDUP_VAL_ON_INDEX
NO_DATA_FOUND :- SINGLE ROW RETURNED NO DATATOO_MANY_ROWS :- SINGLE-ROW SELECT RETURNED MORE THAN ONE ROWINVALID_CUROSR :- ILLEGAL CURSOR OPERATION OCCUREDZERO_DIVIDE :- ATTEMPTED TO DIVIDE BY ZERODUP_VAL_ON_INDEX ATTEMPTED TO INSERT A DUPLICATE VALUE
56) NO_DATA_FOUND EXCEPTION
DECLAREV_NAME VARCHAR2(25);BEGINSELECT ENAMEINTO V_NAMEFROM EMPWHERE EMPNO=2;END;/
-
8/6/2019 Plsql My Notes
29/33
57) NO_DATA_FOUND EXCEPTION HANDLING
DECLARE
V_NAME VARCHAR2(20);
V_NO NUMBER(10);BEGIN
SELECT ENAMEINTO V_NAMEFROM EMPWHERE EMPNO=2;
EXCEPTION
WHEN NO_DATA_FOUND THEN
--select sal into v_no--from emp--where empno=7369;
v_no := 10000;
DBMS_OUTPUT.PUT_LINE(V_NO);END;
/
58) TOO_MANY_ROWS
DECLARE
V_ENAME VARCHAR2(10);
BEGIN
SELECT ENAME INTO V_ENAMEFROM EMP;
EXCEPTIONWHEN TOO_MANY_ROWS THENDBMS_OUTPUT.PUT_LINE('A VARIABLE CAN HOLD ONLY SINGLE VALUE AT A TIME');
END;
/59) ZERO_DIVIDE
DECLARE
V_NO NUMBER(5) := 10;
-
8/6/2019 Plsql My Notes
30/33
V_NO1 NUMBER(5) :=0;
V_RES NUMBER(5);
BEGIN
V_RES := (V_NO/V_NO1);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('UNDEFINED VALUE');
END;
/
60) INVALID CURSOR
DECLARE
CURSOR EMP_CURSOR IS SELECT * FROM EMP;
EMP_RECORD EMP_CURSOR%ROWTYPE;
BEGIN
--LOOP
--FETCH EMP_CURSOR INTO EMP_RECORD;--EXIT WHEN EMP_CURSOR%NOTFOUND;--END LOOP;
CLOSE EMP_CURSOR;
EXCEPTION
WHEN INVALID_CURSOR THEN
DBMS_OUTPUT.PUT_LINE('NOT OPENED CURSOR TILL YET');
END;
/
61) DUP_VAL_ON_INDEX EXCEPTION
BEGIN
INSERT INTO AVALUES(1);
-
8/6/2019 Plsql My Notes
31/33
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE('PRIMARY KEY VIOLATION');
END;
/
62) NON PREDEFINED ERROR
DECLARE
V_SAL NUMBER(2);
BEGIN
SELECT SAL INTO V_SAL
FROM EMP
WHERE EMPNO=7369;
DBMS_OUTPUT.PUT_LINE(V_SAL);
END;
/
63) TRAP FOR ORACLE SERVER ERROR NUMBER -6502, AN VALUE TOO LARGE
DECLARE
V_SAL NUMBER(2);
E_HIGH EXCEPTION;
PRAGMA EXCEPTION_INIT(E_HIGH,-6502);
BEGIN
SELECT SALINTO V_SAL
FROM EMPWHERE EMPNO=7369;
EXCEPTION
WHEN E_HIGH THENDBMS_OUTPUT.PUT_LINE('VALUE TOO HIGH');
END;
-
8/6/2019 Plsql My Notes
32/33
/
64) TRAP FOR ORACLE SERVER ERROR NUMBER -2292 , AN INTEGRITY CONSTRAINT-- VIOLATION
FUNCTIONS FOR TRAPPING EXCEPTION
SQLCODE:- RETURNS THE NUMERIC VALUE FOR THE ERROR CODE
SQL CODE VALUE :-
0 NO EXCEPTION ENCOUNTERED
1 USER-DEFINED EXCEPTION
+100 NO_DATA_FOUND EXCEPTION
NEGATIVE NUMBER ANOTHER ORACLE SERVER ERROR NUMBER
SQLERRM :- RETURNS THE MESSAGE ASSOCIATED WITH THE ERROR NUMBER
65) FUNCTIONS FOR TRAPPING EXCEPTIONS
DECLARE
V_ERROR_NUMBER NUMBER;
V_ERROR_MESSAGE VARCHAR2(255);
V_SAL NUMBER(9);
v_high exception;
pragma exception_init(v_high,-6502);
BEGIN
SELECT SAL INTO V_SALFROM EMPWHERE EMPNO=7369;
v_error_number := sqlcode;v_error_message := sqlerrm;
dbms_output.put_line(v_error_number);
EXCEPTION
--WHEN NO_DATA_FOUND THEN
-
8/6/2019 Plsql My Notes
33/33