Professional Documents
Culture Documents
Murugappan Sir Notes - GT
Murugappan Sir Notes - GT
Murugappan Sir Notes - GT
search
Home Sql and pl/sql Sql Interview Questions
JUL
20
INLINE view in Oracle with 12c New Features
SELECT First_name
, last_name
, salary
, department_id
FROM employees a , ( SELECT b.department_id
, AVG(b.salary) avg_sal
FROM employees b
GROUP BY b.department_id
) b
WHERE a.department_id = b.department_id
AND a.salary > b.avg_salary;
Display all the customer who have placed more number of orders by using INLINE view
SELECT c.*
FROM customer_order_det_tb c;
--------------------------------------------
custm_id custm_nm order_dt ttl_amt
--------------------------------------------
100 Murugappan 7/11/2015 45000.00
100 Murugappan 7/14/2015 27000.00
101 Raja 7/13/2015 17000.00
102 Ramesh 7/15/2015 34000.00
102 Ramesh 7/15/2015 38000.00
--------------------------------------------
--Writing a Quer to display all the customer who have placed maximum number of
order
--------------------------------
custm_id custm_nm total_odr
--------------------------------
100 Murugappan 2
102 Ramesh 2
101 Raja 1
--------------------------------
----------
total_odr
----------
2
----------
Inline view to find all the customers who have placed maximum number of orders
/****************************************
Syntax
--Display name and salary for top three money makers of the company and their
designation should not be SALESMAN and PRESIDENT
Example :
--in 11g
SELECT * FROM employees e, (
SELECT *
FROM departments d
WHERE e.department_id = d.department_id);
--in 12c
SELECT * FROM employees e, LATERAL(
SELECT *
FROM departments d
WHERE e.department_id = d.department_id
);
--in 11g
WITH t
AS
( SELECT LEVEL a
FROM dual
CONNECT BY LEVEL <= 30)
SELECT *
FROM t, (SELECT *
FROM employees
WHERE department_id = t.a
);
ORA-00904: "T"."A": invalid Identifier
--in 12c
WITH t
AS
(SELECT LEVEL a FROM dual CONNECT BY LEVEL <= 30)
SELECT * FROM t,
LATERAL(SELECT *
FROM employees
WHERE department_id = t.a);
0 Add a comment
JAN
23
Salary Related Questions in Oracle
--creating table
BEGIN
--Inserting records
INSERT INTO employee_data VALUES(1000,'Name01',90,30000);
INSERT INTO employee_data VALUES(1001,'Name02',90,6000);
INSERT INTO employee_data VALUES(1002,'Name03',90,23000);
INSERT INTO employee_data VALUES(1003,'Name04',60,35000);
INSERT INTO employee_data VALUES(1004,'Name05',60,60000);
INSERT INTO employee_data VALUES(1005,'Name06',60,30000);
INSERT INTO employee_data VALUES(1006,'Name07',80,36000);
INSERT INTO employee_data VALUES(1007,'Name08',80,29000);
INSERT INTO employee_data VALUES(1008,'Name09',80,37000);
INSERT INTO employee_data VALUES(1009,'Name10',80,41000);
COMMIT;
END;
/
SELECT MAX(salary)
FROM employee_data
WHERE salary NOT IN (SELECT MAX(salary)
FROM employee_data);
SELECT MIN(salary)
FROM (SELECT salary
FROM (SELECT salary
FROM employee_data
ORDER BY salary DESC)
WHERE rownum <= 5);
SELECT MIN(salary)
FROM (SELECT salary
FROM (SELECT salary
FROM employee_data
ORDER BY salary DESC)
WHERE rownum <= &n);
--query to select all the details of the employee whose getting nth maximum salary
SELECT *
FROM (SELECT emp.*,
rownum rn
FROM (SELECT *
FROM employee_data
ORDER BY salary DESC) emp)
WHERE rn = 9;
SELECT *
FROM (SELECT emp.*,
row_number() over(ORDER BY salary) rank
FROM employee_data emp)
WHERE rank = 9;
SELECT *
FROM (SELECT emp.*,
rank() over(ORDER BY salary DESC) rank
FROM employee_data emp)
WHERE rank = 4;
--same query using dense_rank( ) function
SELECT *
FROM (SELECT emp.*,
dense_rank() over(ORDER BY salary DESC) rank
FROM employee_data emp)
WHERE rank = 4;
--query to display all the employees who are all getting salary more than average
salary of the company
--query to display all the employees who are all getting salary more than their
department average salary
SELECT employee_id,
first_name,
salary
FROM employees OUT
WHERE salary > (SELECT AVG(salary)
FROM employees
WHERE department_id = OUT.department_id);
--query to display all the employees who are all getting salary more than their
manager salary
SELECT employee_id,
first_name,
salary
FROM employees OUT
WHERE salary > (SELECT AVG(salary)
FROM employees
WHERE employee_id = OUT.manager_id);
7 View comments
JAN
22
Why prefer COALESCE over NVL
I prefer using "COALESCE" over "NVL" is some of the scenarios. Last week One of my
friend asked me what is the advantage of using "COALESCE" where we can simply use
"NVL". I simply gave him the reply from Oracle Docs i.e. NVL lets you replace null
(returned as a blank) with a string in the results of a query and COALESCE returns
the first non-null expr in the expression list. Oracle Database uses short-circuit
evaluation with "COALESCE".
He replied that he knows the difference, he knows that "COALESCE" can take multiple
arguments and so on. He was more interested in understanding "short-circuit
evaluation" of "COALESCE" and the scenarios where I prefer using "COALESCE" over
"NVL".
To make him understand I created following function which takes One second in every
execution and simply returns '--null--' and executed 2 very similar queries one
with NVL and other with COALESCE.
Function created.
Following are the queries which I used to demonstrate that NVL evaluates both
arguments even if the second argument is not used and COALESCE uses short-circuit
evaluation i.e. it only evaluates the arguments only if they are needed.
Elapsed: 00:00:14.01
14 rows selected.
Elapsed: 00:00:01.01
Here we can see easily that the first query with NVL took 14+ seconds, one second
for each record even if the "f_null" value was used only in one record. On the
contrary as mentioned in Oracle Documentation "COALESCE" uses its "short-circuit
evaluation" and "f_null" was called only once and so second query took only One
Second. "COALESCE" is certainly use less resources than NVL.
Posted 22nd January 2015 by Unknown
0 Add a comment
DEC
21
Constraints
Format : [part_of_project_name-table_name-column_name-constraint_type]
Example : gmind_emp_id_pk _uk _ck _fk
Types
Primary Key
Unique Key
Foreign Key
c1(pk) : 1 2 3
c2(fk) : 1 1 2 3 4 Not allowed
Not Null
Check
------------------------------------
Duplicate NULL
------------------------------------
Primary Key X X
Unique Key X Allowed
Foreign Key Allowed Allowed
------------------------------------
DESC my_stu_details;
------------------------------------
Name Type Nullable
------------------------------------
S_ID NUMBER(2)
S_NAME VARCHAR2(30)
S_MAIL VARCHAR2(30) Y
S_GENDER CHAR(1) Y
S_DID NUMBER(3) Y
------------------------------------
--Duplicate Check
--Null Check
--------------------------------------------------------
s_id s_name s_mail s_gender s_did
--------------------------------------------------------
1 name1 name1@gmail.com m 60
2 name2 name2@gmail.com F 90
3 Name3 name3@gmail.com F 80
4 Name4 M 70
5 Name5 name5@gmail.com M 70
6 Name6 name6@gmail.com F 90
--------------------------------------------------------
-------------------------------------------------
S_ID S_NAME S_MAIL S_GENDER S_DID
-------------------------------------------------
6 Name6 name6@gmail.com F 90
1 name1 name1@gmail.com m -
2 name2 name2@gmail.com F 90
3 Name3 name3@gmail.com F 80
4 Name4 - M 70
5 Name5 name5@gmail.com M 70
-------------------------------------------------
-------------------------------------------------
S_ID S_NAME S_MAIL S_GENDER S_DID
-------------------------------------------------
6 Name6 name6@gmail.com F 90
2 name2 name2@gmail.com F 90
3 Name3 name3@gmail.com F 80
4 Name4 - M 70
5 Name5 name5@gmail.com M 70
-------------------------------------------------
Syntax
SELECT c.owner,
c.constraint_name,
c.constraint_type,
c.table_name,
c.r_constraint_name,
c.status
FROM user_constraints c
WHERE c.table_name = 'MY_STU_DETAILS';
-----------------------------------------------------------------------------------
-
owner constraint_name constraint_type table_name r_constraint_name status
-----------------------------------------------------------------------------------
-
HR SYS_C004023 C MY_STU_DETAILS ENABLED
HR MY_STU_GEN_CK C MY_STU_DETAILS ENABLED
HR MY_STU_SID_PK P MY_STU_DETAILS ENABLED
HR MY_STU_MAIL_UK U MY_STU_DETAILS ENABLED
HR MY_STU_DID_FK R MY_STU_DETAILS DEPT_ID_PK ENABLED
-----------------------------------------------------------------------------------
-
-------------------------------------------------------------
owner constraint_name table_name column_name position
-------------------------------------------------------------
HR MY_STU_MAIL_UK MY_STU_DETAILS S_MAIL 1
HR MY_STU_SID_PK MY_STU_DETAILS S_ID 1
HR MY_STU_GEN_CK MY_STU_DETAILS S_GENDER
HR SYS_C004023 MY_STU_DETAILS S_NAME
HR MY_STU_DID_FK MY_STU_DETAILS S_DID 1
-------------------------------------------------------------
Interview Questions
1 View comments
DEC
4
listagg in Oracle 11g
Oracle 11gR2 listagg built-in function allows for many table columns to be
displayed within a single row, a non-first-normal form display
Syntax :
--Example 1:
BEGIN
INSERT INTO test_ins VALUES( 101,'pendrive');
INSERT INTO test_ins VALUES( 102,'toy');
INSERT INTO test_ins VALUES( 101,'ipod');
INSERT INTO test_ins VALUES( 102,'hat');
INSERT INTO test_ins VALUES( 103,'cpu');
INSERT INTO test_ins VALUES( 104,'pen');
INSERT INTO test_ins VALUES( 104,'car');
INSERT INTO test_ins VALUES( 104,'mat');
INSERT INTO test_ins VALUES( 105,'tv');
INSERT INTO test_ins VALUES( 106,'laptop');
commit;
END;
-->-- Example 2
0 Add a comment
NOV
8
Condition and Looping Statement
IF
IF ELSE
Multiple IF ELSE
LOOP
FOR LOOP
WHILE LOOP
BEGIN
INSERT INTO test_udt VALUES(001,23000);
INSERT INTO test_udt VALUES(002,43000);
INSERT INTO test_udt VALUES(003,78000);
INSERT INTO test_udt VALUES(004,25000);
INSERT INTO test_udt VALUES(005,26000);
INSERT INTO test_udt VALUES(006,90000);
Commit;
END;
DECLARE
v_salary NUMBER;
v_id NUMBER;
BEGIN
SELECT id,salary
INTO v_id,v_salary
FROM test_udt
WHERE id = 1;
commit;
END;
/
IF ELSE
DECLARE
v_salary NUMBER;
v_id NUMBER;
BEGIN
SELECT id,salary
INTO v_id,v_salary
FROM test_udt
WHERE id = 2;
DECLARE
v_salary NUMBER;
v_id NUMBER;
BEGIN
SELECT id,salary
INTO v_id,v_salary
FROM test_udt
WHERE id = 2;
IF v_salary < 20000 THEN
v_salary := v_salary+10005;
ELSE
v_salary := v_salary+20007;
END IF;
UPDATE test_udt t
SET t.salary = v_salary
WHERE t.id = v_id ;
commit;
END;
/
Multiple IF ELSIF
DECLARE
v_salary NUMBER;
v_id NUMBER;
BEGIN
SELECT id,salary
INTO v_id,v_salary
FROM test_udt
WHERE id = 3;
IF v_id = 1 THEN
v_salary := 1000;
dbms_output.put_line('1 inside');
ELSIF v_id = 2 THEN
v_salary := 2000;
dbms_output.put_line('2 inside');
ELSIF v_id = 3 THEN
v_salary := 3000;
dbms_output.put_line('3 inside');
ELSIF v_id = 4 THEN
v_salary := 4000;
dbms_output.put_line('4 inside');
END IF;
UPDATE test_udt t
SET t.salary = v_salary
WHERE t.id = v_id ;
commit;
END;
/
LOOP
--syntax
LOOP
--statements
--increment
--exit statement
END LOOP;
DECLARE
i NUMBER := 1;
x VARCHAR2(3);
BEGIN
LOOP
x := lpad(i,3,'0');
dbms_output.put_line('x value : '|| x);
INSERT INTO prod_details VALUES(i, 'Product '||i);
EXIT WHEN i >900;
i := i+1;
IF MOD(i,100) = 0 THEN
commit;
dbms_output.put_line('commit executed');
END IF;
END LOOP;
END;
FOR LOOP
BEGIN
FOR I in 1..5
LOOP
Dbms_output.put_line('The value of i : '||i);
END LOOP;
END;
/
BEGIN
FOR I in REVERSE 14..50
LOOP
Dbms_output.put_line('The value of i : '||i);
END LOOP;
END;
/
WHILE LOOP
DECLARE
i_val NUMBER:=0;
BEGIN
WHILE (i_val < 11)
LOOP
dbms_output.put_line('The value of I is '||i_val);
i_val := i_val + 1;
END LOOP;
END;
/
sample output:
The value of I is 0
The value of I is 1
The value of I is 2
The value of I is 3
The value of I is 4
The value of I is 5
The value of I is 6
The value of I is 7
The value of I is 8
The value of I is 9
The value of I is 10
0 Add a comment
OCT
21
Bulk Collect
You can use bulk collect in both dynamic and static sql.
You can use bulk collect in select, fetch into and returning into clauses.
SQL engine automatically initializes and extends the collections you reference
in the bulk collect clause.
You can fetch into multiple collections with one column each.
You can use the limit clause of bulk collect to restrict the no of rows
retrieved.
DECLARE
TYPE alldata_typ IS TABLE OF product_details%ROWTYPE;
dta alldata_typ;
CURSOR proddt_cur IS
SELECT * FROM product_details;
BEGIN
OPEN proddt_cur;
FETCH proddt_cur BULK COLLECT
INTO dta;
CLOSE proddt_cur;
DECLARE
TYPE alldata_typ IS TABLE OF product_details%ROWTYPE;
dta alldata_typ;
BEGIN
SELECT * BULK COLLECT INTO dta FROM product_details;
FOR i IN dta.FIRST .. dta.LAST LOOP
dbms_output.put_line(dta(i).p_name || ' department id is ' || dta(i).p_id);
END LOOP;
END;
DECLARE
TYPE alldata_typ IS TABLE OF product_details%ROWTYPE;
dta alldata_typ;
CURSOR proddt_cur IS
SELECT * FROM product_details;
BEGIN
OPEN proddt_cur;
FETCH proddt_cur BULK COLLECT
INTO dta LIMIT 30;
CLOSE proddt_cur;
DECLARE
TYPE alldata_typ1 IS TABLE OF product_details.p_id%TYPE;
TYPE alldata_typ2 IS TABLE OF product_details.p_name%TYPE;
dta1 alldata_typ1;
dta2 alldata_typ2;
CURSOR proddt_cur IS
SELECT p_id, p_name FROM product_details;
BEGIN
OPEN proddt_cur;
FETCH proddt_cur BULK COLLECT
INTO dta1, dta2;
CLOSE proddt_cur;
END;
/
0 Add a comment
OCT
21
Ref Cursor
This is unconstrained cursor which will return different types depends upon the
user input.
Ref cursors cannot be closed implicitly.
Ref cursor with return type is called strong cursor.
Ref cursor without return type is called weak cursor.
You can declare ref cursor type in package spec as well as body.
You can declare ref cursor types in local subprograms or anonymous blocks.
DECLARE
dep_det_c SYS_REFCURSOR;
tab_data dep_details%ROWTYPE;
BEGIN
ref_c_sp(dep_det_c);
LOOP
FETCH dep_det_c INTO tab_data;
EXIT WHEN dep_det_c%NOTFOUND;
dbms_output.put_line('Department Name : '|| tab_data.d_name);
END LOOP;
CLOSE dep_det_c;
END;
/*sample output*/
0 Add a comment
OCT
21
Cursor
SQL Private work Area where the query get passed and executed.
Types
******
Implicit(SQL)
Explicit
-->-- advanced cursor types --<--
Parametrized Cursor
Ref Cursor
Implicit
********
ORACLE implicitly opens a cursor to process each SQL statement not associated
with an explicitly declared cursor.
PL/SQL lets you refer to the most recent implicit cursor as the SQL� cursor.
So, although you cannot use the OPEN,
FETCH, and CLOSE statements to control an implicit cursor, you can still use
cursor attributes to access information
about the most recently executed SQL statement.
Cursor Stages
**************
OPEN cursor_name
FETCH (with in loop)
CLOSE cursor_name
Explicit
The set of rows returned by a query can consist of zero, one, or multiple rows,
depending on how many rows meet your search criteria. When a query returns
multiple rows,
you can explicitly define a cursor to process the rows. You use three commands
to control the cursor
Cursor Attributes
*****************
%FOUND
%NOTFOUND
%ISOPEN
%ROWCOUNT
%BULK_ROWCOUNT --<-- used to handle error while using bulk collection.
%BULK_EXCEPTIONS --<-- used to handle error while using bulk collection.
Cursor Declaration
DECLARE
CURSOR <cursor_name>
IS
<SELECT statement>
BEGIN
--> some stmt
END;
/
Cursor Loop
Loop
While Loop
For Loop
Cursor Clauses
Return
For update
Where current of
Bulk collect
BEGIN
FOR i IN 1 .. 75 LOOP
INSERT INTO product_details VALUES (i, 'prod_name_' || i, SYSDATE + i);
END LOOP;
commit;
END;
---------------------------------------------
p_id p_name p_order_dt
---------------------------------------------
1 prod_name_1 10/11/2014 3:48:32 PM
2 prod_name_2 10/12/2014 3:48:32 PM
3 prod_name_3 10/13/2014 3:48:32 PM
4 prod_name_4 10/14/2014 3:48:32 PM
5 prod_name_5 10/15/2014 3:48:32 PM
6 prod_name_6 10/16/2014 3:48:32 PM
7 prod_name_7 10/17/2014 3:48:32 PM
8 prod_name_8 10/18/2014 3:48:32 PM
9 prod_name_9 10/19/2014 3:48:32 PM
10 prod_name_10 10/20/2014 3:48:32 PM
11 prod_name_11 10/21/2014 3:48:32 PM
12 prod_name_12 10/22/2014 3:48:32 PM
13 prod_name_13 10/23/2014 3:48:32 PM
14 prod_name_14 10/24/2014 3:48:32 PM
15 prod_name_15 10/25/2014 3:48:32 PM
16 prod_name_16 10/26/2014 3:48:32 PM
17 prod_name_17 10/27/2014 3:48:32 PM
18 prod_name_18 10/28/2014 3:48:32 PM
19 prod_name_19 10/29/2014 3:48:32 PM
20 prod_name_20 10/30/2014 3:48:32 PM
---------------------------------------------
----------------------------------------------
Implicit Cursor
----------------------------------------------
----------------------------------------------
Explicit Cursor
----------------------------------------------
**********************************************
Processing cursor data by using LOOP
**********************************************
DECLARE
all_data product_details%ROWTYPE;
--cursor declaration
CURSOR prod_detail_cur IS
SELECT * FROM product_details
WHERE ROWNUM <=5;
BEGIN
OPEN prod_detail_cur;
LOOP
FETCH prod_detail_cur
INTO all_data;
EXIT WHEN prod_detail_cur%NOTFOUND; --<-- if next record not found means
control will come out from the loop
dbms_output.put_line('Product id : ' || all_data.p_id ||
' Product Name : ' || all_data.p_name ||
' ( Orderd on : ' || TRIM(all_data.p_order_dt) ||
' )');
END LOOP;
CLOSE prod_detail_cur;
END;
/*sample output*/
/*sample output*/
DECLARE
all_data product_details%ROWTYPE;
--cursor declaration
CURSOR prod_detail_cur IS
SELECT * FROM product_details
WHERE ROWNUM <=5;
BEGIN
OPEN prod_detail_cur;
LOOP
FETCH prod_detail_cur
INTO all_data;
EXIT WHEN prod_detail_cur%NOTFOUND;
dbms_output.put_line('Product id : ' || all_data.p_id ||
' Product Name : ' || all_data.p_name ||
' ( Orderd on : ' || TRIM(all_data.p_order_dt) ||
' )');
END LOOP;
CLOSE prod_detail_cur;
IF prod_detail_cur%ISOPEN THEN
CLOSE prod_detail_cur;
dbms_output.put_line('prod_detail_cur cursor closed');
ELSE
dbms_output.put_line('prod_detail_cur cursor Already closed');
END IF;
END;
/*sample output*/
Product id : 1 Product Name : prod_name_1 ( Orderd on : 11-OCT-14 )
Product id : 2 Product Name : prod_name_2 ( Orderd on : 12-OCT-14 )
Product id : 3 Product Name : prod_name_3 ( Orderd on : 13-OCT-14 )
Product id : 4 Product Name : prod_name_4 ( Orderd on : 14-OCT-14 )
Product id : 5 Product Name : prod_name_5 ( Orderd on : 15-OCT-14 )
prod_detail_cur cursor Already closed
DECLARE
all_data product_details%ROWTYPE;
--cursor declaration
CURSOR prod_detail_cur IS
SELECT * FROM product_details
WHERE ROWNUM <=5;
BEGIN
OPEN prod_detail_cur;
LOOP
FETCH prod_detail_cur
INTO all_data;
EXIT WHEN prod_detail_cur%NOTFOUND;
dbms_output.put_line('Product id : ' || all_data.p_id ||
' Product Name : ' || all_data.p_name ||
' ( Orderd on : ' || TRIM(all_data.p_order_dt) ||
' )');
END LOOP;
-->-- CLOSE prod_detail_cur;
IF prod_detail_cur%ISOPEN THEN
CLOSE prod_detail_cur;
dbms_output.put_line('prod_detail_cur cursor closed');
ELSE
dbms_output.put_line('prod_detail_cur cursor Already closed');
END IF;
END;
/*sample output*/
**********************************************
Processing cursor data by using WHILE LOOP
**********************************************
DECLARE
all_data product_details%ROWTYPE;
--cursor declaration
CURSOR prod_detail_cur IS
SELECT * FROM product_details WHERE ROWNUM <= 5;
BEGIN
OPEN prod_detail_cur;
FETCH prod_detail_cur
INTO all_data;
WHILE prod_detail_cur%FOUND LOOP
/*sample output*/
************************************************************
Processing cursor data by using FOR LOOP - CURSOR FOR LOOP
************************************************************
DECLARE
--cursor declaration
CURSOR prod_detail_cur IS
SELECT * FROM product_details WHERE ROWNUM <= 5;
BEGIN
FOR i IN prod_detail_cur
LOOP
dbms_output.put_line('Product id : ' || i.p_id ||
' Product Name : ' || i.p_name ||
' ( Orderd on : ' || TRIM(i.p_order_dt) || ' )');
END LOOP;
END;
/*sample output*/
Parameterized Cursor
*********************
This was used when you are going to use the cursor in more than one place with
different values for the same where clause.
Cursor parameters must be in mode.
Cursor parameters may have default values.
The scope of cursor parameter is within the select statement.
BEGIN
INSRT INTO dep_details VALUES(001,'Admin',1010);
INSRT INTO dep_details VALUES(002,'HR',1010);
INSRT INTO dep_details VALUES(003,'Sales',1020);
INSRT INTO dep_details VALUES(004,'Marketing',1020);
commit;
END;
----------------------------
d_id d_name location_id
----------------------------
1 Admin 1010
2 HR 1010
3 Sales 1020
4 Marketing 1020
----------------------------
DECLARE
-->--Declaring parameterized cursor
CURSOR dep_det_c(p_location_id NUMBER) IS
SELECT * FROM dep_details d WHERE d.location_id = p_location_id;
all_data dep_details%ROWTYPE;
BEGIN
dbms_output.put_line('-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-');
OPEN dep_det_c(1010);
LOOP
FETCH dep_det_c
INTO all_data;
EXIT WHEN dep_det_c%NOTFOUND;
dbms_output.put_line('Department id : ' || all_data.d_id ||
' Department Name : ' || all_data.d_name);
END LOOP;
CLOSE dep_det_c;
dbms_output.put_line('-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-');
-->-- opening same cursor with different input value
OPEN dep_det_c(1020);
LOOP
FETCH dep_det_c
INTO all_data;
EXIT WHEN dep_det_c%NOTFOUND;
dbms_output.put_line('Department id : ' || all_data.d_id ||
' Department Name : ' || all_data.d_name);
END LOOP;
CLOSE dep_det_c;
dbms_output.put_line('-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-');
END;
/
/*sample output*/
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
Department id : 1 Department Name : Admin
Department id : 2 Department Name : HR
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
Department id : 3 Department Name : Sales
Department id : 4 Department Name : Marketing
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
Posted 21st October 2014 by Unknown
0 Add a comment
OCT
21
Handling Exception
ERROR
Any departure from the expected behavior of the system or program,
which stops the working of the system is an error.
Handling Exception
When exception is raised, control passes to the exception section of the block.
i.e. EXCEPTION
WHEN name_of_exception THEN
Predefined Exception
*********************
Oracle has predefined several exceptions that correspond to the most common
oracle errors.
------------------------------------------------------------------------
Exception Oracle Error SQL Code Value
------------------------------------------------------------------------
DECLARE
v_result NUMBER;
BEGIN
SELECT 23 / 0 INTO v_result FROM dual;
EXCEPTION
WHEN ZERO_DIVIDE THEN
dbms_output.put_line('Divisor is equal to zero');
END;
Single row SELECT returned no rows or your program referenced a deleted element
in a nested table
or an uninitialized element in an associative array (index-by table).
DECLARE
v_id NUMBER;
BEGIN
SELECT id INTO v_id FROM test_tb;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('There is no data inside the table');
END;
BEGIN
INSERT INTO test_tb VALUES (2);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
dbms_output.put_line('Duplicate values are not allowed');
END;
DECLARE
v_id NUMBER;
BEGIN
SELECT id INTO v_id FROM test_tb;
EXCEPTION
WHEN TOO_MANY_ROWS THEN
dbms_output.put_line('Query returning more than one row');
END;
DECLARE
num1 NUMBER(2);
BEGIN
num1 := 345;
EXCEPTION
WHEN VALUE_ERROR THEN
dbms_output.put_line('check the size of the variable');
END;
BEGIN
INSERT INTO emp VALUES(1,'Name1');
INSERT INTO emp VALUES(2,'Name2');
INSERT INTO emp VALUES(3,'Name3');
INSERT INTO emp VALUES(4,'Name4');
COMMIT;
END;
DECLARE
cursor emp_c IS
SELECT * FROM emp;
all_data emp%ROWTYPE;
BEGIN
OPEN emp_c;
OPEN emp_c;
NULL;
CLOSE emp_c;
EXCEPTION
WHEN CURSOR_ALREADY_OPEN THEN
dbms_output.put_line('Cursor already opened');
END;
DECLARE
v_result NUMBER;
BEGIN
SELECT 23 / 0 INTO v_result FROM dual;
EXCEPTION
WHEN CURSOR_ALREADY_OPEN THEN
dbms_output.put_line('Cursor already opened');
WHEN OTHERS THEN
dbms_output.put_line('Some other error ' || SQLERRM);
END;
DECLARE
v_gender CHAR := '&gender';
gender_ex EXCEPTION;
BEGIN
IF v_gender NOT IN ('M', 'F', 'm', 'f') THEN
RAISE gender_ex;
END IF;
dbms_output.put_line('Gender : '||v_gender);
EXCEPTION
WHEN gender_ex THEN
dbms_output.put_line('Please Enter valid gender');
END;
DECLARE
abort_ex EXCEPTION;
BEGIN
FOR i IN 1..100
LOOP
BEGIN
IF mod(i,10)=0 THEN
RAISE abort_ex;
END IF;
INSERT INTO test_insert VALUES(i, 'Name'||i);
EXCEPTION
WHEN abort_ex THEN
NULL;
END;
END LOOP;
COMMIT;
END;
SQLCODE returns the current error code, and SQLERRM returns the current error
message text;
For user-defined exception SQLCODE returns 1 and SQLERRM returns �user-defined
exception�.
SQLERRM will take only negative value except 100. If any positive value other
than 100 returns non-oracle exception.
DECLARE
v_id NUMBER;
BEGIN
SELECT id INTO v_id FROM test_tb;
dbms_output.put_line(v_id);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('SQLERRM : ' || SQLERRM);
dbms_output.put_line('SQLCODE : ' || SQLCODE);
END;
/*sample output*/
PRAGMA EXCEPTION_INIT
*********************
Using this you can associate a named exception with a particular oracle error.
This gives you the ability to trap this error specifically, rather than via an
OTHERS handler.
Syntax:
DECLARE
v_result NUMBER;
PRAGMA EXCEPTION_INIT(Invalid, -1476);
BEGIN
SELECT 453 / 0 INTO v_result FROM dual;
dbms_output.put_line('Result : ' || v_result);
EXCEPTION
WHEN INVALID THEN
dbms_output.put_line('Invalid Exception');
END;
RAISE_APPLICATION_ERROR
************************
You can use this built-in function to create your own error messages, which can
be more descriptive than named exceptions.
Error Number :
DECLARE
v_gender CHAR := '&gender';
BEGIN
IF v_gender NOT IN ('M', 'F', 'm', 'f') THEN
RAISE_APPLICATION_ERROR(-20003, 'Enter valid gender');
END IF;
dbms_output.put_line('Gender : ' || v_gender);
END;
1 View comments
Loading
Dynamic Views theme. Powered by Blogger.