Tuesday, September 4, 2007

MANIPULATING LARGE OBJECT

MANIPULATING BFILE

/*Grant the directory creation prioviledge to scott */
GRANT CREATE ANY DIRECTORY TO SCOTT;
GRANT DROP ANY DIRECTORY TO SCOTT;

/*create a file into scott which hold the bfile*/
CREATE TABLE HOLD(NAME BFILE);

/*directory information are stored in the table */
select * from DBA_DIRECTORIES;
select * from ALL_DBA_DIRECTORIES;

/*CREATE A PHYSICAL DIRECTORY IN E:/ARKA/ABC */

/*CREATE DIRECTORY*/
CREATE DIRECTORY ABC AS 'E:/ARKA/ABC';

/*GRANTING FOR PRIVILEDGE TO READ DIRECTORY OBJECT TO THE USER*/
GRANT READ ON DIRECTORY ABC TO PUBLIC;

/*ADDING BFILE*/
insert into hold values(bfilename('abc','cat.wmv'));
insert into hold values(bfilename('abc','kyo2.gif'));
insert into hold values(bfilename('abc','moustache.jpg'));
insert into hold values(bfilename('abc','10roses.pps'));

/**/
SELECT * FROM HOLD;
/*it returns error because sql* plus cannot open any gif or....*/

MANIPULATING EXTERNAL LOB
-----------------------------------------------------
/*LOB */
/*create the directory in the physical path*/
create or replace directory LOB_SOURCE as 'e:/arka/abc';
/*create a physical file in that named "lobfile.txt"*/
/*create a table which hold the clob file*/
create table lob_tab ( the_lob clob );

/*procedure to fecth the file length*/
declare
v_lob clob;
l_bfile bfile;
buf raw(32767);
vc varchar2(32767);
amt number;
v_offset number := 1;
begin
l_bfile := bfilename( 'LOB_SOURCE', 'lobfile.txt' );
insert into lob_tab (the_lob) values ( empty_clob() )
returning the_lob into v_lob;
amt := dbms_lob.getlength( l_bfile );
dbms_lob.fileopen( l_bfile ,dbms_lob.file_readonly);
dbms_lob.read(l_bfile,amt,v_offset,buf);
vc := utl_raw.cast_to_varchar2(buf);
dbms_lob.writeappend(v_lob,amt,vc);
dbms_output.put_line('File length is: '||dbms_lob.getlength( l_bfile ));
dbms_output.put_line('Loaded length is: '||dbms_lob.getlength(v_lob));
dbms_lob.fileclose( l_bfile );
end;
/
-------------------------------------------------------------------------------------------------------------------------------
MANIPULATING INTERNAL LOB

/*CREATING A TABLE CARRYING A LOB VALUE*/
create table lob_exa(name varchar2(10),resume clob);

/*INSERTING DATA INTOLOB */
insert into lob_exa values('arka','B.tech engineer passout from west bengal university of technology. in 2007 . hometown Chandernagore');

/*DECLARING A CLOB WITHOUT ASSIGNING A VALUE INTO IT*/
insert into lob_exa values('Dibyendu',empty_clob());

/*ASSIGNING DATA TO EMPTY_CLOB()*/
UPDATE LOB_EXA
SET RESUME='B.COM FROM RISHI BANKIM COLLEGE. HOMETOWN CHUCHURA'
WHERE NAME= 'Dibyendu';

/*APPNEDING TO LOB(FOR INSERTING DBMS_LOB.WRITE(LOBLOC,AMOUNT,OFFSET,TEXT)*/
DECLARE
LOBLOC CLOB;
TEXT VARCHAR2(32767):='NATIONALITY INDIAN';
OFFSET INTEGER;
AMOUNT NUMBER;
BEGIN
SELECT RESUME INTO LOBLOC
FROM LOB_EXA WHERE NAME='Dibyendu' FOR UPDATE;
OFFSET:=DBMS_LOB.GETLENGTH(LOBLOC)+2;
AMOUNT:=LENGTH(TEXT);
DBMS_LOB.WRITEAPPEND(LOBLOC,AMOUNT,TEXT);
COMMIT;
END;

TRIGGER

TRIGGER
*****used table for creating trigger**********
create table trig_test(order1 char);

------------------------------------------------------
a simple "DML STATEMENT TRIGGER"trigger

create or replace trigger trig1 before insert or delete or update on stud
begin
if inserting then insert into trig_test values('I');
elsif deleting then insert into trig_test values('d');
elsif updating then insert into trig_test values('U');
end if;
end;
/
-------------------------------------------------------
checking the trigger
insert into stud(roll) values(20);
insert into stud(roll) values(30);
select * from trig_test;
update stud set roll=10 where roll=20;
delete from stud where roll=10;
select * from trig_test;

----------------------------------------------------------
used table and values
insert into stud values('arka',1,'16-may-1985');
insert into stud values('dibyendu',2,'29-dec-1982');
insert into stud values('gora',3,'21-may-1989');
create table oldstud(name varchar2(20),roll number(5),dob date);
---------------------------------------------------------
A SIMPLE "DML ROW LEVEL TRIGGER"
create or replace trigger trig2 after delete or insert or update on stud for each row
begin
if inserting then
dbms_output.put_line('one row inserted');
elsif deleting then
insert into oldstud values(:old.name,:old.roll,:old.dob);
dbms_output.put_line('one row deleted');
elsif updating then
insert into oldstud values(:old.name,:old.roll,:old.dob);
dbms_output.put_line('one row updated');
end if;
end;
/

insert into stud values('india',6,'15-aug-1947');
update stud set roll=10 where name='arka';
---------------------------------------------------------------
Managing trigger
-----------disable or enable trigger-----
alter trigger trig1 disable;
alter trigger trig1 enable;

-----------disable or enable all trigger on a table ---------
alter table stud disable all triggers;
alter table stud enable all triggers;

----recompile trigger-----------------------
alter trigger trig1 compile;

-------drop trigger-----------
drop trigger trig1;
------------------------------------------------------
LOGON LOGOF TRIGGER
used table
create table LOGIN_CHECKER(a varchar2(20));

CREATE OR REPLACE TRIGGER logged
AFTER LOGON ON SCHEMA
begin
INSERT INTO LOGIN_CHECKER VALUES('T');
end;

CREATE OR REPLACE TRIGGER log_out
AFTER LOGON ON SCHEMA
begin
INSERT INTO LOGIN_CHECKER VALUES('F');
end;

--------------------------------------------------
CALL statement
used procedure

CREATE OR REPLACE PROCEDURE PROC_TRIG IS
BEGIN
INSERT INTO LOGIN_CHECKER VALUES('INSERTED');
END;

TRIGGER BODY

CREATE OR REPLACE TRIGGER CALL_TRIG
AFTER INSERT ON STUD FOR EACH ROW
CALL PROC_TRIG
/

INSERTING VALUES
INSERT INTO STUD(ROLL) VALUES(78);

CHECKING
SELECT * FROM LOGIN_CHECKER;

--------------------------------------------------
controlling sesurity through trigger

CREATE OR REPLACE trigger SECU_STUD
BEFORE INSERT ON STUD FOR EACH ROW
BEGIN IF(TO_CHAR(SYSDATE,'DY') IN ('SAT','FRI')) THEN
RAISE_APPLICATION_ERROR(-20503,'Please Do not change the value it is problemetic for Arka');
end if;
end;

now check
insert into stud(roll) values(145);
--------------------------------------------------

Function

Function

create or replace FUNCTION f1 (a1 number)
RETURN
varchar IS
a number;
v varchar2(25);
BEGIN
select ename into v from emp where empno=a1;
RETURN v;
END ;

**** To exec the fun ****

select f1(7369) from dual;

**** Func with select and boolean and exception****

create or replace FUNCTION f1 (a1 number)
RETURN
boolean IS
v varchar2(25);
t1 boolean;
BEGIN
select ename into v from emp where empno=a1;
if v='SMITH' then
return TRUE;
end if;

exception
when no_data_found then
return FALSE;
END ;

**** To exec the fun ****

declare
t2 boolean;
begin
t2:=f1(7368);
if t2 then
dbms_output.put_line('found');
else
dbms_output.put_line('not found');
end if;
end;

Procedure

Procedure
/*A SIMPLE PROCEDURE*/
CREATE OR REPLACE PROCEDURE showname
IS
BEGIN
DELETE FROM STUD
WHERE ROLL=6;
END;
-------------------------------------------
CALLING PROCEDURE FROM SQL* PLUS
EXECUTE SHOWNAME;

CALLING PROCEDURE FROM PL/SQL BLOCK

BEGIN
SHOWNAME;
END;

---------------------------------------------
/*NORMAL PARAMETERIZE PROCEDURE(USING IN PARAMETER)*/
CREATE OR REPLACE PROCEDURE INS
(A IN STUD.ROLL%TYPE)
IS
BEGIN
INSERT INTO STUD(ROLL) VALUES(A);
END INS;
---------------------------------------------
/*PARAMETERIZE PROCEDURE 2 (USING OUT PARAMETER)*/
CREATE OR REPLACE PROCEDURE SHOWTAB
(A IN EMP.ENAME%TYPE,B OUT EMP.JOB%TYPE,C OUT EMP.SAL%TYPE)
IS
BEGIN
SELECT JOB,SAL INTO B,C FROM EMP WHERE ENAME=A;
DBMS_OUTPUT.PUT_LINE(B||' '||C);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('sORRY THE PERSON YOU HAVE ENTERED IS NOT AN EMPLOYEE');
END SHOWTAB;

/*show output*/
declare
x varchar2(30):='&Name';
y varchar2(10);
z number(5);
begin
showtab(x,y,z);
end;

---------------------------------------------
/*PARAMETERIZE PROCEDURE 2 (USING IN OUT PARAMETER)*/
CREATE OR REPLACE PROCEDURE PHONE
(PHNO IN OUT VARCHAR2)
IS
BEGIN
PHNO:='('||SUBSTR(PHNO,1,3)||')'||SUBSTR(PHNO,4,4)||'-'||SUBSTR(PHNO,8);
END PHONE;

/*SHOW OUTPUT*/
DECLARE
PH_NO varchar2(25):='&PHONE_NUMBER';
BEGIN
PHONE(PH_NO);
DBMS_OUTPUT.PUT_LINE(PH_NO);
END;
/

---------------------------------------------
/*PROCEDURE USING DEFAULT PARAMETER*/
CREATE OR REPLACE PROCEDURE ADD_STUD
(SNAME IN STUD.NAME%TYPE DEFAULT 'NOONE',SROLL IN STUD.ROLL%TYPE DEFAULT 99,SDOB IN STUD.DOB%TYPE)
IS
BEGIN
INSERT INTO STUD(NAME,ROLL,DOB) VALUES(SNAME,SROLL,SDOB);
END ADD_STUD;
/

/*SHOW OUTPUT*/
DECLARE
A STUD.NAME%TYPE:='&NAME';
B STUD.ROLL%TYPE:=&ROLL;
C STUD.DOB%TYPE:='&DATE';
BEGIN
ADD_STUD(A,B,C);
END;

---------------------------------------------
/*CALLING A PROCEDURE FROM ANOTHER PROCEDURE*/
CREATE OR REPLACE PROCEDURE PROC1
IS
CURSOR EMP_CUR IS
SELECT EMPNO
FROM EMP;
BEGIN
FOR EMP_REC IN EMP_CUR
LOOP
INS(EMP_REC.EMPNO);
END LOOP;
COMMIT;
END PROC1;
/
---------------------------------------------

/*REMOVING PROCEDURE*/
DROP PROCEDURE PROC1;

Exception Handling

Exception Handling
declare
A NUMBER(2):=0;
B NUMBER(2):=0;
C NUMBER(2);
begin
C:=A/B;
DBMS_OUTPUT.PUT_LINE('THE DIVISOR YOU GAVE IS ZERO');
DBMS_OUTPUT.PUT_LINE(C);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('THERE IS AN ERROR');
commit;
end;
/
-----------------------------------------------
CREATE TABLE STUD(NAME VARCHAR2(30),ROLL NUMBER(5),DOB DATE,PRIMARY KEY(ROLL));
INSERT INTO STUD VALUES('ARKA',12,'16-MAY-1985');
INSERT INTO STUD VALUES('INDIA',1,'15-AUG-1947');
INSERT INTO STUD VALUES('DIBYENDU',2,'1-DEC-2007');

--------------------------------------------------------------------
/*NO_DATA_FOUND EXCEPTION*/
DECLARE
A VARCHAR2(10);
BEGIN
SELECT NAME INTO A FROM STUD WHERE NAME='STG';
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('SORY NO DATA IS FOUND');
END;
/
--------------------------------------------------

/*USER DEFINE EXCEPTION(USING "RAISE" STATEMENT)*/
DECLARE
INVALID EXCEPTION;
a number:=&x;
BEGIN
if a>20 THEN
insert into stud(roll) values(a);
else
RAISE INVALID;
END IF;
COMMIT;
EXCEPTION
WHEN INVALID THEN
DBMS_OUTPUT.PUT_LINE('SORY INVALID NUMBER');
END;
/

--------------------------------------------------
integrity constant violation (using PRAGMA)

define a=10
DECLARE
EX EXCEPTION;
PRAGMA EXCEPTION_INIT(EX,-2292);
BEGIN
DELETE FROM STUD
WHERE ROLL=&A;
COMMIT;
EXCEPTION
WHEN EX THEN
DBMS_OUTPUT.PUT_LINE('CANNOT REMOVE NAME STUDENT EXST');
END;
/
--------------------------------------------------
/*EXCEPTION DECLARATION USING
RAISE_APPLICATION_ERROR----RANGE(-20000 TO -20999)*/

DECLARE
a number:=&x;
BEGIN
if a>20 THEN
insert into stud(roll) values(a);
else
RAISE_APPLICATION_ERROR(-20005,'Number greater then 20');
END IF;
COMMIT;
END;
/
--------------------------------------------------

Explicit cursor declaration

NORMAL CURSOR DECLARATION

/*USE OF OPEN,FETCH,%TYPE*/

DECLARE
CURSOR c1 IS SELECT ENAME FROM emp;
name1 emp.ENAME%TYPE;
name2 emp.ENAME%TYPE;
name3 emp.ENAME%TYPE;
BEGIN
OPEN c1;
FETCH c1 INTO name1; -- this fetches first row
DBMS_OUTPUT.PUT_LINE('ENAME:>'||NAME1);
FETCH c1 INTO name2; -- this fetches SECOND row
DBMS_OUTPUT.PUT_LINE('ENAME:>'||NAME2);
CLOSE c1;
END;
------------------------------------------------------------

/*FETCHING DATA FROM CURSOR USING for loop*/

DECLARE
name1 emp.ENAME%TYPE;
name2 emp.SAL%TYPE;
name3 emp.HIREDATE%TYPE;
CURSOR c1 IS SELECT ENAME,SAL,HIREDATE FROM emp;
BEGIN
OPEN c1;
FOR I IN 1..10
LOOP
FETCH c1 INTO NAME1,NAME2,NAME3;
DBMS_OUTPUT.PUT_LINE(' '||NAME1||' '||NAME2||' '||NAME3);
END LOOP;
CLOSE c1;
END;

------------------------------------------------------------

/*Example of %ISOPEN, %NOTFOUND,%ROWCOUNT */

DECLARE
name1 emp.ENAME%TYPE;
name2 emp.SAL%TYPE;
name3 emp.HIREDATE%TYPE;
CURSOR c1 IS SELECT ENAME,SAL,HIREDATE FROM emp;
BEGIN
IF NOT C1%ISOPEN THEN OPEN C1;
END IF;
LOOP
FETCH c1 INTO NAME1,NAME2,NAME3;
EXIT WHEN C1%ROWCOUNT>10 OR C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(' '||NAME1||' '||NAME2||' '||NAME3);
END LOOP;
close c1;
END;
------------------------------------------------------------

/*CURSOR USING %ROWTYPE*/


DECLARE
CURSOR c1 IS SELECT * FROM emp;
name1 emp%ROWTYPE;
name2 emp%ROWTYPE;
name3 emp%ROWTYPE;
BEGIN
OPEN c1;
FETCH c1 INTO name1; -- this fetches first row
DBMS_OUTPUT.PUT_LINE('ENAME:>'||NAME1.ENAME||'SAL:>'||NAME1.SAL);
FETCH c1 INTO name2; -- this fetches second row
DBMS_OUTPUT.PUT_LINE('ENAME:>'||NAME2.ENAME||'SAL:>'||NAME2.SAL);
FETCH c1 INTO name3; -- this fetches third row
CLOSE c1;

END;

------------------------------------------------------------
/*CURSOR AND RECORD*/

DECLARE
CURSOR c1 IS SELECT ENAME,SAL,HIREDATE FROM emp WHERE COMM IS NULL;
C1_REC C1%ROWTYPE;
BEGIN
OPEN C1;
LOOP
FETCH c1 INTO C1_REC;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(' '||C1_REC.ENAME||''||C1_REC.SAL||' '||C1_REC.HIREDATE);
END LOOP;
END;
------------------------------------------------------------

/*CURSOR FOR LOOP*/


DECLARE
CURSOR C1 IS
SELECT Ename,EMPNO, HIREDATE
FROM EMP
WHERE DEPTNO = 20;
BEGIN
FOR C1_DAT IN C1 LOOP
INSERT INTO STUD (NAME,ROLL,DOB)
VALUES (C1_DAT.ENAME, C1_DAT.EMPNO,C1_DAT.HIREDATE);
END LOOP;
COMMIT;
END;
/
------------------------------------------------------------

/*CURSOR FOR LOOP(A FAULTY CONDITION)*/


DECLARE
CURSOR c1 IS SELECT ENAME,SAL,HIREDATE FROM emp WHERE COMM IS NULL;
name1 emp.ENAME%TYPE;
name2 emp.SAL%TYPE;
name3 emp.HIREDATE%TYPE;
BEGIN
for C1_REC IN C1 LOOP
FETCH c1 INTO NAME1,NAME2,NAME3;
DBMS_OUTPUT.PUT_LINE(' '||NAME1||' '||NAME2||' '||NAME3);
END LOOP;
END;

Tuesday, August 14, 2007

composite Datatype

COMPOSITE DATATYPE ARE TWO TYPES
--PL/SQL Records
--PL/SQL collection
-->INDEX BY table
-->Nested Tables
-->VARRAY
-------------------------------------------------------------
***************************
DECLARATION OF PL/SQL RECORDS
***************************
DECLARE
TYPE t_Rec1Type IS RECORD (
Field1 NUMBER,
Field2 VARCHAR2(5));
TYPE t_Rec2Type IS RECORD (
Field1 NUMBER,
Field2 VARCHAR2(5));
v_Rec1 t_Rec1Type;
v_Rec2 t_Rec2Type;
BEGIN
/* Even though v_Rec1 and v_Rec2 have the same field names
and field types, the record types themselves are different.
This is an illegal assignment which raises PLS-382.
v_Rec1 := v_Rec2;*/

v_Rec1.Field1 := v_Rec2.Field1;
v_Rec2.Field2 := v_Rec2.Field2;
END;
/
----------------------------------------------------------------
***************************
RECORD USING SELECT STATEMENT
***************************
DECLARE
TYPE EMPRecord IS RECORD (
A EMP.ENAME%TYPE,
B EMP.SAL%TYPE,
C EMP.MGR%TYPE);
EMPL EMPRecord;
BEGIN
SELECT ENAME,SAL,MGR
INTO EMPL
FROM EMP
WHERE COMM = 0;
DBMS_OUTPUT.PUT_LINE('ENAME:>'||EMPL.A);
DBMS_OUTPUT.PUT_LINE('SALARY:>'||EMPL.B);
DBMS_OUTPUT.PUT_LINE('MANAGER:>'||EMPL.C);
END;

----------------------------------------------------------------
***************************
RETRIEVING DATA USING ROWTYPE
***************************
DECLARE
TYPE EMPRecord IS TABLE OF EMP%ROWTYPE INDEX BY BINARY_INTEGER;
EMPL EMPRecord;
BEGIN
SELECT *
INTO EMPL(100)
FROM EMP
WHERE COMM = 0;
DBMS_OUTPUT.PUT_LINE('ENAME:>'||EMPL(100).ENAME);
END;
------------------------------------------------------------------
***************************
USING COUNT ATTRIBUTE
***************************
DECLARE
TYPE NUMBRec IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
Numbers NUMBRec;
Total NUMBER;
BEGIN
FOR Counter IN 1..50 LOOP
Numbers(Counter) := Counter;

END LOOP;
Total := Numbers.COUNT;
DBMS_OUTPUT.PUT_LINE('THE COUNT IS :>'||TOTAL);

END;
------------------------------------------------------------------
***************************
"DELETE" STATEMENT
***************************
DECLARE
TYPE t_ValueTable IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
Val t_ValueTable;
BEGIN
Val(1) := 'One';
Val(3) := 'Three';
Val(-2) := 'Minus Two';
Val(0) := 'Zero';
Val(100) := 'Hundred';
DBMS_OUTPUT.PUT_LINE('Before DELETE, COUNT=' || Val.COUNT);
Val.DELETE(100); -- Removes 'Hundred'
DBMS_OUTPUT.PUT_LINE('After first DELETE, COUNT=' || Val.COUNT);
Val.DELETE(1,3); -- Removes 'One' and 'Three'
DBMS_OUTPUT.PUT_LINE('After second DELETE, COUNT=' || Val.COUNT);
Val.DELETE; -- Removes all remaining values
DBMS_OUTPUT.PUT_LINE('After last DELETE, COUNT=' || Val.COUNT);
END;
/
------------------------------------------------------------------
***************************
INSERTING THROUGH PL/SQL RECORD
***************************

CREATON OF TABLE BEFORE EXAMPLE
CREATE or REPLACE TABLE temp_table(CAR_COL VARCHAR2(40));

/*INSERTING using "EXIST" ATTRIBUTE*/
DECLARE
TYPE NameTable IS TABLE OF EMP.ENAME%TYPE
INDEX BY BINARY_INTEGER;
EMPL NameTable;
BEGIN
-- Insert rows into the table.
EMPL(1) := 'Scott';
EMPL(3) := 'Joanne';

-- Check to see if rows exist.
IF EMPL.EXISTS(1) THEN
INSERT INTO temp_table(char_col) VALUES('Row 1 exists!');
ELSE
INSERT INTO temp_table (char_col) VALUES('Row 1 doesn''t exist!');
END IF;

IF EMPL.EXISTS(2) THEN
INSERT INTO temp_table (char_col) VALUES('Row 2 exists!');
ELSE
INSERT INTO temp_table (char_col) VALUES('Row 2 doesn''t exist!');
END IF;
END;
/

---------------------------------------------------------------------------
***************************
USING 'FIRST'&'LAST'&'NEXT' ATTRIBUTE
***************************
DECLARE
TYPE NameTable IS TABLE OF EMP.Ename%TYPE INDEX BY BINARY_INTEGER;
Names NameTable;
IndX BINARY_INTEGER;
BEGIN
Names(43) := 'Mason';
Names(50) := 'Junebug';
Names(47) := 'Taller';

-- Assigns 43 to v_Index.
Indx := Names.FIRST;
DBMS_OUTPUT.PUT_LINE('INDEX='||Indx );

-- Assigns 47 to v_Index.
Indx := Names.NEXT(Indx);
DBMS_OUTPUT.PUT_LINE('INDEX='||Indx );

-- Assigns 47 to v_Index.
Indx := Names.PRIOR(Indx);
DBMS_OUTPUT.PUT_LINE('INDEX='||Indx );

-- Assigns 50 to v_Index.
Indx := Names.LAST;
DBMS_OUTPUT.PUT_LINE('INDEX='||Indx );

END;
---------------------------------------------------------------------------

***************************
A MORE PRACTICAL EXAMPLE
***************************
DECLARE
TYPE EMPTABLE IS TABLE OF EMP%ROWTYPE INDEX BY BINARY_INTEGER;
MYEMPTABLE EMPTABLE;
COUNTER NUMBER(3):=104;
BEGIN
FOR I IN 100..COUNTER
LOOP
SELECT * INTO MYEMPTABLE(I) FROM EMP WHERE COMM=0;
END LOOP;
FOR I IN MYEMPTABLE.FIRST..MYEMPTABLE.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(MYEMPTABLE(I).ENAME);
END LOOP;
END;
---------------------------------------------------------------------------

Control Statement using tables

****************************
Control statement1 (if)
****************************
DECLARE
NAME VARCHAR2(30);
BEGIN
SELECT ENAME
INTO NAME
FROM EMP WHERE SAL=5000;
IF NAME='KING' THEN
DBMS_OUTPUT.PUT_LINE('THE FIRST TWO LETTER OF THE MAN IS -----> ' ||SUBSTR(NAME,1,2));
END IF;
END;

--------------------------------------------------------------
****************************
Control statement2 (if-then-else-elsif)
****************************
DECLARE
NAME VARCHAR2(30);
SALARY NUMBER(5);
BEGIN
SELECT ENAME,SAL
INTO NAME,SALARY
FROM EMP WHERE SAL=5000;
IF NAME='KING' THEN
DBMS_OUTPUT.PUT_LINE('THE FIRST TWO LETTER OF THE MAN IS -----> ' ||SUBSTR(NAME,1,2));
ELSIF NAME='FORD' THEN
DBMS_OUTPUT.PUT_LINE('THE SALARY OF THE MAN IS -----> ' ||SALARY);
ELSE
DBMS_OUTPUT.PUT_LINE('SORRY NO RESULT FOUND');
END IF;
END;
--------------------------------------------------------------
****************************
CONTROL STATEMENT3(case-when-then)
****************************
DECLARE
GRD CHAR:=UPPER('&GRADE');
STD VARCHAR2(30);
BEGIN
STD:=
CASE GRD
WHEN 'A' THEN 'EXCELLENT'
WHEN 'B' THEN 'VERY GOOD'
WHEN 'C' THEN 'GOOD'
ELSE 'NO SUCH GRADE'
END;
DBMS_OUTPUT.PUT_LINE('GRADE::'||GRD||'---'||'STANDERD>>'||STD);
END;
--------------------------------------------------------------
****************************
HANDLING NULL VALUE
****************************
DECLARE
X NUMBER(3):=12;
Y NUMBER(3):=0;
BEGIN
X:=12*NULL;
IF X IS NULL THEN
DBMS_OUTPUT.PUT_LINE('THE VALUE OF X IS NULL');
ELSE
DBMS_OUTPUT.PUT_LINE('THE VALUE OF Y IS::'||Y);
END IF;
END;
--------------------------------------------------------------
****************************
USING NORMAL "LOOP-EXIT WHEN"
****************************
DECLARE
B NUMBER(5);
CNTR NUMBER(10):=1;
BEGIN
SELECT EMPNO INTO B FROM EMP WHERE SAL=5000;
LOOP
INSERT INTO STUD(ROLL) VALUES(B+CNTR);
CNTR:=CNTR+1;
EXIT WHEN CNTR>3;
END LOOP;
END;
-------------------------------------------------------------

****************************
USING NORMAL "WHILE LOOP"
****************************
DECLARE
B NUMBER(5);
CNTR NUMBER(10):=1;
BEGIN
SELECT EMPNO INTO B FROM EMP WHERE SAL=5000;
WHILE CNTR<=3
LOOP
INSERT INTO STUD(ROLL) VALUES(B+CNTR);
CNTR:=CNTR+1;
END LOOP;
END;
-------------------------------------------------------------

****************************
USING NORMAL "FOR LOOP"
****************************
DECLARE
B NUMBER(5);
CNTR NUMBER(10):=1;
BEGIN
SELECT EMPNO INTO B FROM EMP WHERE SAL=5000;
FOR CNTR IN 1..3
LOOP
INSERT INTO STUD(ROLL) VALUES(B+CNTR);
END LOOP;
END;
-------------------------------------------------------------
****************************
EXAMPLE OF NESTED LOOPS
****************************
DECLARE
B NUMBER(5);
CNTR NUMBER(10):=1;
BEGIN
SELECT EMPNO INTO B FROM EMP WHERE SAL=5000;
<>
LOOP
<>
LOOP
EXIT WHEN CNTR>3;
DBMS_OUTPUT.PUT_LINE('YOUR DATA WILL BE INSERTED'||CNTR);
CNTR:=CNTR+1;
END LOOP INNER_LOOP;
INSERT INTO STUD(ROLL) VALUES(B+CNTR);
CNTR:=CNTR+1;
EXIT WHEN CNTR>7;
END LOOP OUTER_LOOP;
END;

Interacting with Oracle Server

****************************************
USED TABLE IN EXAMPLES
*****************************************
CREATE TABLE STUD(NAME VARCHAR2(30),ROLL NUMBER(5),DOB DATE,PRIMARY KEY(ROLL));
--------------------------------------------------------
***************************
SELECT STATEMENT IN PL/SQL
***************************
SET SERVEROUTPUT ON
DECLARE
NAME VARCHAR2(30);
ID NUMBER(5);
BEGIN
SELECT ENAME,EMPNO
INTO NAME,ID
FROM EMP
WHERE SAL=5000;
DBMS_OUTPUT.PUT_LINE('ENAME->'||NAME||'***** EMPLOYEE NUMBER->'||ID);
END;
--------------------------------------------------------
***************************
ANOTHER EXAMPLE USING %TYPE ATTRIBUTE
***************************
SET SERVEROUTPUT ON
DECLARE
NAME DEPT.DNAME%TYPE;
ID DEPT.DEPTNO%TYPE;
BEGIN
SELECT DNAME,DEPTNO
INTO NAME,ID
FROM DEPT
WHERE LOC='DALLAS';
DBMS_OUTPUT.PUT_LINE('DEPARTMENT NAME->'||NAME);
DBMS_OUTPUT.PUT_LINE('DEPARTMENT NUMBER->'||ID);

END;
--------------------------------------------------------
***************************
INSERTING DATA THROUGH PL/SQL
***************************
DECLARE
STNAME VARCHAR2(30):='ARKA';
STROLL NUMBER(5):=12;
STDOB DATE:='16-MAY-1985';
BEGIN
INSERT INTO STUD
VALUES(STNAME,STROLL,STDOB);
END;
--------------------------------------------------------
***************************
UPDATING DATA THROUGH PL/SQL
***************************
DECLARE
STROLL NUMBER(5):=20;
BEGIN
UPDATE STUD
SET ROLL = STROLL
WHERE NAME='ARKA';
END;
--------------------------------------------------------
***************************
DELETING DATA THROUGH PL/SQL
***************************
DECLARE
STROLL NUMBER(5):=20;
BEGIN
DELETE FROM STUD
WHERE ROLL=STROLL;
EMP;
--------------------------------------------------------

nested block

************************************************
USING SQL FUNCTION IN PL/SQL BLOCK
************************************************
SET SERVEROUTPUT ON
DECLARE
A VARCHAR2(30):=LOWER('ARKA BHATTACHARYA');
BEGIN
DBMS_OUTPUT.PUT_LINE('THE LOWERCASE NAME ::::'||A);
DBMS_OUTPUT.PUT_LINE('THE UPPERCASE NAME ::::'||UPPER(A));
END;

---------------------------------------------------------------
************************************************
NESTED PL/SQL BLOCK
************************************************
<>
DECLARE
A NUMBER(5):=10;
B NUMBER(6):=20;
BEGIN
DECLARE
A NUMBER(5):=10;
B NUMBER(6):=20;
BEGIN
B:=A+B+OUTER.B;
DBMS_OUTPUT.PUT_LINE('THE SUM IS ' ||B);
END;
DBMS_OUTPUT.PUT_LINE('THE SUM IS ' ||B);
END;

---------------------------------------------------------------

Thursday, August 9, 2007

control statement

TO COMMENT A CODE
(--) ---->Single line comment
(/* */)-->Multiple line comment
--------------------------------------
/*GREATEST AMONG THREE (USE OF IF)*/

DECLARE
A NUMBER(2):=&A;
B NUMBER(2):=&B;
C NUMBER(2):=&C;
BEGIN
IF A>B AND A>C THEN
DBMS_OUTPUT.PUT_LINE(A||'IS LARGEST');
ELSIF B>A AND B>C THEN
DBMS_OUTPUT.PUT_LINE(B||'IS LARGEST');
ELSE
DBMS_OUTPUT.PUT_LINE(C||'IS LARGEST');
END IF;
END;
----------------------------------------
/*looping using EXIT WHEN statement*/
declare
counter number(2):=0;
begin
loop
DBMS_OUTPUT.PUT_LINE('the count is'||counter);
counter:=counter+1;
exit when counter=10;
end loop;
end;
/

----------------------------------------
/*looping using WHILE */
declare
counter number(2):=0;
begin
WHILE COUNTER<=10
loop
DBMS_OUTPUT.PUT_LINE('the count is'||counter);
counter:=counter+1;
end loop;
end;
/
-----------------------------------------
/*looping using WHILE
BUT NOT INITIALIZING THE COUNTER */

declare
counter1 number(2);
begin
WHILE COUNTER1<=10
loop
DBMS_OUTPUT.PUT_LINE('the SECOND count is'||counter1);
counter1:=counter1+1;
end loop;
end;
/
-----------------------------------------
/*looping using FOR INCREMENT SINGLE */
declare
counter1 number(2);
begin
FOR COUNTER1 IN 1..10
loop
DBMS_OUTPUT.PUT_LINE('the count is'||counter1);
end loop;
end;
/

-----------------------------------------
/*LOOPING USING GOTO*/
DECLARE
A NUMBER(2):=0;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE(A);
A:=A+1;
IF A>10 THEN
GOTO END_OF_LOOP;
END IF;
END LOOP;
<>
DBMS_OUTPUT.PUT_LINE('THE LOOP IS END');
LOOP
A:=A-1;
DBMS_OUTPUT.PUT_LINE(A);
EXIT WHEN A<=5;
END LOOP;
END;
-----------------------------------------
/*Using NULL as a statement*/
DECLARE
v NUMBER := 7;
BEGIN
IF v<5 THEN
dbms_output.put_line('less than 7');
ELSIF v>7 THEN
dbms_output.put_line('Greater than 7');
ELSE
NULL; -- Do nothing
END IF;
END;
/

Friday, August 3, 2007

control statement PL/SQL

****************************
TO COMMENT A CODE
****************************
(--) ---->Single line comment
(/* */)-->Multiple line comment
--------------------------------------
****************************
IF STATEMENT
****************************

/*GREATEST AMONG THREE (USE OF IF)*/
DECLARE
A NUMBER(2):=&A;
B NUMBER(2):=&B;
C NUMBER(2):=&C;
BEGIN
IF A>B AND A>C THEN
DBMS_OUTPUT.PUT_LINE(A||'IS LARGEST');
ELSIF B>A AND B>C THEN
DBMS_OUTPUT.PUT_LINE(B||'IS LARGEST');
ELSE
DBMS_OUTPUT.PUT_LINE(C||'IS LARGEST');
END IF;
END;
----------------------------------------
****************************
Looping using EXIT WHEN statement
****************************
declare
counter number(2):=0;
begin
loop
DBMS_OUTPUT.PUT_LINE('the count is'||counter);
counter:=counter+1;
exit when counter=10;
end loop;
end;
/

----------------------------------------
****************************
Looping using WHILE
****************************
declare
counter number(2):=0;
begin
WHILE COUNTER<=10
loop
DBMS_OUTPUT.PUT_LINE('the count is'||counter);
counter:=counter+1;
end loop;
end;
/
-----------------------------------------
****************************
Looping using WHILE BUT
NOT INITIALIZING THE COUNTER
****************************
declare
counter1 number(2);
begin
WHILE COUNTER1<=10
loop
DBMS_OUTPUT.PUT_LINE('the SECOND count is'||counter1);
counter1:=counter1+1;
end loop;
end;
/
-----------------------------------------
****************************
Looping using FOR INCREMENT SINGLE
****************************
declare
counter1 number(2);
begin
FOR COUNTER1 IN 1..10
loop
DBMS_OUTPUT.PUT_LINE('the count is'||counter1);
end loop;
end;
/

-----------------------------------------
****************************
LOOPING USING GOTO
****************************
DECLARE
A NUMBER(2):=0;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE(A);
A:=A+1;
IF A>10 THEN
GOTO END_OF_LOOP;
END IF;
END LOOP;
<>
DBMS_OUTPUT.PUT_LINE('THE LOOP IS END');
LOOP
A:=A-1;
DBMS_OUTPUT.PUT_LINE(A);
EXIT WHEN A<=5;
END LOOP;
END;
-----------------------------------------
****************************
Using NULL as a statement
****************************
DECLARE
v NUMBER := 7;
BEGIN
IF v<5 THEN
dbms_output.put_line('less than 7');
ELSIF v>7 THEN
dbms_output.put_line('Greater than 7');
ELSE
NULL; -- Do nothing
END IF;
END;
/

PL/SQL normal declaration

***********************************************
To see the output of a PL/SQL program output
***********************************************
set serveroutput on

An Complete Pl/SQl program with 3 block
DECLARE
v_StudentID NUMBER(5) := 7369; -- Numeric variable initialized
-- to 10,000
v_FirstName VARCHAR2(20); -- Variable length character string
-- with maximum length of 20
BEGIN
/* Start of executable section */
-- Retrieve first name of student with ID 10,000
SELECT ename
INTO v_FirstName
FROM emp
WHERE empno=v_StudentID;
dbms_output.put_line (v_Firstname);
EXCEPTION
/* Start of exception section */
WHEN NO_DATA_FOUND THEN
-- Handle the error condition
dbms_output.put_line ('There is an error');
END;


****************************************************
Using BIND Variable
****************************************************
set serveroutput on
VARIABLE g_salary NUMBER
BEGIN
SELECT sal
INTO :g_salary
FROM emp
WHERE ename = 'SMITH';
END;
/
PRINT g_salary

******************************************************
Using Non PL/SQL variable
******************************************************
set serveroutput on
VARIABLE g_monthly_sal NUMBER
DEFINE p_annual_sal = 50000
SET VERIFY OFF
DECLARE
v_sal NUMBER(9,2) := &p_annual_sal;
BEGIN
:g_monthly_sal := v_sal/12;
END;
/
PRINT g_monthly_sal
*****************************************************

****************************************************
DECLARATION OF VARIABLE
****************************************************
set serveroutput on buffer 25600000
DECLARE
a varchar2(30):='Arka Bhattacharya';
b number(3):=10;
c date:= '15-sep-1999';
C1 DATE := SYSDATE + 7;
d NUMBER(6) DEFAULT 100;
e VARCHAR2(30) NOT NULL := 'Oxford';
f char:='P';
g long:=3200;
h BINARY_INTEGER:=1;
I CONSTANT NUMBER(3,2) := 8.25;
J BOOLEAN NOT NULL := TRUE;
K emp.ename%TYPE;
l b%TYPE:=10;
m boolean := FALSE;
BEGIN
DBMS_OUTPUT.PUT_LINE(a);
end;
--------------------------------------------------------------------

****************************************************
DETAILED EXAMPLE
****************************************************
DECLARE
a varchar2(20):='Arka Bhattacharya';
b number(3):=10;
c date:= '15-sep-1999';
C1 DATE := SYSDATE + 7;
d NUMBER(6) DEFAULT 100;
e VARCHAR2(30) NOT NULL := 'Oxford';
f char:='P';
g long:=3200;
h BINARY_INTEGER:=1;
I CONSTANT NUMBER(3,2) := 8.25;
K emp.ename%TYPE:='SMITH';
l b%TYPE:=10;
BEGIN
DBMS_OUTPUT.PUT_LINE(a);
DBMS_OUTPUT.PUT_LINE(b);
DBMS_OUTPUT.PUT_LINE(c);
DBMS_OUTPUT.PUT_LINE(c1);
DBMS_OUTPUT.PUT_LINE(d);
DBMS_OUTPUT.PUT_LINE(e);
DBMS_OUTPUT.PUT_LINE(f);
DBMS_OUTPUT.PUT_LINE(g);
DBMS_OUTPUT.PUT_LINE(h);
DBMS_OUTPUT.PUT_LINE(i);
DBMS_OUTPUT.PUT_LINE(K);
DBMS_OUTPUT.PUT_LINE(L);

end;
*******************************************************

Books on Oracle

oracle 9i dba fundamental1
http://www.esnips.com/doc/84f85f55-0f0d-49e4-9eea-2f84241c9a70/Oracle-9i-Fundamentals-I

oracle 9i dba fundamental 2
http://www.esnips.com/doc/da8a4241-c39d-4e97-956c-3d4da843ca11/Oracle-9i-Fundamentals-II

oracle sql
http://www.esnips.com/doc/770497fe-5158-422f-a801-a6fe6c2dd64d/Oracle-RDBMS--SQL-Tutorial-(Very-good)

oracle pl/sql
http://www.esnips.com/doc/f9f628fd-8c1d-40a5-9b5f-cdb1c1a2467d/Oracle-9i---Introduction-to-oracle-9i-PL-SQL---Part-1
http://www.esnips.com/doc/f69ad628-85dc-4c90-9242-ea5dff7cc026/Oracle-9i---Introduction-to-oracle-9i-PL-SQL---Part-2
http://www.esnips.com/doc/d268649f-4bb7-4d2a-8fe8-b8016a233da0/Oracle-9i---Introduction-to-oracle-9i-PL-SQL---Part-3

oracle9i sql

http://www.esnips.com/doc/fdcd6521-7fa3-49f4-ba29-62a4d23e0928/Oracle-9i-Introduction-To-SQL-Part-I
http://www.esnips.com/doc/5f9a7fb5-8d78-4d0a-ac3a-195425bb88a4/Oracle-9i-Introduction-To-SQL-Part-II
http://www.esnips.com/doc/5f35561d-c985-4719-b4c1-c8739cd38afd/Oracle-9i-Advanced-SQL-vol2

oracle 9i performance tuning
http://www.esnips.com/doc/34b4f388-9f5c-48a8-8365-bebc0954819c/Oracle-9i-Performance-and-Tuning-Volume-1
http://www.esnips.com/doc/7c073f29-0263-48f3-b8b0-22d3385659d2/Oracle-9i-Performance-and-Tuning-Volume-2

Wednesday, August 1, 2007

Some good problem


***************************
Some good problem
***************************

  1. Display MGR and ENAME from EMP table.
  2. Display the records where the job is either SALESMAN or DEPT NO =20.
  3. Display the record where MGR is blank.
  4. Display all the records where names begin with ‘A’.
  5. Display the records whose ENAME begins with the letter in between ‘K’ to ‘M’.
  6. Display all the records whose ENAME contain 5 characters.
  7. Display total number of employees department wise.
  8. Display the department that contains maximum employees.
  9. Display the employee who getting maximum salary.
  10. Display the last 4 character of each employee
  11. Display the year and the total number of employee hired during a year.
  12. Display the year and the total number of employee for the year in which maximum numbers of employee were hired.
  13. Display the record for all employees who have the same job as EMP NO=7838.
  14. Display all the records where job contain the letter “E”
  15. Display the record where the salary of the employee is greater than the salary obtained by ‘TURNER”
  16. Select all employee who are either ‘clerk’ or ‘salesman’ and have salary greater than 1500.
  17. Select all the employee whose names start with ‘Th’ or ‘Lh’.
  18. Display names ,annual salary ,comm. of those salesperson whose monthly salary >comm..
  19. Select employees who are with the company for more than 25 years
  20. Display details of those employees who have join the company on same date.
  21. Display details of highest paid employee in the EMP table.
  22. Display the 2nd highest paid employee in the EMP table
  23. Display DEPT NO which do not have clerk.
  24. Update sal of all employees by 2000 who are working in the company for more than 15 years and drawing sal<4000.
  25. Display ENAME , HIREDATE in ascending order.
  26. Suppose a table contain thousand data and you are needed to select the 2nd last record from the table .write the query.
  27. Print the list of employees displaying last salary if exactly 1500 .display on target if less than 1500.
  28. Display DEPT NO and the name of the employee who gets minimum salary in each department.
  29. Display ENAME ,annual salary and comm. Of every employee in DEPT NO 30 and fill the comm. Field with 0 if it doesn’t contain any value.
  30. Display details of that employee who have no manager.
  31. Display details of those employees who are clerk and whose salary lies between 1000 and 2000
  32. . List the employee by name , salary, and department name for every employee in the company except clerks , sort on salary , displaying the highest salary first.
  1. Display Name and Total Remuneration for all employees.
  2. List the employee name and salary increased by 20%.
  3. Display each employee name with hire date and salary review date .assuming review date is first year after hire date
  4. Find out how many managers are there without listing them.
  5. Find the average salary and avg Total Remuneration for each job types. Remember Salesman earn comm..
  6. Find the job that was filled in the first half of 1983 and the same job that was filled during the same period of 1984.
  7. List all employees by NAME and NUMBER along with their manager’s details.
  8. Write the query to display details for any employee who earns a salary greater that the average for their department .Sort in Department Number order.
  9. Find out the employee name , salary , dept no, who earns greater than every employee in Department no 30.
  10. Find the Department having maximum employees.
  11. Find the employee who earns more than ‘MILLER”
  12. Find all the person who are not MANAGERS
  13. Find the name of person getting same salary in different department .
  14. Find the job whose average salary is equal to maximum average salary of any job.
  15. Find out the details of all the person who have been assigned same job in different DEPT NO.
  16. Find the department which has more than 3 employees.
  17. Write a query which will return the day of the week ,for any date entered in format :DD:MM:YY.
  18. Check whether all employee number are indeed unique.
  19. List lowest paid employees working for each manager. Exclude any group where the min salary is <1000.sort>
  20. Show the records of employees working in DALLAS location.
  21. List the following details for employees who earn $36,000 a year or who are clerk.
  22. List all the employees by name, and number along with their manager’s name and number.
  23. Find the employees who joined the company before their managers.
  24. Find the job with the highest average salary.
  25. Find the employees who have at least one person reporting to them.
  26. Find all employees whose department is not in DEPT table.
  27. Find Department which has no employees.
  28. Display the following information for the department with the highest annual remuneration bill.
  29. In which year did most people join the company?Display the year and number of employees.

Wednesday, July 18, 2007

EXTERNAL TABLE


-----------------------------------------------------------

. EXTERNAL TABLE .

-----------------------------------------------------------

(SOME FEAUTRE---->READ ONLY,STORE IN OUTSIDE OF DATABASE FILE,STORE IN FLAT FILE,NO DML STATEMENT WILL WORK, NO IN DEX CAN BE CREATED)

Create a directory in any path

c:/first is my directory

Creating an directory object amed first

create directory first as 'c:/first';

Create a file "emp1.txt" inside the directory and in sert the following data into it

10,jones,11-Dec-1934

20,smith,12-Jun-1972

Create an external table

CREATE TABLE oldemp

(empno NUMBER(8), empname CHAR(20), birthdate DATE)

ORGANIZATION EXTERNAL

(

TYPE ORACLE_LOADER

DEFAULT DIRECTORY first

ACCESS PARAMETERS

(

RECORDS DELIMITED BY NEWLINE

FIELDS TERMINATED BY ','

)

LOCATION ('emp1.txt')

)

PARALLEL 5

REJECT LIMIT 200;

--->(ORACLE_LOADER)oracle driver from its external representation into an equivalent Oracle native representation

--->(ACCESS PARAMETER)data identificaton from the flat file(emp1.txt)

--->LOCATION identification of flat file

--->PARALLEL enables five parallel execution servers to simultaneously scan the external data sources (files) when executing the INSERT INTO TABLE statement

--->The REJECT LIMIT clause specifies that if more than 200 conversion errors occur during a query

of the external data, the query is aborted and an error returned*/

close the session and after starting another session query the table. It will remain as it is

Querying extenal table

select * from oldemp;

Open the "emp1.txt" and add the following data

30,arka,13-jun-1999

40,gora,12-jun-2004

Again query the data you will see the data added to the table

Now remove the "emp1.txt"

And query it again you will see the error

Take it to the old place and query again. it will run clearly

CONSTRAINT


<------CONSTRAINT ----->

WHICH CAN RESTRICT SOMETHING

~~~~~~~~~~~~ ABOUT DIFFERENT TYPES OF CONSTRAINTS~~~~~~~~~

NOT NULL

this ensures that NULL values are not permitted for the columns, since they serve as keys for operation on this table. Columns without the NOT NULL constraint allow NULL values. NOT NULL is one of several intigrity constraints thatmay be defined for table.

UNIQUE

this designates a column or combination of column as a unique key. No two rows in the table can have the same value for this key. Nulls are allowed if the UNIQUE key is used on a single column.

PRIMARY key

As with UNIQUE keys a primary key enforces uniqueness of the column or column combinations involved and a uique index is created to manage this. There may however be only one primary key in a table and this is known as definitive key ehrough which rows in the table are individually identifier. NULLS are not allowed in a primary key clumns. the long datatypes cannot be included in a primary key. a primary key can contain 16 columns at most. A UNIQUE index is creted on the column contained in a the primary key.

FOREIGHN KEY

foreign key provide referential intigrity rule either within a table or between tables. A foreign key is used in relation ship with either a primary or unique key elsewhere.

CHECK constraints

the check constraints explicitly defines a condition that each row must satisfy.

DEFINING CONSTRAINTS (ALSO EXAMPLE OF DEFINING PRIMARY KEY CONSTRAINT)

CREATE TABLE COUNTRY(ID NUMBER(4),NAME VARCHAR2(30), RANK NUMBER(4), CONTINENT VARCHAR2(30),CONSTRAINT ID_PK PRIMARY KEY(ID));

INSERT INTO COUNTRY VALUES(1,'INDIA',1,'ASIA');

VIEW CONSTRAINT FROM DATA DICTIONARY

SELECT * FROM DBA_CONSTRAINTS WHERE CONSTRAINT_NAME='ID_PK';

NOT NULL

CREATE TABLE STATE(ID NUMBER(4) CONSTRAINT ID_NNUL NOT NULL,NAME VARCHAR2(30),RANK NUMBER(4),COUNTRY VARCHAR2(30));

INSERT INTO STATE VALUES( NULL,'WEST BENGAL',1,'INDIA');

UNIQUE

CREATE TABLE STATE(ID NUMBER(4) ,NAME VARCHAR2(30),RANK NUMBER(4),COUNTRY VARCHAR2(30),CONSTRAINT ID_UNI UNIQUE(ID));

INSERT INTO STATE VALUES( NULL,'WEST BENGAL',1,'INDIA');

FOREIGN KEY

CREATE TABLE STATE(ID NUMBER(4) CONSTRAINT ID_NNUL NOT NULL,NAME VARCHAR2(30),RANK NUMBER(4),COUNTRY VARCHAR2(30),CONSTRAINT ID_FK FOREIGN KEY(ID) REFERENCES COUNTRY(ID),CONSTRAINT ID_UNI UNIQUE(ID));

CREATE TABLE STATE(ID NUMBER(4) CONSTRAINT ID_NNUL NOT NULL,NAME VARCHAR2(30),RANK NUMBER(4),COUNTRY VARCHAR2(30),CONSTRAINT ID_FK FOREIGN KEY(ID) REFERENCES COUNTRY(ID) ON DELETE CASCADE,CONSTRAINT ID_UNI UNIQUE(ID));

CREATE TABLE STATE(ID NUMBER(4) CONSTRAINT ID_NNUL NOT NULL,NAME VARCHAR2(30),RANK NUMBER(4),COUNTRY VARCHAR2(30),CONSTRAINT ID_FK FOREIGN KEY(ID) REFERENCES COUNTRY(ID) ON UPDATE CASCADE,CONSTRAINT ID_UNI UNIQUE(ID));

INSERT INTO STATE VALUES( 1,'WEST BENGAL',12,'INDIA');

PROOF OF GIVING MULTIPLE CONSTRAINT TO ONE TABLE

SELECT CONSTRAINT_NAME,TABLE_NAME FROM DBA_CONSTRAINTS WHERE TABLE_NAME='STATE';

CHECK CONSTRAINT

CREATE TABLE CHK(NAME VARCHAR2(10),SAL NUMBER(7),CONSTRAINT SAL_CHK CHECK(SAL>2000));

INSERT INTO CHK VALUES('ARKA',100);

INSERT INTO CHK VALUES('ARKA',2904);

ADDING A CONSTRAINT

ALTER TABLE COUNTRY MODIFY(ID CONSTRAINT ID_PK NOT NULL);

DROPPING A CONSTRAINT

ALTER TABLE COUNTRY DROP CONSTRAINT ID_PK CASCADE;

DISABLE A CONSTRAINT

ALTER TABLE COUNTRY DISABLE CONSTRAINT ID_PK CASCADE;

ENABLE A CONSTRAINT

ALTER TABLE COUNTRY ENABLE CONSTRAINT ID_PK CASCADE;

DDL EXTENSION


. DDL EXTENSION .

******TWO TABLE USED ARE IN THESE EXAMPLE***********

create table stud(name varchar2(10),roll number(5),DOB date);

CREATE TABLE JOB_STUD(NAME VARCHAR2(30),MANAGER NUMBER(10),DUTY VARCHAR2(30));

-------------------------

INSERT ALL (UNCONDITIONAL)

INSERT ALL

INTO STUD VALUES(NAME,ROLL,DOB)

INTO JOB_STUD VALUES(NAME,MANAGER,DUTY)

SELECT ENAME NAME,EMPNO ROLL,HIREDATE DOB,MGR MANAGER,JOB DUTY FROM EMP

WHERE SAL>2000;

-------------------------

SELECT * FROM STUD;

SELECT * FROM JOB_STUD;

-------------------------

TRUNCATE TABLE STUD;

TRUNCATE TABLE JOB_STUD;

-------------------------

INSERT ALL (NCONDITIONAL)

INSERT ALL

WHEN DEPTNO=10 THEN

INTO STUD VALUES(NAME,ROLL,DOB)

WHEN DEPTNO =20 THEN

INTO JOB_STUD VALUES(NAME,MANAGER,DUTY)

SELECT ENAME NAME,EMPNO ROLL,HIREDATE DOB,MGR MANAGER,JOB DUTY,DEPTNO FROM EMP

WHERE SAL>2000;

-------------------------

SELECT * FROM STUD;

SELECT * FROM JOB_STUD;

-------------------------

TRUNCATE TABLE STUD;

TRUNCATE TABLE JOB_STUD;

-------------------------

INSERT FIRST (ONLY THE FIRST VALID EXPRESSION UNDER WHEN CLAUSE WILL WORK)

INSERT FIRST

WHEN MANAGER IS NULL THEN

INTO STUD VALUES(NAME,ROLL,DOB)

WHEN DUTY ='PRESIDENT' THEN

INTO JOB_STUD VALUES(NAME,MANAGER,DUTY)

SELECT ENAME NAME,EMPNO ROLL,HIREDATE DOB,MGR MANAGER,JOB DUTY FROM EMP

WHERE SAL>2000;

-------------------------

SELECT * FROM STUD;

SELECT * FROM JOB_STUD;

-------------------------

TRUNCATE TABLE STUD;

TRUNCATE TABLE JOB_STUD;

-------------------------

Group function Enhanced


. Group function Enhanced .

NORMAL GROUP BY

SELECT AVG(SAL),MAX(SAL), COUNT(*) FROM EMP WHERE JOB LIKE 'CL%' GROUP BY SAL;

NORMAL HAVING CLAUSE

SELECT deptNO, AVG(sal) FROM emp GROUP BY deptNO HAVING AVG(sal) >2200;

ROLLUP OPERATOR(DISPLAYS GROUP FUNCTIONS SOLUTION ON PERTICULAR WHERE CLAUSE)

SELECT deptNO, JOB, SUM(sal) FROM emp WHERE deptNO <>

CUBE OPERATOR

SELECT deptNO, JOB, SUM(sal) FROM emp WHERE deptNO <>

GROUPING (USING CUBE)

SELECT deptNO, JOB, SUM(sal),GROUPING(DEPTNO) DEPAT,GROUPING(JOB) JOB FROM emp WHERE deptNO <>

GROUPING OPERATOR(USIING ROLLUP)

SELECT DEPTNO DEPTID, job JOB,SUM(SAL),GROUPING(deptNO) GRP_DEPT,GROUPING(job) GRP_JOB FROM emp WHERE deptNO <>

GROUPING SETS

SELECT DEPTNO,JOB,MGR,AVG(SAL) FROM EMP GROUP BY GROUPING SETS((DEPTNO,JOB),(JOB,MGR));

COMPOSIT COLUMN

SELECT DEPTNO,JOB,MGR,AVG(SAL) FROM EMP GROUP BY ROLLUP(DEPTNO,(JOB,MGR));

set operator


Set Operator

UNION Returns All distinct rows selected by either query

UNION ALL Returns All rows selected by either query, including all duplicates

INTERSECT Returns All distinct rows selected by both queries

MINUS Returns All distinct rows that are selected by the first SELECT statement and not selected in the second SELECT statement

----------------------------------------------------------------------------

UNION

select job from emp where deptno=10

union

select job from emp where deptno=30

------------------------------

UNION ALL

select job from emp where deptno=10

union ALL

select job from emp where deptno=30

------------------------------

INTERSECT

select job from emp where deptno=10

INTERSECT

select job from emp where deptno=30

------------------------------

MINUS

select job from emp where deptno=10

MINUS

select job from emp where deptno=30

------------------------------

Tuesday, July 10, 2007

Unlock the Teaching account


Unlock the Teaching account

The HR user is for accout for teaching. IN any stydy material from oracle is containning the example of the built-in table of this user.

------By default password------

username:-HR

password:-6399F3B38EDF3288

------Above is collected from this command------

sql>select * from dba_user where username='hr';

-----------------------------------------------------------------------------------------------

the user is generally locked and the account is set to expired.

to unlock this account give the command.

sql>alter user hr identified by arka account unlock;

-----------------------------------------------------------------------------------------------

Now you can see all the tables in the account like employee table

sql>Select * from tab;

sql>select * from employee;

JOINING


JOINING

CARTESIAN PRODUCT

SELECT * FROM EMP,DEPT;

------------------------------------------------------------------------------

ORACLE 8I AND PRIOR

------------------------------------------------------------------------------

EQUI JOIN

SQL>SELECT EMP.ENAME,DEPT.DNAME FROM EMP,DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO

SQL>SELECT EMP.ENAME,DEPT.DNAME FROM EMP,DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO

AND ENAME='ALLEN'

-------------

USING TABLE ALIASES

SELECT E.ENAME,D.DNAME FROM EMP E,DEPT D WHERE E.DEPTNO=D.DEPTNO

AND ENAME='ALLEN'

------------

NON-EQUIJOIN

SELECT E.ENAME,S.GRADE FROM EMP E,SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL

------------

OUTERJOIN (Place the outer join symbol following the name of the column in the table without the matching rows)

SQL>SELECT e.ENAME, D.DNAME

FROM emp e, dept d

WHERE e.deptNO(+) = d.deptNO

SELECT e.ENAME, D.DNAME

FROM emp e, dept d

WHERE e.deptNO= d.deptNO(+)

-------------------

SELFJOIN

SQL>SELECT WORKER.ENAME ||' WORKS FOR '|| MANAGER.ENAME FROM EMP WORKER,EMP MANAGER WHERE WORKER.EMPNO=MANAGER.EMPNO

------------------------------------------------------------

SQL-1999 COMPLIENT JOIN

------------------------------------------------------------

CROSS JOIN(SIMILER TO CARTESIAN JOIN)

SELECT ENAME,DNAME FROM EMP CROSS JOIN DEPT;

------------

NATURAL JOIN(SIMILAR AS EQUI JOIN)

SELECT ENAME,DNAME FROM EMP NATURAL JOIN DEPT

------------

USING CLAUSE(WHEN TWO OR MORE COLUMN IS SIMILER THEN "USING" CLAUSE POINTS TO THE PERTICULAR)

SELECT E.ENAME,D.DNAME FROM EMP E JOIN DEPT D USING(DEPTNO);

------------

ON CLAUSE

SELECT E.ENAME,D.DNAME

FROM EMP E JOIN DEPT D

ON (E.DEPTNO=D.DEPTNO)

------------

THREE WAY JOIN USING "ON" CLAUSE

SELECT employee_id, city, department_name

FROM employees e

JOIN departments d

ON d.department_id = e.department_id

JOIN locations l

ON d.location_id = l.location_id;

------------

LEFT OUTER JOIN

SELECT E.ENAME,D.DNAME

FROM EMP E

LEFT OUTER JOIN DEPT D

ON (E.DEPTNO=D.DEPTNO)

------------

RIGHT OUTER JOIN

SELECT E.ENAME,D.DNAME

FROM EMP E

RIGHT OUTER JOIN DEPT D

ON (E.DEPTNO=D.DEPTNO)

------------

FULL OUTER JOIN

SELECT E.ENAME,D.DNAME

FROM EMP E

FULL OUTER JOIN DEPT D

ON (E.DEPTNO=D.DEPTNO)

------------