Page # 1 of 65 SUMMARY OF SQL & PL/SQL PART-1 (SQL ...

65
Page # 1 of 65 SUMMARY OF SQL & PL/SQL PART-1 (SQL) SQL(Structured Query Languages) Standard Languages for Databases ANSI (American National Standard Institute) Standard Used to Interact / communicate with database Once Learned user every where SQL is re-categorized in sub-languages according to tasks: DCL(Data Control Languages)/ Security Used to Control Database Security (SYSTEM SECURITY, DATA SECURITY.) Create User, Change Password, Assign Privilege/Rights, GRANT PRIVILEGE / RIGHTS, REVOKE RIGHTS CREATE ROLE, GRANT PRIVILEGE TO ROLE, GRANT ROLE TO USERS. USER CREATE USER You can create new users by this command and assign password to it. CREATE USER SCOTT IDENTIFIED BY TIGER; ALTER USER ALTER USER SCOTT IDENTIFIED BY TIGERS; DROP USER DROP USER SCOTT; ROLE CREATE ROLE CREATE ROLE R1 IDENTIFIED BY R1; CREATE ROLE R1 GRANT PRIVILEGE TO ROLE GRANT CREATE SESSION, CREATE TABLE TO R1; GRANT RESOURCE, CONNECT TO R1; GRANT UPDATE, DELETE ON EMP TO R1; GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE VIEW TO SCOTT; GRANT WITH GRANT OPTION GRANT select, insert ON departments TO scott WITH GRANT OPTION; PRIVILEGE GRANT PRIVILEGE /ROLE GRANT RESOURCE, CONNECT, CREATE TABLE, CREATE SESSION, DBA TO SCOTT; GRANT R1 TO SCOTT; GRANT SELECT ON EMPLOYEES TO SUE, RICH; REVOKE PRIVILEGE / ROLE REVOKE CREATE SESSION FROM SCOTT; REVOKE SELECT, INSERT ON DEPARTMENTS FROM SCOTT; DROP ROLE DROP ROLE R1; User Privilege CREATE SESSION CREATE TABLE CREATE SEQUENCE CREATE VIEW CREATE PROCEDURE System Privilege More than 100 privileges are available. The database administrator has high-level system privileges for tasks such as: Creating new users Removing users Removing tables Backing up tables Object Privilege Table View Sequence Procedure ALTER DELETE EXECUTE INDEX INSERT REFERENCES SELECT UPDATE Object Privilege Table View Sequence Procedure ALTER DELETE EXECUTE INDEX INSERT REFERENCES SELECT UPDATE System security / Data security System privileges: Gaining access to the database Object privileges: Manipulating the content of the database objects Schemas: Collection of objects such as tables, views, and sequences

Transcript of Page # 1 of 65 SUMMARY OF SQL & PL/SQL PART-1 (SQL ...

Page # 1 of 65

SUMMARY OF SQL & PL/SQL PART-1 (SQL)

SQL(Structured Query Languages)

Standard Languages for Databases ANSI (American National Standard Institute) Standard Used to Interact / communicate with database Once Learned user every where

SQL is re-categorized in sub-languages according to tasks:

DCL(Data Control Languages)/ Security

Used to Control Database Security (SYSTEM SECURITY, DATA SECURITY.) Create User, Change Password, Assign Privilege/Rights, GRANT PRIVILEGE / RIGHTS, REVOKE RIGHTS CREATE ROLE, GRANT PRIVILEGE TO ROLE, GRANT ROLE TO USERS.

USER CREATE USER

You can create new users by this command and assign password to it. CREATE USER SCOTT IDENTIFIED BY TIGER;

ALTER USER ALTER USER SCOTT IDENTIFIED BY TIGERS;

DROP USER DROP USER SCOTT; ROLE CREATE ROLE

CREATE ROLE R1 IDENTIFIED BY R1; CREATE ROLE R1

GRANT PRIVILEGE TO ROLE GRANT CREATE SESSION, CREATE TABLE TO R1; GRANT RESOURCE, CONNECT TO R1;

GRANT UPDATE, DELETE ON EMP TO R1;

GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE VIEW TO SCOTT;

GRANT WITH GRANT OPTION GRANT select, insert ON departments TO scott WITH GRANT OPTION;

PRIVILEGE GRANT PRIVILEGE /ROLE

GRANT RESOURCE, CONNECT, CREATE TABLE, CREATE SESSION, DBA TO SCOTT;

GRANT R1 TO SCOTT;

GRANT SELECT ON EMPLOYEES TO SUE, RICH;

REVOKE PRIVILEGE / ROLE REVOKE CREATE SESSION FROM SCOTT;

REVOKE SELECT, INSERT ON DEPARTMENTS FROM SCOTT;

DROP ROLE DROP ROLE R1;

User Privilege CREATE SESSION CREATE TABLE CREATE SEQUENCE CREATE VIEW CREATE PROCEDURE

System Privilege

More than 100 privileges are available.

The database administrator has high-level system privileges for tasks such as:

– Creating new users – Removing users – Removing tables – Backing up tables

Object

Privilege Table View Sequence Procedure

ALTER √√√√ √√√√

DELETE √√√√ √√√√

EXECUTE √√√√

INDEX √√√√

INSERT √√√√ √√√√

REFERENCES √√√√

SELECT √√√√ √√√√ √√√√

UPDATE √√√√ √√√√

Object

Privilege Table View Sequence Procedure

ALTER √√√√ √√√√

DELETE √√√√ √√√√

EXECUTE √√√√

INDEX √√√√

INSERT √√√√ √√√√

REFERENCES √√√√

SELECT √√√√ √√√√ √√√√

UPDATE √√√√ √√√√

System security / Data security System privileges: Gaining access to the database Object privileges: Manipulating the content of the database objects Schemas: Collection of objects such as tables, views, and sequences

Page # 2 of 65

DDL(Data Definition Language) Used to interact with database Define objects, change objects, remove objects CREATE, ALTER, DROP CREATE TABLE (Data Base Object)

CREATE TABLE EMP( EMPNO NUMBER(10) primary key, ENAME VARCHAR2(30), SAL NUMBER(12,2), COMM NUMBER(12,2), DEPTNO NUMBER(10));

CREATE TABLE web_orders (ord_id number primary key, order_date TIMESTAMP WITH TIME ZONE);

CREATE TABLE shipping (delivery_time TIMESTAMP WITH LOCAL TIME ZONE);

CREATE TABLE shipping (delivery_time TIMESTAMP WITH LOCAL TIME ZONE); INSERT INTO shipping VALUES(current_timestamp + 2);

CREATE TABLE warranty (prod_id number, warranty_time INTERVAL YEAR(3) TO MONTH); INSERT INTO warranty VALUES (123, INTERVAL '8' MONTH); INSERT INTO warranty VALUES (155, INTERVAL '200' YEAR(3));

CREATE TABLE DEPT_30

AS SELECT empno, ename, sal*12 ANNSAL, hiredate from emp where deptno=30;

ALTER TABLE

ALTER TABLE (ADD) ALTER TABLE EMP ADD MGR NUMBER(5); ALTER TABLE EMP (MODIFY) MODIFY ENAME VARCHAR2(50); DROP TABLE DROP TABLE EMP;

DROP TABLE PURGE

DROP TABLE dept80 PURGE; (Table will be send to Recycle bin)

FLASHBACK

(Table will be Roll Back from Recycle bin) FLASHBACK TABLE[schema.]table[, [ schema.]table ]... TO { TIMESTAMP | SCN } expr [ { ENABLE | DISABLE } TRIGGERS ];

SELECT original_name, operation, droptime, FROM recyclebin;

RENAME

RENAME OLD NAME TO NEW NAME RENAME STUDENT_REGISTER TO STUDENT_DATA;

DROP WITH CASECADE OPTION DROP TABLE STUDENT_DATA CASCADE;

Base Scalar Data Types

CHAR [(maximum_length)] VARCHAR2 (maximum_length) RAW & LONG RAW NUMBER [(precision, scale)] BINARY_INTEGER PLS_INTEGER BOOLEAN BINARY_FLOAT BINARY_DOUBLE DATE TIMESTAMP TIMESTAMP WITH TIME ZONE TIMESTAMP WITH LOCAL TIME ZONE INTERVAL YEAR TO MONTH INTERVAL DAY TO SECOND BLOB CLOB BFILE

Data Type Description

VARCHAR2(size) Variable-length character data

CHAR(size) Fixed-length character data

NUMBER(p,s) Variable-length numeric data

DATE Date and time values

LONG Variable-length character data (up to 2 GB)

CLOB Character data (up to 4 GB)

RAW and LONG

RAW

Raw binary data

BLOB Binary data (up to 4 GB)

BFILE Binary data stored in an external file (up to 4 GB)

ROWID A base-64 number system representing the unique

address of a row in its table

Page # 3 of 65

Data type and Description

Data Type Description

PLS_INTEGER Base type for signed integers between -2,147,483,647 and

2,147,483,647. PLS_INTEGER values require less storage and are

faster than NUMBER and BINARY_INTEGER values. The

arithmetic operations on PLS_INTEGER and BINARY_INTEGER

values are faster than on NUMBER values.

BOOLEAN Base type that stores one of the three possible values used for

logical calculations: TRUE, FALSE, or NULL.

BINARY_FLOAT New data type introduced in Oracle Database 10g. Represents

floating-point number in IEEE 754 format. Requires 5 bytes to

store the value.

BINARY_DOUBLE New data type introduced in Oracle Database 10g. Represents

floating-point number in IEEE 754 format. Requires 9 bytes to

store the value.

Data Type Description

DATE Base type for dates and times. DATE values include the time of day in seconds

since midnight. The range for dates is between 4712 B.C. and 9999 A.D.

TIMESTAMP The TIMESTAMP data type, which extends the DATE data type, stores the year,

month, day, hour, minute, and second, and fraction of seconds. The syntax is:

TIMESTAMP[(precision)]

where the optional parameter precision specifies the number of digits in the

fractional part of the seconds field. You cannot use a symbolic constant or variable

to specify the precision; you must use an integer literal in the range

0 .. 9. The default is 6.

TIMESTAMP WITH TIME ZONE

The TIMESTAMP WITH TIME ZONE data type, which extends the

TIMESTAMP data type, includes a time-zone displacement. The time-zone

displacement is the difference (in hours and minutes) between local time and

Coordinated Universal Time (UTC), formerly known as Greenwich Mean Time.

The syntax is: TIMESTAMP[(precision)] WITH TIME ZONE

where the optional parameter precision specifies the number of digits in the

fractional part of the seconds field. You cannot use a symbolic constant or variable

to specify the precision; you must use an integer literal in the range 0 .. 9. The

default is 6.

Data Type Description

CHAR [(maximum_length)]

Base type for fixed-length character data up to 32,767 bytes. If you

do not specify a maximum_length, the default length is set to 1.

VARCHAR2

(maximum_length) Base type for variable-length character data up to 32,767 bytes. There

is no default size for VARCHAR2 variables and constants.

NUMBER

[(precision, scale)] Number having precision p and scale s. The precision p can range

from 1 to 38. The scale s can range from -84 to 127.

BINARY_INTEGER Base type for integers between -2,147,483,647 and 2,147,483,647.

Data Type Description

TIMESTAMP Date with fractional seconds

INTERVAL YEAR TO MONTH Stored as an interval of years and months

INTERVAL DAY TO SECOND Stored as an interval of days, hours, minutes, and seconds

Page # 4 of 65

CONSTRAINTS Constraints enforce rules at the table level and Column Level. Constraints prevent the deletion of a table, if there are dependencies. Restriction of DML (Insert, Update, Delete) Command in the Table You can-

(At the same time as the table is created After the table has been created Define a constraint at the column or table level. View a constraint in the data dictionary)

The following constraint types are valid: Constraint Name Level NOT NULL Column UNIQUE Column / Table PRIMARY KEY Column / Table FOREIGN KEY Column / Table CHECK Column / Table

Not Null

CREATE TABLE STUDENT_DATA (STU_ID NUMBER(3) NOT NULL, STU_NAME VARCHAR2(25) NOT NULL, STU_FATHERS_NAME VARCHAR2(30), STU_MOBILE NUMBER(15));

Unique CREATE TABLE STUDENT_DATA (STU_ID NUMBER(3) not null, STU_NAME VARCHAR2(25) not null, STU_FATHERS_NAME VARCHAR2(30) unique, STU_CLASS VARCHAR2(7) unique, STU_AGE NUMBER(2) unique, STU_MOBILE NUMBER(15));

TABLE LEVEL CREATE TABLE RECOVARY (RECOVARY_ID NUMBER(10), RECOVARY_DATE DATE, RECOVARY_MODE VARCHAR2(15), AMMOUNT NUMBER(12,2), CONSTRAINT UNI_CUST_ID UNIQUE (CUSTOMER_ID))

TABLE LEVEL CREATE TABLE RECOVARY_TEST (RECOVARY_ID NUMBER(10) UNIQUE, AMMOUNT NUMBER(12,2), CONSTRAINT UNI_AND_ID UNIQUE (CUSTOMER_ID));

Page # 5 of 65

PRIMARY KEY CREATE TABLE RECOVARY_TEST1 (RECOVARY_ID NUMBER(10) PRIMARY KEY, CUSTOMER_ID NUMBER(10), RECOVARY_MODE VARCHAR2(15), AMMOUNT NUMBER(12,2)); CREATE TABLE S_USERS( S_USER_ID VARCHAR2(10) PRIMARY KEY, S_USER_NAME VARCHAR2(20) NOT NULL, UNIQUE(S_USER_NAME), S_USER_DESC VARCHAR2(50), S_USER_TIME VARCHAR2(10) NOT NULL, S_USER_STATUS CHAR(1) DEFAULT 'N') CREATE TABLE RECOVARY_TEST2 (RECOVARY_ID NUMBER(10), RECOVARY_MODE VARCHAR2(15), AMMOUNT NUMBER(12,2), CONSTRAINT PRI_PK_CUST_ID PRIMARY KEY (CUSTOMER_ID)));

FOREIGN KEY

CREATE TABLE USERS_TRANS( TRAN_ID VARCHAR2(10) PRIMARY KEY, TRAN_AMOUNT VARCHAR2(10), CONSTRAINT FK_USER FOREIGN KEY(S_USER_ID) REFERENCES S_USERS ) CREATE TABLE USERS_LOGS( LOG_ID VARCHAR2(10) PRIMARY KEY, OUT_TIME VARCHAR2(10), CONSTRAINT FK_LOG FOREIGN KEY(S_USER_ID) REFERENCES S_USERS )

CHECK CREATE TABLE STUDENT_DATA

(STU_ID NUMBER(3) check (stu_id between 1 and 100), STU_NAME VARCHAR2(25), STU_FATHERS_NAME VARCHAR2(30), STU_CLASS VARCHAR2(7), STU_MOBILE NUMBER(15)) CREATE TABLE STUDENT_DATA (STU_ID NUMBER(3) CHECK (STU_ID BETWEEN 10 AND 90), STU_FATHERS_NAME VARCHAR2(30), STU_FISH NUMBER(10,2) CHECK (STU_FISH BETWEEN 100.00 AND 400.00), STU_MOBILE NUMBER(15));

CREATE TABLE STUDENT_DATA (STU_ID NUMBER(3), STU_NAME VARCHAR2(25), STU_B_DATE DATE, CONSTRAINT CH_STU_F CHECK (STU_FISH BETWEEN 100.00 AND 400.00));

OTHER CONSTRAINT

COMPOSITE PRIMARY KEY CREATE TABLE STUDENT_DATA (STU_ID NUMBER(3), STU_NAME VARCHAR2(25), STU_FATHERS_NAME VARCHAR2(30), STU_CLASS VARCHAR2(7), CONSTRAINT PRI_COM_ID_NAME PRIMARY KEY(STU_ID, STU_NAME));

CREATE TABLE CUSTOMER (CUSTOMER_ID NUMBER(10), FAX VARCHAR2(15), EMAIL VARCHAR2(50), CONSTRAINT PRI_PK_ID_CUST PRIMARY KEY (CUSTOMER_ID, CUSTOMER_NAME,PHONE));

Page # 6 of 65

ALTER (CONSTRAINT) USED TO ADD, MODIFY, DROP, ENABLE AND DISABLE CONSTRAINT.

ALTER TABLE EMP ADD CONSTRAINT EMP_MGR_FK FOREIGN KEY (MGR) REFERENCE EMP(EMPNO)

ADD NOT NULL ALTER TABLE PRODUCT MODIFY PRODUCT_ID NUMBER(10) NOT NULL;

ADD UNIQUE CONSTRAINT ALTER TABLE PRODUCT ADD CONSTRAINT UK_PID UNIQUE (PRODUCT_ID)

ADD PRIMARY KEY ALTER TABLE PRODUCT ADD CONSTRAINT PK_PRI_PRO_ID PRIMARY KEY(PRODUCT_ID);

ADD FOREIGN KEY ALTER TABLE PR_DETAIL ADD CONSTRAINT FK_PRTN_ID FOREIGN KEY (PR_ID) REFERENCES PR_MASTER(PR_ID)

ADD CHECK ALTER TABLE PR_DETAIL ADD CONSTRAINT CHK_PRTN_ID CHECK (PR_ID BETWEEN 1 AND 100)

Disable Constraints ALTER TABLE EMP DISABLE CONSTRAINT EMP_MGR_FK CASECAD ALTER TABLE PRODUCT DISABLE CONSTRAINT PK_PRI_PRO_ID ALTER TABLE emp2 DISABLE CONSTRAINT emp_dt_fk;

Enable Constraints ALTER TABLE EMP ENABLE CONSTRAINT EMP_MGR_FK CASECAD ALTER TABLE PRODUCT ENABLE CONSTRAINT PK_PRI_PRO_ID

Drop Constraints

ALTER TABLE EMP DROP CONSTRAINT EMP_MGR_FK ALTER TABLE PRODUCT DROP CONSTRAINT PK_PRI_PRO_ID

COMMENTS

COMMENT ON TABLE EMP IS 'FOR OUR EMPLOYEE';

COMMENT ON COLUMN EMP.EMPNO IS 'IS A UNIQUE NUMBER';

Page # 7 of 65

DML (Data Manipulation Language) Used to interact with tables Store new records, change records, remove records, select data from tables. INSERT,UPDATE, DELETE, SELECT INSERT INSERT INTO EMP VALUES (1,’ASAD’,5000,500,7787,10); INSERT INTO EMP(EMPNO,ENAME,SAL) VALUES (2,’ALEEM’,7000); INSERT INTO EMP(EMPNO,ENAME,SAL) VALUES (&no,’&name’,&salary);

INSERT INTO (SELECT employee_id, last_name, email, hire_date, job_id, salary, department_id FROM empl3 WHERE department_id = 50) VALUES (99999, 'Taylor', 'DTAYLOR', TO_DATE('07-JUN-99', 'DD-MON-RR'), 'ST_CLERK', 5000, 50);

COPY DATA FROM ANOTHER TABLE

INSERT INTO sales_reps(id, name, salary, commission_pct) SELECT employee_id, last_name, salary, commission_pct FROM employees WHERE job_id LIKE '%REP%';

UPDATE UPDATE EMP (All field will be changed) SET MGR = 7767; UPDATE EMP SET COMM = 200 WHERE COMM IS NULL;

UPDATE employees SET job_id = (SELECT job_id FROM employees WHERE employee_id = 205),

MERGE MERGE INTO table_name table_alias Syntax USING (table|view|sub_query) alias ON (join condition) WHEN MATCHED THEN UPDATE SET col1 = col_val1, col2 = col2_val WHEN NOT MATCHED THEN INSERT (column_list) VALUES (column_values);

MERGE INTO empl3 c USING employees e ON (c.employee_id = e.employee_id) WHEN MATCHED THEN UPDATE SET c.first_name = e.first_name, c.last_name = e.last_name, ... c.department_id = e.department_id WHEN NOT MATCHED THEN INSERT VALUES(e.employee_id, e.first_name, e.last_name, e.email, e.phone_number, e.hire_date, e.job_id, e.salary, e.commission_pct, e.manager_id, e.department_id);

Page # 8 of 65

DELETE DELETE FROM EMP; DELETE FROM EMP WHERE SAL < 2000;

DELETE FROM employees WHERE department_id =(SELECT department_id FROM departments WHERE department_name LIKE '%Public%');

TRUNCATE

TRUNCATE COMMAND FOR DELETING DATA FROM A TABLE IS ALTERNET COMMAND OF DELETE and can not be rolled back.

TRUNCATE TABLE table_name;

TRUNCATE TABLE DEPT_30;

TCL (Transaction Control Language)

1. IMPECIT COMMIT (AUTO SAVE) a. After DDL Command b. Illegal Shutdown

2. EXPLECIT COMMIT a. COMMIT

Commit; b. ROLLBACK

ROLLBACK TO update_done; c. SAVEPOINT

SAVEPOINT update_done;

Lock

1. It's a DBA scope of work and it is an Oracle Server internal process. Prevent destructive interaction between current transactions. Require no user action and automatically use the lowest level of restrictions. Oracle also allows the user to lock data manually. It has two modes, one is exclusive and the other is share.

Page # 9 of 65

SELECT STATEMENT / QUERY DATA FROM TABLE SELECT * FROM EMP; SELECT ENAME,JOB,SAL FROM EMP;

“ALIAS” (COLUMN) SELECT ENAME EMPLOYEE,JOB DESIGNATION, SAL SALARY FROM EMP;

SELECT ENAME, SAL*12 YEARLY_SAL FROM EMP;

SELECT ENAME, SAL+12 YEARLY FROM EMP;

SQL> SELECT ENAME, SAL+12 "YEARLY SAL" FROM EMP

ARITHMETIC OPERATORS

SELECT ENAME,JOB,SAL,SAL*.2 BONUS ( *, /, +, - )- Precedence FROM EMP;

STRINGS / LETERALS and CONCAT.

SELECT CONCAT (ENAME, SAL) FROM EMP;

SELECT ‘The name of Employee is ’ || ENAME FROM EMP;

SELECT last_name ||' is a '|| job_id AS "Employee Details" FROM employees;

SELECT department_name ||

q'[, it's assigned Manager Id: ]' || manager_id AS "Department and Manager" FROM departments;

SELECT EMPNO||'-'||ENAME EMPLOYEE, 'WORKS IN DEPARTMENT # ', DEPTNO FROM EMP; SELECT EMPNO||'-'||ENAME EMPLOYEE, 'MONTHLY SALARY IS', SAL FROM EMP

SELECT EMPNO||'-'||ENAME EMPLOYEE, 'YEARLY SALARY IS', SAL*12 + NVL(COMM,0) ANNUL_SALARY FROM EMP

CONCATENATE "||"

SELECT ENAME, EMPNO||JOB EMPLOYEE FROM EMP;

SELECT ENAME, EMPNO||'-'||JOB EMPLOYEE FROM EMP;

SELECT ENAME, SAL*12+ NVL(COMM,0) ANNUAL_SALARY FROM EMP

SELECT ENAME, SAL*12+ NVL(COMM,200) ANNUAL_SALARY

FROM EMP

MAIN SYNTAX OF QUERY

SELECT COLUMN_ NAME FROM TABLE_NAME WHERE (CONDITIONS) ORDER BY (ASC/DSC)

Page # 10 of 65

DISTINCT (AVOIDING DUPLICATE VALUE)

SELECT DISTINCT DEPTNO FROM EMP;

SELECT DISTINCT DEPTNO, DNAME FROM DEPT;

SELECT DISTINCT JOB FROM EMP;

SELECT DISTINCT DEPTNO,JOB FROM EMP;

NULL VALUE (NULL)

NVL (CHARACTER_COLUMN, 'STRING')

NVL (DATE_COLUMN, ''01-DEC-2007')

NVL (NUMBER_COLUMN, 0)

SELECT ENAME, SAL, NVL(COMM,0) FROM EMP

WHERE CLAUSE SELECT * FROM EMP WHERE JOB = ‘MANAGER’ AND SAL < 3000; SELECT * FROM EMP WHERE JOB = ‘CLERK’ OR SAL > 2000; SELECT * FROM EMP WHERE COMM IS NOT NULL;

ORDER BY

SELECT * FROM EMP ORDER BY ENAME; SELECT * FROM EMP ORDER BY 2;

ORDER BY (ASCENDING)

SELECT ENAME, JOB, HIREDATE FROM EMP ORDER BY HIREDATE SELECT DEPTNO,JOB,ENAME FROM EMP ORDER BY DEPTNO, SAL;

ORDER BY (DESCENDING)

SELECT ENAME, JOB, SAL*12, DEPTNO FROM EMP ORDER BY ENAME DESC SELECT DEPTNO,JOB,ENAME FROM EMP ORDER BY DEPTNO, SAL DESC; SELECT DEPTNO,SAL, COMM FROM EMP ORDER BY COMM DESC SELECT DEPTNO,SAL, COMM FROM EMP ORDER BY SAL DESC

Page # 11 of 65

COMPERISION OPERATOR / LOGICAL OPERATOR

SELECT * FROM EMP WHERE SAL < 3000; SELECT * FROM EMP WHERE SAL > 5000;

SELECT DNAME, DEPTNO FROM DEPT WHERE DEPTNO>20;

ELECT ENAME, SAL, COMM FROM EMP WHERE COMM>SAL;

SELECT * FROM EMP WHERE DEPTNO = 20;

SELECT ENAME, EMPNO, JOB, DEPTNO FROM EMP WHERE JOB ='CLERK'

SQL OPERATOR

IN

SELECT EMPNO, ENAME, SAL, MGR FROM EMP WHERE MGR IN(7788,7566); SELECT EMPNO, ENAME, SAL, MGR FROM EMP WHERE SAL IN(2000,3000);

SELECT * FROM EMP WHERE DEPTNO IN (10,30,40);

BETWEEN

SELECT ENAME, JOB, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000;

LOWER LIMIT MUST BE SPECIFIED FIRST

LIKE

SELECT ENAME, EMPNO FROM EMP WHERE ENAME LIKE 'A%';

SELECT ENAME, EMPNO FROM EMP WHERE ENAME LIKE 'AL%';

SELECT ENAME, EMPNO FROM EMP WHERE ENAME LIKE 'SM%';

SELECT ENAME, EMPNO FROM EMP WHERE ENAME LIKE '_ _ _ _';

SELECT ENAME, EMPNO FROM EMP WHERE ENAME LIKE '_ _ _';

= EQUAL TO > GREATER THAN >= GREATER THAN OR EQUAL TO < LESS THAN <= LESS THAN OR EQUAL TO <>= NOT EQUAL TO =! NOT EQUAL TO DATE & CHARACTER MUST BE ENCLOSED WITHIN SINGLE QUOTATION IN THE WHERE CLAUSE.

SQL OPERATOR BETWEEN IN (LIST) LIKE IS NULL

NAGETIVE SQL OPERATOR

NOT BETWEEN NOT IN NOT LIKE IS NOT NULL

Page # 12 of 65

SELECT ENAME, EMPNO FROM EMP WHERE ENAME LIKE '_ _ _ _ _';

SELECT * FROM EMP WHERE ENAME LIKE ‘A%;’ SELECT * FROM EMP WHERE ENAME LIKE ‘%ALI%’;

SELECT EMPLOYEE_ID, LAST_NAME, JOB_ID FROM EMPLOYEES WHERE JOB_ID LIKE '%SA\_%' ESCAPE '\';

Is Null

SELECT ENAME, MGR FROM EMP WHERE MGR IS NULL;

SELECT ENAME, SAL, COMM FROM EMP WHERE COMM IS NULL;

NOT BETWEEN

SELECT ENAME, JOB, SAL FROM EMP WHERE SAL NOT BETWEEN 1000 AND 2000;

SELECT ENAME, JOB, SAL FROM EMP WHERE SAL NOT BETWEEN 4000 AND 5000;

NOT LIKE

SELECT ENAME, JOB, SAL FROM EMP WHERE JOB NOT LIKE 'S%';

SELECT ENAME, JOB, SAL FROM EMP WHERE JOB NOT LIKE 'CL%'

IS NOT NULL

SELECT ENAME, JOB, SAL, COMM FROM EMP WHERE COMM IS NOT NULL; SELECT ENAME, JOB, SAL, COMM FROM EMP WHERE JOB IS NOT NULL

SELECT ENAME, JOB, SAL, MGR FROM EMP WHERE MGR IS NOT NULL

SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000 AND JOB<>'CLERK'

SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE SAL>1000 AND JOB='MANAGER' OR JOB='CLERK'

NAGATIVE SQL OPERATOR

NOT IN

NOT BETWEEN

NOT LIKE

IS NOT NULL

IMPORTANT: AND = BOTH CONDITION MUST BE TRUE OR = ANY CONDITION HAVE TO BE TRUE AND WILL BE PERFORMED FIRST

SELECT EMPNO, ENAME, JOB, SAL, DEPTNO FROM EMP WHERE SAL>1000 AND (JOB='MANAGER' OR JOB='CLERK')

Page # 13 of 65

Functions ( Single Row) CHARACTER FUNCTIONS UPPER SELECT UPPER(ENAME) FROM EMP;

SELECT LOWER (DNAME), upper('sql course') FROM DEPT

LOWER SELECT LOWER(ENAME FROM EMP;

SELECT LOWER (DNAME), LOWER('SQL COURSE') FROM DEPT;

INITCAP SELECT INITCAP(ENAME) FROM EMP;

INITCAP(DNAME) INITCAP(LOC) SELECT INITCAP(ENAME), LOWER(ENAME), UPPER(ENAME)FROM EMP;

LENGTH

SELECT LENGTH(ENAME) FROM EMP;

SELECT LENGTH ('SQL COURSE'), LENGTH(DEPTNO), LENGTH(DNAME) 2 FROM DEPT;

SUBSTR

SELECT SUBSTR(ENAME,2,3) FROM EMP

SELECT SUBSTR('ORACLE', 2, 4), SUBSTR(DNAME, 2), SUBSTR(DNAME, 3, 5) FROM DEPT

` INSTR

SELECT INSTR(ENAME,’A’) FROM EMP;

SELECT DNAME, INSTR(DNAME, 'A'), INSTR(DNAME, 'ES'), INSTR(DNAME, 'C', 1, 2) FROM DEPT

LPAD SELECT LPAD(ENAME,10,’~’) FROM EMP;

SELECT LPAD(DNAME, 20,'*'),LPAD(DNAME,'20'), LPAD(DNAME, 20,'-')FROM DEPT;

RPAD

SELECT RPAD(ENAME,10,’~’) FROM EMP; SELECT RPAD(DNAME, 20, '*'), RPAD(DNAME, '20'), RPAD(DNAME, 20, ' -'), RPAD(DEPTNO, 20, '-') FROM DEPT

LTRIM SELECT DNAME, LTRIM(DNAME, 'A'), LTRIM(DNAME, 'AS'), LTRIM(DNAME, 'ASOP') FROM DEPT;

RTRIM SELECT DNAME, RTRIM(DNAME, 'G'), RTRIM(DNAME, 'GHS'), RTRIM(DNAME, 'N') FROM DEPT

SOUND SELECT ENAME, SOUNDEX (ENAME) FROM EMP WHERE SOUNDEX(ENAME)=SOUNDEX('FRED') SELECT job, soundex(job) FROM EMP WHERE SOUNDEX (job)=SOUNDEX('manager')

1. Work on each row of Query 2. One result return per row 3. Many argument can be work 4. Nested query can be used 5. Can be used every where

Page # 14 of 65

TRANSLATE SELECT ENAME, TRANSLATE(ENAME, 'C', 'P'), JOB, TRANSLATE (JOB, 'AR', 'TT') FROM EMP WHERE DEPTNO=10

REPLACE SELECT ENAME, JOB, REPLACE(JOB, 'CLERK', 'ADMIN') FROM EMP;

NESTED FUNCTION

SELECT DNAME, LENGTH(DNAME), LENGTH(TRANSLATE(DNAME, 'AS', 'A')) FROM DEPT

SELECT TRANSLATE (DNAME, 'AS', 'A') FROM DEPT;

SELECT DNAME, LENGTH(DNAME), LENGTH(REPLACE(DNAME, 'S')) FROM DEPT;

SELECT DNAME, LENGTH(DNAME), LENGTH(DNAME), LENGTH(REPLACE(DNAME, 'S')) FROM DEPT

CONCATENATE (||)

SELECT ENAME || SAL FROM EMP;

SELECT CONCAT (ENAME, SAL) FROM EMP; NUMERIC FUNCTIONS ROUND SELECT ROUND(17879.879,2) FROM DUAL; SELECT ROUND(17879.241,2) FROM DUAL;

SELECT ROUND (45.923,1),ROUND(45.923,1),ROUND(45.323,1), ROUND(42.323,-1), ROUND (SAL/32,2) FROM EMP WHERE DEPTNO=10

SELECT ROUND(45.923,1), ROUND(45.923,1), ROUND(45.323,1), ROUND(42.323,-1), ROUND(SAL/32,2) FROM EMP WHERE DEPTNO=10

SELECT ROUND(45.923) from dual SELECT SYSDATE, ROUND(SYSDATE, 'MONTH'), ROUND(SYSDATE, 'YEAR') FROM DUAL;

TRUNC SELECT TRUNC(17879.879,2) FROM DUAL; SELECT TRUNC(45.923,1), TRUNC(45.923,1), TRUNC(45.323,1), TRUNC(42.323,-1), TRUNC(SAL/32,2) FROM EMP WHERE DEPTNO=10 SELECT trunc(45.923) from dual SELECT trunc(45.923), round(45.923), trunc(45.923,1), round(45.923,1) from dual

SELECT SYSDATE, TRUNC(SYSDATE, 'MONTH'), TRUNC(SYSDATE, 'YEAR') FROM SYS.DUAL;

Page # 15 of 65

CEIL

Largest Number SELECT CEIL(SAL), CEIL(99.9), CEIL(101.76), CEIL(-11.1) FROM EMP WHERE SAL BETWEEN 3000 AND 5000;

FLOOR

Smallest Number

SELECT FLOOR(SAL), FLOOR(99.9), FLOOR(101.76), FLOOR(-11.1) FROM EMP WHERE SAL BETWEEN 3000 AND 5000

POWER SELECT SAL, POWER(SAL,2), POWER(SAL,3), POWER(50,5) FROM EMP WHERE DEPTNO=10;

EXP SELECT EXP(4) FROM DUAL;

SQRT (Root Over)

SELECT SAL, SQRT(SAL), SQRT(40), SQRT(COMM) FROM EMP WHERE COMM>0;

SIGN SELECT SAL-COMM, SIGN(SAL-COMM), COMM-SAL, SIGN(COMM-SAL) FROM EMP WHERE DEPTNO=30;

SELECT ENAME, SAL, COMM FROM EMP WHERE SIGN(SAL-COMM)=1

ABS SELECT SAL, COMM, COMM-SAL, ABS(COMM-SAL), ABS(-35) FROM EMP WHERE DEPTNO=30;

MOD SELECT MOD(15,4) FROM DUAL;

SELECT SAL,COMM, MOD(SAL,COMM), MOD(100,40) FROM EMP WHERE DEPTNO=30 ORDER BY COMM;

DATE FUNCTIONS

USENG ARITHMETIC OPERATION WITH DATE FUNCTION

ADD_MONTHS SELECT ADD_MONTHS(HIREDATE,10) FROM EMP;

SELECT HIREDATE, HIREDATE+7, HIREDATE-7,SYSDATE-HIREDATE FROM EMP WHERE HIREDATE LIKE '%JUN%'; SELECT HIREDATE, HIREDATE+7, HIREDATE-7,SYSDATE-HIREDATE FROM EMP WHERE HIREDATE LIKE '%DEC%'

SELECT HIREDATE, ADD_MONTHS(HIREDATE, 3), ADD_MONTHS(HIREDATE, -3) FROM EMP WHERE DEPTNO=20

date + number = date date – number = date date – date = number date + number/24 (hours)

Page # 16 of 65

MONTHS_BETWEEN

SELECT MONTHS_BETWEEN(SYSDATE,HIREDATE) FROM EMP;

SELECT MONTHS_BETWEEN(SYSDATE, HIREDATE), MONTHS_BETWEEN('01-JAN-87','05-NOV-07') FROM EMP WHERE MONTHS_BETWEEN(SYSDATE, HIREDATE)>59

SELECT MONTHS_BETWEEN('01-JAN-07','05-NOV-07') FROM dual SELECT MONTHS_BETWEEN('05-NOV-07', '01-JAN-07') FROM dual

NEXT_DAY

SELECT HIREDATE, NEXT_DAY(HIREDATE, 'FRIDAY'), NEXT_DAY(HIREDATE, 6) FROM EMP WHERE DEPTNO=10;

SELECT sysdate, NEXT_DAY(sysdate, 'FRIDAY'), NEXT_DAY(sysdate, 6) from dual

LAST_DAY

SELECT SYSDATE, LAST_DAY(SYSDATE), HIREDATE, LAST_DAY(HIREDATE), LAST_DAY('15-FEB-88') FROM EMP WHERE DEPTNO=20

SELECT LAST_DAY(SYSDATE) FROM DUAL;

CONVERSION FUNCTIONS

TO_CHAR SELECT TO_CHAR(SYSDATE,’DD-MM-RR HH:MI’) FROM DUAL; SELECT TO_CHAR(SAL,’999,999.00’) FROM EMP;

SELECT TO_CHAR(SYSDATE, 'DAY, DDTH MONTH YYYY') FROM DUAL

SELECT TO_CHAR(SYSDATE, 'fmDAY, ddth month yyyy') FROM DUAL; SELECT TO_CHAR (SYSDATE, 'HH:MI:SS') FROM DUAL;

SELECT TO_CHAR(SAL, '$9,999') FROM EMP;

TO_NUMBER

SELECT TO_NUMBER(SUBSTR(HIREDATE,1,2)) FROM EMP;

SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE SAL>TO_NUMBER('1500');

TO_DATE SELECT TO_DATE(’10-10-04’,’MM-DD-YY’) FROM DUAL;

SELECT EMPNO, ENAME, HIREDATE FROM EMP WHERE HIREDATE=TO_DATE('DEC 3, 1981', 'MONTH DD, YYYY')

Sunday = 1 Monday = 2 Tuesday = 3 Wednesday = 4 Thursday = 5 Friyday = 6 Suterday = 7

Page # 17 of 65

OTHER FUNCTIONS NVL

SELECT NVL(SAL,100) FROM EMP; SELECT SAL*12 +NVL(COMM,0), NVL(COMM, 1000), SAL*12+NVL(COMM,1000) FROM EMP WHERE DEPTNO=10;

NESTED FUNCTIONS REVISED

SELECT ENAME, NVL(TO_CHAR(MGR), 'UNMANAGEABLE') FROM EMP WHERE MGR IS NULL

DECODE

SELECT DECODE(JOB,’MANAGER’,SAL*.2,’CLERK’,SAL*.1,SAL*.05) FROM EMP;

SELECT last_name, job_id, salary, DECODE(job_id, 'IT_PROG', 1.10*salary, 'ST_CLERK', 1.15*salary, 'SA_REP', 1.20*salary, salary) REVISED_SALARY FROM employees; SELECT last_name, salary, DECODE (TRUNC(salary/2000, 0), 0, 0.00, 1, 0.09, 2, 0.20, 3, 0.30, 4, 0.40, 5, 0.42, 6, 0.44, 0.45) TAX_RATE FROM employees WHERE department_id = 80;

SELECT ENAME, JOB, DECODE (JOB, 'CLERK', 'WORKER', 'MANAGER', 'BOSS', 'UNDEFINED') DECODE_JOB FROM EMP;

SELECT JOB, SAL, DECODE(JOB,'ANALYST', SAL*1.1, 'CLERK', SAL*1.15, 'MANAGER', SAL*0.95, SAL)DECONDED_SALARY FROM EMP;

select grade, decode(grade, '1', '15%', '2','10%', '3','8%','5%') Bonus from salgrade;

GREATEST SELECT GREATEST(1000, 2000), GREATEST(SAL,COMM) FROM EMP WHERE DEPTNO=30;

LEAST SELECT LEAST(1000, 2000), LEAST(SAL,COMM) FROM EMP WHERE DEPTNO=30;

VSIZE SELECT DEPTNO, VSIZE(DEPTNO), VSIZE(HIREDATE), VSIZE(SAL), VSIZE(ENAME) FROM EMP WHERE DEPTNO=10;

Page # 18 of 65

FUNCTION (Group Functions)

SUM SELECT SUM(SAL) FROM EMP; SELECT SUM(SAL) FROM EMP GROUP BY DEPTNO; SELECT SUN(SAL) FROM EMP GROUP BY JOB; AVG SELECT AVG(SAL) FROM EMP GROUP BY DEPTNO; MIN SELECT MIN(SAL) FROM EMP;

SELECT MIN(SAL) FROM EMP WHERE JOB='CLERK';

MAX SELECT MAX(SAL) FROM EMP;

COUNT SELECT COUNT(*) FROM EMP; SELECT COUNT(*) FROM EMP GROUP BY JOB;

SELECT COUNT(*) FROM EMP WHERE DEPTNO=20;

STDDEV

The AVG, SUM, VARIANCE, and STDDEV functions can be used only with numeric data types. MAX and MIN cannot be used with LOB or LONG data types.

SELECT AVG(salary), STDDEV(salary),COUNT(commission_pct),MAX(hire_date) FROM employees WHERE job_id LIKE 'SA%';

VARIANCE

Select MAX(Noon), AVG(Noon), MIN(Noon), STDDEV(Noon), VARIANCE(Noon) From COMFORT Where City = ‘DHAKA’

GROUP BY COMMAND

SELECT JOB, AVG (SAL) FROM EMP GROUP BY JOB; SELECT JOB, AVG (SAL), MIN (SAL), MAX (SAL) FROM EMP GROUP BY JOB; SELECT JOB, AVG (SAL) FROM EMP WHERE JOB!='MANAGER' GROUP BY JOB;

GROUP FUNCTION WITHIN GROUP SELECT DEPTNO, JOB, AVG(SAL) FROM EMP GROUP BY DEPTNO, JOB;

Page # 19 of 65

GROUP BY FUNCTION WITH INDIVIDUAL RESULT SELECT MAX(SAL) FROM EMP GROUP BY JOB; SELECT MAX(SAL), JOB FROM EMP GROUP BY JOB; SELECT DEPTNO, MIN(SAL) FROM EMP GROUP BY DEPTNO;

HAVING CLAUSE

SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING COUNT(*)>3; SELECT JOB, MAX(SAL) FROM EMP HAVING MAX(SAL)>=3000 GROUP BY JOB;

SELECT SUM(SAL) FROM EMP GROUP BY JOB HAVING SUM(SAL) > 5000;

WHERE CALUSE SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL)>2000; SELECT JOB, AVG(SAL) FROM EMP WHERE JOB !='MANAGER' GROUP BY JOB;

EXISTS SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP E WHERE EXISTS (SELECT EMPNO FROM EMP WHERE EMP.MGR=E.EMPNO) ORDER BY EMPNO;

NOT EXISTS

SELECT DEPTNO, DNAME FROM DEPT D WHERE NOT EXISTS (SELECT 1 FROM EMP E WHERE E.DEPTNO=D.DEPTNO);

NOT EXISTS VRSUS NOT IN

SELECT ENAME, JOB FROM EMP E WHERE NOT EXISTS (SELECT MGR FROM EMP WHERE MGR=E.EMPNO)

Page # 20 of 65

Joins SELECT STATEMENT MUST BE APPLIED SAME NUMBER OF COLUMN. CORRESPONDING COLUMN DATA TYPE MUST BE SAME. DISTINCT IS NOT APLICABLE. COLUMN NAME/HEADING ROW APPEAR FROM THE FIRST QUERY OF THE RESULT ORDER BY CLAUSE CAN BE USED AT THE END OF STATEMENT. IN THE ORDER BY CLAUSE COLUMN NUMBER POSITION CAN BE USED.

ORACLE SQL:1999 REMARKS

EQUIJOIN NATURAL / INNER / SIMPLE

NONEQUIJOIN JOIN USING

OUTER JOIN 1. LEFT OUTER 2. RIGHT OUTER 3. FULL OUTER

LEFT OUTER JOIN

SET OPERATOR UNION / UNION ALL INTERSECT MINUS

SELFJOIN JOIN ON ANY SOME, ALL

CARTESIAN PRODUCT CROSS JOIN

ORACLE JOIN EQUIJOIN SELECT DNAME,ENAME,JOB,SAL FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;

NON EQUIJON SELECT e.last_name, e.salary, j.grade_level FROM employees e JOIN job_grades j ON e.salary BETWEEN j.lowest_sal AND j.highest_sal;

OUTER JOIN

In oracle 9i a new ANSI/ISO systax for joins was introduced. Here are some types of this new syntax. Please avoid confusions here these are no new things except FULL OUTER JOIN, rest of all are just the new systax and ways to do the old things. Means they also performs EQUI, NON EQUI, SELF and OUTER joins but in a different way with a different syntax.

SELECT DNAME,ENAME,JOB,SAL

FROM EMP,DEPT WHERE EMP.DEPTNO(+) = DEPT.DEPTNO;

LEFT OUTER JOIN

First of all try to understand what an Outer Join is. A left outer join is an outer join where you need to put the (+) sign on the left side of the where condition. Lets consider the following Outer Join Query. SQL> select ename , dname from dept d , emp e where e.deptno(+) = d.deptno; Equivalent syntax for such query in ANSI/ISO syntax would be: select ename, dname from dept d LEFT OUTER JOIN emp e; SELECT e.last_name, e.department_id, d.department_name FROM employees e LEFT OUTER JOIN departments d ON (e.department_id = d.department_id) ;

Page # 21 of 65

RIGHT OUTER JOIN This is an outer join where you put the (+) sign on the right side of the where condition. You will just replace the LEFT OUTER JOIN from the above query to RIGHT OUTER JOIN to perform a Right outer Join. SELECT e.last_name, e.department_id, d.department_name FROM employees e RIGHT OUTER JOIN departments d ON (e.department_id = d.department_id) ;

FULL OUTER JOIN This is an outer join when there are values deficient in both the tables. You will just replace the LEFT OUTER JOIN from the above query to FULL OUTER JOIN to perform a Full outer Join.

SELECT e.last_name, d.department_id, d.department_name FROM employees e FULL OUTER JOIN departments d ON (e.department_id = d.department_id) ;

SELF JOIN

Self join means joining a table to itself. Joining two columns of a single table to each other for a certain output. e.g. we want to see who works under who? or who is the manager of whom. Here is the full data for EMP table. The MGR column denotes that who is the manager of the employee in the row. It actually is having the EMPNO of the manager for that employee. For instance the MGR for SMITH is 7902. And 7902 is the EMPNO of FORD so FORD is the manager of SMITH. Now to retrieve this kind of information out we will have to join the MGR and EMPNO column of the EMP table. Here we have accessed the EMP table twice in the from clause but with a different alias, so we got two different views of the emp table named W and M. W for workers and M for Managers. The join condition states to retrive only those rwos where mgr number is equal to the employee number. The MGR for SMITH is 7902 which is the EMPNO of FORD the Condition is true so FORD has been displayed against SMITH. The MGR for ALLEN is 7698 which is the EMPNO for BLAKE so BLAKE is displayed as ALLEN's Manager and so on.... First of all try to understand what an Outer Join is. A left outer join is an outer join where you need to put the (+) sign on the left side of the where condition. Lets consider the following Outer Join Query. SELECT ENAME , DNAME FROM DEPT D , EMP E WHERE E.DEPTNO(+) = D.DEPTNO; EQUIVALENT SYNTAX FOR SUCH QUERY IN ANSI/ISO SYNTAX WOULD BE: SELECT ENAME, DNAME FROM DEPT D LEFT OUTER JOIN EMP E;

SELECT A.ENAME MANAGER,A.EMPNO MANAGERID, B.ENAME SUBORDINATE,B.EMPNO SUBORDINATEID FROM EMP A,EMP B WHERE A.EMPNO = B.MGR; CARTESIAN PRODUCT

CROSS JOIN / CATESIAN JOIN SELECT last_name, department_name FROM employees CROSS JOIN departments ;

Page # 22 of 65

SQL JOIN

NATURAL JOIN/ / INNER JOIN / SIMPLE JOIN

A simple Natural Join or Natural Join Using Clause always perform an Equi Join on the tables. Say there are two tables which does not have any column with same name and same data, now the Natural Join On Clause is a help. Consider the following tables and Sample Data.

select * from salgrade;

select * from emp;

Please see how to perform Non Equi Join in such a situation. Here we will discuss how to perform a Non Equi Join using the by Natural Join Syntax. select ename , sal , grade from salgrade s JOIN emp e ON (e.sal between s.losal and s.hisal);

In the ON Clause you can put any consition to join bothe tables.

SELECT department_id, department_name, location_id, city FROM departments NATURAL JOIN locations ;

JOIN USING

SELECT employees.employee_id, employees.last_name, departments.location_id, department_id FROM employees JOIN departments USING (department_id) ;

LEFT OUTER

SELECT e.last_name, e.department_id, d.department_name FROM employees e LEFT OUTER JOIN departments d ON (e.department_id = d.department_id) ;

JOIN ON

SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e JOIN departments d ON (e.department_id = d.department_id);

SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e JOIN departments d ON (e.department_id = d.department_id) AND e.manager_id = 149 ;

CROSS JOIN

The question arises now is why is it necessary to join those tables from which we want to retrieve data by a single select statement. The answer is if we don't join these tables they generates a cartesian product or a cross join output i.e. all rows in one table are multiplied with all rows in the other table. Seeing the above data if a Cartesian Product is generated the result will be 28 rows i.e. 7 x 4. 7 rows of EMP and 4 rows of DEPT. Have a look what will happen if we don't put a join condition in a query which is retrieving data from more than one tables. select ename , dname from dept , emp;

To avoid a cartesian product you must provide a join condition for all the tables in the query. The formula for that is if n is the number of tables in the query then there should be n-1 number of join conditions in the query. There are many ways by tables can be joined depending upon the situations. Here are a few types of joins available.

Page # 23 of 65

SET OPERATOR

UNION SELECT employee_id, job_id FROM employees UNION SELECT employee_id, job_id FROM job_history;

UNION ALL

SELECT employee_id, job_id, department_id FROM employees UNION ALL SELECT employee_id, job_id, department_id FROM job_history ORDER BY employee_id;

INTERSECT

SELECT employee_id, job_id FROM employees INTERSECT SELECT employee_id, job_id FROM job_history;

MINUS SELECT employee_id,job_id FROM employees MINUS SELECT employee_id,job_id FROM job_history;

SOME/ANY/ALL OPERATOR

SOME

SELECT ENAME, SAL, JOB, DEPTNO FROM EMP WHERE SAL>SOME (SELECT DISTINCT SAL FROM EMP WHERE DEPTNO=10) ORDER BY SAL DESC

ANY

ANY OR SOME COMPARES A VALUE TO EACH VALUE RETURNED BY SUB QUERY ANY MEANS MORE THAN LOWEST, WHICH CAN BE ANY.

ALL

SELECT ENAME, SAL, JOB, DEPTNO FROM EMP WHERE SAL > ALL (SELECT DISTINCT SAL FROM EMP WHERE DEPTNO=30) ORDER BY SAL DESC

Page # 24 of 65

Sub-Query

SINGLE ROW SUB-QUERY

Sub query also a select statement that nested within another select statement.

SELECT ENAME, JOB, SAL FROM EMP WHERE SAL=(LOWEST SALARY WHICH IS UNKNOWN) SELECT MIN(SAL) FROM EMP; SELECT ENAME, JOB, SAL FROM EMP WHERE SAL=800;

COMBINE THIS TWO COMMAND BELOW

SELECT ENAME, JOB, SAL FROM EMP WHERE SAL=(SELECT MIN(SAL) FROM EMP)

SELECT * FROM EMP WHERE SAL < (SELECT SAL FROM EMP WHERE ENAME = ‘SMITH’);

SELECT employee_id, manager_id, department_id FROM employees WHERE (manager_id, department_id) IN (SELECT manager_id, department_id FROM employees WHERE employee_id IN (199,174)) AND employee_id NOT IN (199,174);

SELECT employee_id, manager_id, department_id FROM employees WHERE manager_id IN (SELECT manager_id FROM employees WHERE employee_id IN (174,199)) AND department_id IN (SELECT department_id FROM employees WHERE employee_id IN (174,199)) AND employee_id NOT IN (174,199);

SELECT employee_id, last_name, (CASE WHEN department_id = (SELECT department_id FROM departments WHERE location_id = 1800) THEN 'Canada' ELSE 'USA' END) location FROM employees;

SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table);

SELECT last_name FROM employees WHERE salary > (SELECT salary FROM employees WHERE last_name = 'Abel');

Page # 25 of 65

SELECT last_name, job_id, salary FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 141) AND salary > (SELECT salary FROM employees WHERE employee_id = 143);

HAVING CALUSE WITH NESTED SUBQUERY

SELECT DEPTNO, AVG(SAL) FROM EMP HAVING AVG(SAL) > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO=30) GROUP BY DEPTNO;

SELECT JOB, AVG(SAL) FROM EMP GROUP BY JOB HAVING AVG(SAL)=(SELECT MAX(AVG(SAL)) FROM EMP GROUP BY JOB)

NESTED SUB-QUERY

MAIN QUERY INNER QUERY SELECT ENAME, JOB FROM EMP WHERE JOB=(SELECT JOB FROM EMP WHERE ENAME='BLAKE') SELECT ENAME, JOB FROM EMP WHERE ENAME='BLAKE' SELECT ENAME, JOB FROM EMP WHERE job='MANAGER' SELECT ENAME, JOB, HIREDATE, SAL FROM EMP

WHERE SAL> (SELECT MAX(SAL) FROM EMP

WHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME='SALES'))

CORELATED QUERY

SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP E WHERE SAL>(SELECT AVG(SAL) FROM EMP WHERE DEPTNO=E.DEPTNO) ORDER BY DEPTNO;

SUB QUERY THAT RETURN MORE THAN ONE ROW

SELECT ENAME, SAL, DEPTNO FROM EMP WHERE SAL IN (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO);

SELECT ENAME, SAL, DEPTNO FROM EMP WHERE (SAL,DEPTNO) IN (SELECT MIN(SAL), DEPTNO FROM EMP GROUP BY DEPTNO)

Note- There is a limit on the levels of nested for a sub-query is 255

Page # 26 of 65

Views View based on a table or another view and acts as a window through which data on a table

can be viewed or changes. A view does not contain data and store data as select statement.

1. SIMPLE VIEW a. CREATE FROM A SINGLE TABLE

2. COMPLEX VIEW a. CREATE FROM MANY TABLE

FEATURE/ DISCRIPTION SIMPLE VIEW COMPLEX VIEW

NUMBER OF TABLE ONE MANY CONTAIN FUNCTION NO YES CONTAIN GROUP OF DATA NO YES ALLOW DML YES NOT ALWAYS

NOTE : VIEW CAN NOT CONTAIN ORDER BY CLAUSE

CREATE VIEW

REPLACE = FORCE

CREATE OR REPLACE VIEW EMP_VIEW1 AS SELECT EMPNO, ENAME, JOB FROM EMP WHERE DEPTNO=10;

CREATE OR REPLACE VIEW EMP_VIEW2 AS SELECT EMPNO, ENAME, JOB FROM EMP WHERE JOB='MANAGER'

COLUMN ALIAS

CREATE VIEW EMP_SAL5 AS SELECT EMPNO EPLOYEE_NUMBER, ENAME NAME, SAL SALARY FROM EMP WHERE DEPTNO=10 OR DEPTNO=20

CREATE VIEW DEPT_SUM6 (NAME, MINSAL, MAXSAL, AVGSAL) AS SELECT DNAME, MIN(SAL), MAX(SAL), AVG(SAL) FROM EMP, DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO GROUP BY DNAME

CREATE VIEW D_EMP7 AS SELECT EMPNO, ENAME, DEPTNO FROM EMP WHERE DEPTNO=10 WITH CHECK OPTION;

CREATE VIEW ORG_EMP_V AS SELECT A.ENAME MANAGER,A.EMPNO MANAGERID, B.ENAME SUBORDINATE,B.EMPNO SUBORDINATEID FROM EMP A,EMP B WHERE A.EMPNO = B.MGR;

CREATE VIEW empvu80 AS SELECT employee_id, last_name, salary FROM employees WHERE department_id = 80;

Page # 27 of 65

READ ONLY VIEW.

CREATE OR REPLACE VIEW EMP_READ9 (EMPLOYEE_NUMBER, EMPLOYEE_NAME, DESIGNATION) AS SELECT EMPNO, ENAME, JOB FROM EMP WHERE DEPTNO=30 WITH READ ONLY;

DROP VIEW

DROP VIEW EMP_VIEW1

SEQUENCE

CREATE SEQUENCE sequence [INCREMENT BY n] [START WITH n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}];

CREATE SEQUENCE SEQ_EMP1 START WITH 1 INCREMENT BY 1 NOCACHE; CREATE SEQJUENCE SEQ_EMP2 START WITH 100 INCREMENT BY 1 MINVALUE 90 MAXVALUE 150 CYCLE; SELECT SEQ_EMP1.NEXTVAL

FROM DUAL;

GENERATE SEQUENCE insert into student_data values (student_d_seq.nextval, 'Nabil Mahmud', 'Noor Mohmmad', 11, 17,'15-dec-07', 150, '17-Jun-07',0507282848)

Next Value=Nextval

Return the next available sequence value Return the unique value every time, even for differenct users.

insert into student_data values (student_d_seq.nextval, 'NITI Mahmud', 'Shaik Mohmmad', 12, 17,'15-dec-07', 150, '17-Jun-07', 150, '17-Jun-07',0507282848)

select student_d_seq.nextval from dual select student_d_seq.nextval from dual

Current Value=currval Currval obtain the current sequence value. Nextval must be used for that sequence before currval contains a value

select student_d_seq.currval from dual

Altering sequence

ALTER SEQUENCE EMP_D_SEQ MAXVALUE 2000; ALTER SEQUENCE STUDENT_D_SEQ MAXVALUE 1000

Page # 28 of 65

Drop sequence? DROP SEQUENCE EMP_D_SEQ; DROP SEQUENCE STUDENT_D_SEQ;

Synonym

Type of Synonym

1. Public Synonym

2. Private Synonym

DBA CAN CREATE PUBLIC SYNONYM

DBA CAN CREATE PUBLIC SYNONYM CREATE SYNONYM E FOR EMP;

CREATE SYNONYM d_sum FOR dept_sum_vu;

DROP SYNONYM

DROP SYNONYM D_SUM; DROP PUBLIC SYNONYM DEPT_SYN

Index CREATE INDEX IDX_EMP_ENAME ON EMP(ENAME);

CREATE INDEX emp_last_name_idx ON employees(last_name);

CREATE INDEX upper_dept_name_idx ON dept2(UPPER(department_name));

Drop /Delete Index File drop index emp_nm_idx;

drop index index_em_hi_idx

Page # 29 of 65

DATA DICTIONARY

What is a Data Dictionary?

The data dictionary of an ORACLE database is a set of tables and views that are used as a

read-only reference about the database. It stores information about both the logical and

physical structure of the database, the valid users of an ORACLE database, integrity

constraints defined for tables in the database and space allocated for a schema object and

how much of it is being used.

LIST OF DATA DICTIONARY TABLE

TABLE NAME DESCRIPTION

ALL_CATALOG User Table, views, Synonyms, Sequence

ALL_COL_COMMENTS Column Comments

ALL_COL_PRIVS Column Privilege

ALL_COL_PRIVS_MADE Privilege created by user

ALL_COL_PRIVS_RECD Privilege status

ALL_CONSTRAINTS All Constraint, Constraints definitions on accessible tables

ALL_CONS_COLUMNS Constraint

ALL_DB__LINKS Database links accessible to the user

ALL_DEF_AUDIT_OPTS Auditing options for newly created objects

ALL_DEPENDENCIES Dependencies to and from objects accessible to the user

ALL_ERROR Current errors on stored objects that user is allowed

ALL_INDEX Description of indexes on tables accessible to the user

ALL_IND_COLUMNS Columns comprising indexes on accessible tables

ALL_OBJECTS Objects accessible to the user

ALL_SEQUENCE Description of sequences accessible to the user

ALL_SNAPSHOTS Snapshots the user can look at

ALL_SOURCE Current source on stored object that user is allowed to create

ALL_SYNONYMS ALL synonyms accessible to the user

ALL_TABLE Description of tables accessible to the user

ALL_TAB_COLUMNS Columns of all tables, view and clusters

ALL_TAB_COMMENTS Comments on tables and views accessible to the user

ALL_TAB_PRIVS_MADE User's grants and grants on user's objects

ALL_TAB_PRIVS_RECD Grants on objects for the user, Public or enable role is the grantee

ALL_TRIGERS Triggers accessible to the user

ALL_TRRIGER_COLS Column uses in user's triggers or in triggers on user's table

ALL_USERS Information about all users of the database

ALL_VIEWS Text or views accessible to the user

CAT Synonym for USER_CATALOG

CLU Synonym for USER_CLUSTERS

COLS Synonym for USER_TAB_COLUMNS

COLUMN_PRIVILEGES Grants on columns for which the user is the grantor, grantee, owner or and enabled role or Public is the grantee

DICT Synonym for Dictionary

DICTIONARY Description of data dictionary tables and views

DICT_COLUMNS Description of columns in data dictionary tables and views

GLOBAL_NAME Global database name

IND Synonym for USER_INDEXS

INDEX_STATS Statistics on the b-tree

OBJ Synonym for the USER_OBJECTS

RESOURCE_COST Cost for each resource

ROLE_ROLE_PRIVS Roles which are granted to roles

ROLE_SYS_PRIVS System Privilege granted to roles

ROLE_TAB_PRIVS Table privilege granted to roles

SEQ Synonym for USER_SEQUENCES

SESSION_PRIVS Privileges which the user currently has set

SESSION_ROLES Roles which the user currently has enabled

SYN Synonym for USER_SYNONYMS

TABLE_PRIVILEGES Grants on objects for which the user is the grantor, grantee, owner, or an enabled role or PUBLIC is the grantee

Page # 30 of 65

TABLE NAME DESCRIPTION

TABS Synonym for USER_TABS

USER_AUDIT_STATEMENT Audit trail records concerning grant, revoke, audit, no-audit and alter system

USER_AUDIT_TRAIL Audit entries relevant to the user

USER_CATALOG Tables, Views, Synonyms and Sequences owned by the user

USER_CLUSTERS Description of user's own clusters

USER_CLU_COLUMNS Mapping of the table columns to cluster columns

USER_COLS_COMMENTS Comments on columns of user's tables and views

USER_COL_PRIVS Grants on columns for which the user is the owner, grantor or grantee

USER_COL_PRIVS_MADE Comments on columns of object owned by the user

USER_COL_PRIVS_RECD Grants on columns for which the user is the grantee

USER_CONSTRAINTS Constraint definition on user's own tables

USER_CONS_COLUMNS Information about accessible columns in constraint definitions

USER_DB_LINKS Database links owned by the user

USER_DEPENDENCIES Dependencies to and from a user objects

USER_ERRORS Current errors on stored object owned by the user

USER_EXTENTS Extents comprising segments owned by the user

USER_FREE_SPACE Free extents in table spaces accessible to the user

USER_INDEX Description of the user's own indexes

USER_IND_COLUMNS COLUMNs comprising user's INDEXes or user's TABLES

USER_OBJECTS Object owned by user

USER_OBJECTS-_SIZE Sizes, in bytes, of various pl/sql objects

USER_OBJ_AUDIT_OPTS Auditing options for user's own tables and views

USER_RESOURCE_LIMITS Display resource limit of the user

USER_ROLE_PRIVS Roles granted to current user

USER_SEGMENTS Storage allocated for all database segments

USER_SEQUENCE Description of the user's own SEQUENCEs

USER_SNAPSHOTS Snapshots the user can look at

USER_SNAPSHOTS_LOGS All snapshot logs owned by the user

USER_SOURCE Source of stored objects accessible to the user

USER_SYNONYMS The user's private synonyms

USER_SYS_PRIVS System privileges granted to current user

USER_TABLES Description of the user's own tables

USER_TABLSPACES Description of accessible tablespaces

USER_TAB_PRIVS Grants on objects for which the user is the owner, grantor or grantee

USER_TAB_PRIVS_MADE All grants on objects owned by the user

USER_TAB_PRIVS_RECD Grants n objects for which the user is the grantee

USER_TRIGERS Trigger owned by the user

USER_TRIGER_COLS Column usage in user's trigger

USER_TS_QUOTAS Tablespace quotas for the user

USER_USERS Information about the current user

USER_VIEWS Text of views owned by the user

TABLE / TAB

SELECT TNAME,TABTYPE, CLUSTERID FROM TAB; SELECT table_name FROM user_tables; SELECT * FROM USER_TABLES

CATALOG / CAT DESC USER_CATALOG; DESC CAT;

Page # 31 of 65

VIEWS

ALL_VIEWS Text or views accessible to the user

USER_VIEWS Text of views owned by the user

DESCRIBE user_views SELECT DISTINCT view_name FROM user_views; SELECT text FROM user_views WHERE view_name = 'EMP_DETAILS_VIEW'; DESC USER_VIEWS; SELECT VIEW_NAME, VIEW_TYPE FROM USER_VIEWS;

USER

USER_USERS Information about the current user

USER_TABLES Description of the user's own tables

USER_OBJECTS Object owned by user

USER_INDEX Description of the user's own indexes

DESCRIBE user_tab_columns SELECT column_name, data_type, data_length, data_precision, data_scale, nullable FROM user_tab_columns WHERE table_name = 'EMPLOYEES';

DESCRIBE user_tables DESC USER_USERS; SELECT USERNAME, CREATED FROM USER_USERS;

PRIVILEGE & ROLE

ALL_COL_PRIVS Column Privilege

ROLE_TAB_PRIVS Table privilege granted to roles

USER_TAB_PRIVS Grants on objects for which the user is the owner, grantor or grantee

USER_SYS_PRIVS System privileges granted to current user

ROLE_ROLE_PRIVS Roles which are granted to roles

ROLE_SYS_PRIVS System Privilege granted to roles

ROLE_TAB_PRIVS Table privilege granted to roles

DESC ALL_COL_PRIVS; SELECT GRANTOR, GRANTEE FROM ALL_COL_PRIVS;

OBJECTS

SELECT * FROM dictionary WHERE table_name = 'USER_OBJECTS';

• Describes all objects that are owned by you • Is a useful way to obtain a listing of all object names and types in your schema, plus the

following information: – Date created – Date of last modification – Status (valid or invalid)

• Queries ALL_OBJECTS to see all objects to which you have access

SELECT object_name, object_type, created, status FROM user_objects ORDER BY object_type;

Page # 32 of 65

CONSTRAINT

ALL_CONSTRAINTS All Constraint, Constraints definitions on accessible tables

ALL_CONS_COLUMNS Constraints for all columns

USER_CONS_COLUMNS Table name, column name and Constraint name

USER_CONSTRAINTS Constraint details

SELECT constraint_name, constraint_type, search_condition, r_constraint_name, delete_rule, status FROM user_constraints WHERE table_name = 'EMPLOYEES'; DESCRIBE user_constraints DESCRIBE user_cons_columns SELECT constraint_name, column_name FROM user_cons_columns WHERE table_name = 'EMPLOYEES'; SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME='EMP'; DESC ALL_CONSTRAINTS; DESC ALL_CONS_COLUMNS; DESC USER_CONS_COLUMNS;

C = CHECK AND NOT NULL ALSO SAME

P = PRIMARY KEY R = REFERENTIAL / FOREIGN KEY

U = UNIQUE

SEQUENCE

SEQ Synonym for USER_SEQUENCES

ALL_SEQUENCE Description of sequences accessible to the user

USER_SEQUENCE Description of the user's own SEQUENCEs

SELECT * FROM SEQ;

DESCRIBE user_sequences SELECT sequence_name, min_value, max_value, increment_by, last_number FROM user_sequences;

INDEX

Tabel Name Description

ALL_INDEX Description of indexes on tables accessible to the user

ALL_IND_COLUMNS Columns comprising indexes on accessible tables

IND Synonym for USER_INDEXS

INDEX_STATS Statistics on the b-tree

DESC ALL_INDEXES; SELECT OWNER, INDEX_NAME, INDEX_TYPE FROM ALL_INDEXES WHERE TABLE_NAME='EMP'

Page # 33 of 65

SYNONYM

SYN Synonym for USER_SYNONYMS

ALL_SYNONYMS ALL synonyms accessible to the user

USER_SYNONYMS The user's private synonyms

desc syn; select * from syn; DESCRIBE user_synonyms SELECT * FROM user_synonyms; DESCRIBE DICTIONARY

COMMENT

• You can add comments to a table or column by using the COMMENT statement:

• Comments can be viewed through the data dictionary views: • ALL_COL_COMMENTS • USER_COL_COMMENTS • ALL_TAB_COMMENTS • USER_TAB_COMMENTS

DESC ALL_COL_COMMENTS; SELECT * FROM USER_TAB_COMMENTS;

SUMMARY

In this lesson, you should have learned how to find information about your objects through the following dictionary views:

• DICTIONARY • USER_OBJECTS • USER_TABLES • USER_TAB_COLUMNS • USER_CONSTRAINTS • USER_CONS_COLUMNS • USER_VIEWS • USER_SEQUENCES • USER_TAB_SYNONYMS

Page # 34 of 65

VARIABLE

1. Bind Variable For Individual Value Store

2. Substitution Variable For Command text store

SINGEL AMPERSAND SUBSTITION VARIABLE

SELECT EMPNO, ENAME, SAL FROM EMP WHERE DEPTNO=&DEPT_NO; Enter value for dept_no: 10 old 3: WHERE DEPTNO=&DEPT_NO new 3: WHERE DEPTNO=10

SQL> / Enter value for dept_no: 20 old 3: WHERE DEPTNO=&DEPT_NO new 3: WHERE DEPTNO=20

SELECT EMPNO, ENAME, SAL, JOB FROM EMP WHERE JOB=&JOB_TITLE Enter value for job_title: 'MANAGER' old 3: WHERE JOB=&JOB_TITLE new 3: WHERE JOB='MANAGER'

SELECT EMPNO, ENAME, SAL, JOB FROM EMP WHERE JOB='&JOB_TITLE' Enter value for job_title: MANAGER old 3: WHERE JOB='&JOB_TITLE' new 3: WHERE JOB='MANAGER'

EXPRESSION WITH VARIABLE

SELECT DEPTNO, &ARI_EXP FROM EMP Enter value for ari_exp: SAL*12 old 1: SELECT DEPTNO, &ARI_EXP new 1: SELECT DEPTNO, SAL*12

SQL> / Enter value for ari_exp: SAL*12/100 old 1: SELECT DEPTNO, &ARI_EXP new 1: SELECT DEPTNO, SAL*12/100 SELECT * FROM SALGRADE WHERE LOSAL &CONDITION Enter value for condition: >900 old 2: WHERE LOSAL &CONDITION new 2: WHERE LOSAL >900

Enter value for condition: BETWEEN 2000 AND 3000 old 2: WHERE LOSAL &CONDITION new 2: WHERE LOSAL BETWEEN 2000 AND 3000

Page # 35 of 65

DOUBLE AMPERSAND SUBSTITION VARIABL

SELECT * FROM EMP WHERE DEPTNO=&&DDEPTNO; Enter value for ddeptno: 10 old 2: WHERE DEPTNO=&&DDEPTNO new 2: WHERE DEPTNO=10

DEFINE

DEFINE REM=SAL*12 +NVL(COMM, 0)

SELECT ENAME, JOB, &REM FROM EMP ORDER BY &REM; old 1: SELECT ENAME, JOB, &REM new 1: SELECT ENAME, JOB, SAL*12 old 3: ORDER BY &REM new 3: ORDER BY SAL*12

SQL> define x=100 SQL> define y=25 SQL> SELECT &X+&Y FROM DUAL; old 1: SELECT &X+&Y FROM DUAL new 1: SELECT 100+25 FROM DUAL

SQL> SELECT &X*&Y FROM DUAL old 1: SELECT &X*&Y FROM DUAL new 1: SELECT 100*25 FROM DUAL

SQL FILE /SPOOL FILE/SCRIPT FILE

COMMAND SYNTAX

SQL>SPOOL DRIVE:\FOLDER\FILE NAME.SQL

SQL>SPOOL D:\MAHMUD\ORA.SQL

Page # 36 of 65

FUNCTION name RETURN datatype IS BEGIN --statements RETURN value; [EXCEPTION] END;

PROCEDURE name IS BEGIN --statements [EXCEPTION] END;

[DECLARE] BEGIN --statements [EXCEPTION] END;

BLOCK

DECLARE (Optional) BEGIN (Mandatory)

EXCEPTION (Optional) END; (Mandatory)

[DECLARE] BEGIN --statements [EXCEPTION] END;

Executable Section - SQL statements - PL/SQL statements

Error Handle Section - Actions to perform - When errors occur - Message Handle

User-defined exceptions

Cursors,

Variables,

Constant

SALAR

COMPOSITE

LOB

REFERENCE

Base Scalar Data Types

CHAR [(maximum_length)] VARCHAR2 (maximum_length) RAW & LONG RAW NUMBER [(precision, scale)] BINARY_INTEGER PLS_INTEGER BOOLEAN BINARY_FLOAT BINARY_DOUBLE DATE TIMESTAMP TIMESTAMP WITH TIME ZONE

. . . . .

TABLE RECORD

CLOB BLOB NCLOB BFILE

PL/SQL packages: • Group logically related components:

– PL/SQL types – Variables, data structures, and

exceptions – Subprograms: procedures and

functions • Consist of two parts:

– A specification – A body

• Enable the Oracle server to read multiple objects into memory at once

SUMMARY OF PL/SQL

Page # 37 of 65

SUMMARY OF SQL & PL/SQL PART-2 (PL/SQL)

Block

Declaration Section (Declare all variable, constants, cursors, exceptions) Executable Section (All executable PL/SQL Commands, call other procedures,DML) Exception Section (Tran Run time errors and give your own messages)

Variable

PL/SQL Variable Scalar variable Composite variable Declare X number(10); V_EMPNO EMP.EMPNO%TYPE; V_EMP EMP%ROWTYPE; BEGIN SELECT * INTO V_EMP FROM EMP WHERE EMPNO = 7788; DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME); END; DML in PL/SQL SELECT INSERT UPDATE DELETE Declare X number(10); V_EMPNO EMP.EMPNO%TYPE; V_EMP EMP%ROWTYPE; BEGIN SELECT * INTO V_EMP FROM EMP WHERE EMPNO = 7788; DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME);

INSERT INTO EMP1 (EMPNO,ENAME,JOB,SAL) VALUES (V_EMP.EMPNO,V_EMP.ENAME,V_EMP.JOB,V_EMP.SAL);

UPDATE EMP1 SET SAL = V_EMP.SAL WHERE EMPNO = V_EMP.EMPNO; DELETE FROM EMP1 WHERE DEPTNO = V_EMP.DEPTNO;

END;

FOR VARIABLE DATE TYPE AND DETAILS

SEE PAGE # 2 & 3

SEE ALSO PAGE # 36

Page # 38 of 65

Flow Control If condition

declare

x number;

begin

select sal

into x

from emp where empno = '&no';

dbms_output.put_line(x);

if x > 3000 then

dbms_output.put_line('first grade');

elsif x > 2000 then

dbms_output.put_line('second grade');

else

dbms_output.put_line('junior grade');

end if;

end;

declare

x number;

begin

select sal

into x

from emp where empno = '&no';

dbms_output.put_line(x);

if x >= 3000 then

dbms_output.put_line('first grade');

elsif x > 2000 then

dbms_output.put_line('second grade');

else

dbms_output.put_line('junior grade');

end if;

end;

declare

x number;

begin

select sal

into x

from emp where empno = '&no';

dbms_output.put_line(x);

if x >= 3000 then

dbms_output.put_line('first grade');

elsif x > 2000 then

dbms_output.put_line('second grade');

end if;

end;

Page # 39 of 65

declare

x number;

begin

select sal

into x

from emp where empno = '&no';

dbms_output.put_line(x);

if x >= 3000 then

dbms_output.put_line('first grade');

else

dbms_output.put_line('junior grade');

end if;

end;

declare

x number;

begin

select sal

into x

from emp where empno = '&no';

dbms_output.put_line(x);

if x >= 3000 then

dbms_output.put_line('first grade');

end if;

end;

declare

x varchar2(20);

begin

select ename

into x

from emp where empno = '&no';

dbms_output.put_line(x);

dbms_output.put_line(x);

dbms_output.put_line(x);

dbms_output.put_line(x);

dbms_output.put_line(x);

dbms_output.put_line(x);

dbms_output.put_line(x);

end;

Page # 40 of 65

DECLARE V_EMP EMP%ROWTYPE;

BEGIN SELECT * INTO V_EMP FROM EMP WHERE ENAME = ‘SCOTT’; IF V_EMP.SAL < 3000 THEN DBMS_OUTPUT.PUT_LINE(‘A’); ELSIF V_EMP.SAL < 2000 THEN DBMS_OUTPUT.PUT_LINE(‘B’); ELSIF V_EMP.SAL < 1000 THEN DBMS_OUTPUT.PUT_LINE(‘C’); ELSE DBMS_OUTPUT.PUT_LINE(‘D’); END IF;

END;

Basic loop

declare

x varchar2(20);

y number := 1;

begin

select ename

into x

from emp where empno = '&no';

loop

dbms_output.put_line(x);

10 y := y + 1;

exit when Y > 10;

end loop;

end;

declare

x varchar2(20);

y number := 1;

begin

select ename

into x

from emp where empno = '&no';

loop

dbms_output.put_line(x);

dbms_output.put_line(y);

11 y := y + 2;

exit when Y > 10;

end loop;

end;

Page # 41 of 65

DECLARE X NUMBER := 1; BEGIN LOOP X := X +1 ; DBMS_OUTPUT.PUT_LINE(X); EXIT WHEN X = 10; END LOOP;

END;

While loop

declare

x varchar2(20);

y number := 1;

begin

select ename

into x

from emp where empno = '&no';

while y < 10 loop

dbms_output.put_line(x);

dbms_output.put_line(y);

11 y := y + 2;

end loop;

end;

declare

x varchar2(20);

y number := 1;

begin

select ename

into x

from emp where empno = '&no';

while y < 10 loop

dbms_output.put_line(x);

dbms_output.put_line(y);

y := y + 1;

end loop;

end;

DECLARE X NUMBER := 1; BEGIN WHILE X < 10 LOOP X := X +1; DBMS_OUTPUT.PUT_LINE(X); END LOOP;

END;

Page # 42 of 65

For loop

declare

x varchar2(20);

begin

select ename

into x

from emp where empno = '&no';

for i in 1..10 loop

dbms_output.put_line(x);

dbms_output.put_line(i);

end loop;

end;

begin

for i in 1..10 loop

dbms_output.put_line('hafeez');

dbms_output.put_line(i);

end loop;

end;

BEGIN FOR I IN 1..10 LOOP DBMS_OUTPUT.PUT_LINE(I); END LOOP;

END;

Exceptions DECLARE V_EMP EMP%ROWTYPE; BEGIN SELECT * INTO V_EMP FROM EMP

WHERE DEPTNO = 1; DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME);

EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(‘SORRY, NO DATA FOUND’); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE(‘SORRY, MANY RECORDS FOUND’);

END;

Page # 43 of 65

Cursor set serveroutput on

declare

cursor c_emp is select * from emp;

v_emp emp%rowtype;

begin

open c_emp;

loop

fetch c_emp into v_emp;

dbms_output.put_line(v_emp.sal);

dbms_output.put_line(v_emp.job);

exit when c_emp%notfound;

end loop;

close c_emp;

end;

PL/SQL procedure successfully completed.

SQL> /

9000

CLERK

1600

SALESMAN

......

.......

PL/SQL procedure successfully completed.

declare

cursor c_emp is select * from emp;

v_emp emp%rowtype;

begin

for v_emp in c_emp loop

dbms_output.put_line(v_emp.sal);

dbms_output.put_line(v_emp.job);

end loop;

end;

declare

cursor c is select * from emp;

v_emp emp%rowtype;

begin

for v_emp in c loop

dbms_output.put_line(v_emp.sal);

dbms_output.put_line(v_emp.job);

end loop;

end;

Page # 44 of 65

declare cursor c is select * from emp; r emp%rowtype;

begin for r in c loop

dbms_output.put_line(r.sal); dbms_output.put_line(r.job);

end loop;

end;

declare

cursor c_emp is select * from emp; v_emp c_emp%rowtype;

begin open c_emp; loop fetch c_emp into v_emp;

dbms_output.put_line(v_emp.ename); dbms_output.put_line(v_emp.sal); dbms_output.put_line(v_emp.job);

exit when c_emp%notfound; end loop;

close c_emp;

end;

declare cursor c_emp is select * from emp; v_emp c_emp%rowtype;

begin for v_emp in c_emp loop

dbms_output.put_line(v_emp.ename); dbms_output.put_line(v_emp.sal); dbms_output.put_line(v_emp.job);

end loop;

end;

DECLARE V_EMP EMP%ROWTYPE; CURSOR C_EMP IS SELECT * INTO V_EMP FROM EMP

WHERE DEPTNO = 10; BEGIN OPEN C_EMP; LOOP FETCH C_EMP INTO V_EMP; EXIT WHEN C_EMP%NOTFOUND; DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME); END LOOP; END;

Cursor for Loop BEGIN FOR I IN (SELECT * FROM EMP) LOOP DBMS_OUTPUT.PUT_LINE(I.ENAME); END LOOP; END;

Page # 45 of 65

Procedures declare

x number;

begin

x := 10;

end;

declare

x number;

begin

x := 10;

end;

declare

x number;

begin

x := 10;

dbms_output.put_line(x);

end;

declare

y number;

begin

y := 10;

dbms_output.put_line(y);

end;

declare

y number;

x varchar2(20);

begin

y := 10;

x := 'hafeez';

dbms_output.put_line(y);

dbms_output.put_line(x);

end;

declare

x number;

y varchar2(20);

begin

x := 10;

y := 'hafeez';

dbms_output.put_line(x);

dbms_output.put_line(y);

end;

Page # 46 of 65

declare

x number;

y varchar2(20);

begin

x := 10;

y := 'hafeez';

dbms_output.put_line(y);

dbms_output.put_line(x);

end;

declare

x number := 30;

y varchar2(20) := 'nadeem';

begin

dbms_output.put_line(y);

dbms_output.put_line(x);

end;

declare

x number := 30;

y varchar2(20) := 'nadeem';

begin

x := 10;

y := 'hafeez';

dbms_output.put_line(y);

dbms_output.put_line(x);

end;

declare

x number := 30;

y varchar2(20) := 'nadeem';

begin

dbms_output.put_line(y);

dbms_output.put_line(x);

x := 10;

y := 'hafeez';

dbms_output.put_line(y);

dbms_output.put_line(x);

end;

declare

x number := 30;

y varchar2(20) := 'nadeem';

begin

dbms_output.put_line(y);

dbms_output.put_line(x);

dbms_output.put_line(y);

dbms_output.put_line(x);

end;

Page # 47 of 65

declare

x constant number := 30;

y varchar2(20) := 'nadeem';

begin

dbms_output.put_line(y);

dbms_output.put_line(x);

dbms_output.put_line(y);

dbms_output.put_line(x);

end;

declare

x constant number := 30;

y varchar2(20) := 'nadeem';

begin

dbms_output.put_line(y);

dbms_output.put_line(x);

x := 10;

y := 'hafeez';

dbms_output.put_line(y);

dbms_output.put_line(x);

end;

declare

x constant number := 30;

y varchar2(20) := 'nadeem';

begin

dbms_output.put_line(y);

dbms_output.put_line(x);

y := 'hafeez';

dbms_output.put_line(y);

dbms_output.put_line(x);

end;

declare

x number;

begin

select sal

into x

from emp where empno = '&no';

dbms_output.put_line(x);

end;

declare

x number;

begin

select sal

into x

from emp where empno = '&no';

dbms_output.put_line(x);

end;

Page # 48 of 65

declare

x number;

begin

x := 10/2;

dbms_output.put_line(x);

end;

declare

x number;

begin

x := 10/0;

dbms_output.put_line(x);

exception

when zero_divide then

dbms_output.put_line('dividing by zero');

end;

declare

x number;

begin

select sal

into x

from emp

where empno = 10;

dbms_output.put_line(x);

exception

when zero_divide then

dbms_output.put_line('dividing by zero');

when no_data_found then

dbms_output.put_line('No data available');

end;

declare

x number;

begin

select sal

into x

from emp;

dbms_output.put_line(x);

exception

when zero_divide then

dbms_output.put_line('dividing by zero');

when no_data_found then

dbms_output.put_line('No data available');

when too_many_rows then

dbms_output.put_line('many rows');

end;

Page # 49 of 65

declare

x number;

y number;

z varchar2(1000);

begin

select sal

into x

from emp;

dbms_output.put_line(x);

y := sqlcode;

exception

when others then

dbms_output.put_line(y);

end;

declare

x number;

y number;

z varchar2(1000);

begin

select sal

into x

from emp;

dbms_output.put_line(x);

y := sqlcode;

z := sqlerrm;

exception

when others then

dbms_output.put_line(y);

dbms_output.put_line(z);

end;

declare

x number;

y number;

z varchar2(1000);

begin

x := 10/0;

y := sqlcode;

z := sqlerrm;

exception

when others then

dbms_output.put_line(y);

dbms_output.put_line(z);

end;

Page # 50 of 65

declare

x number;

y number;

z varchar2(1000);

begin

x := 10/0;

y := sqlcode;

z := sqlerrm;

dbms_output.put_line(y);

dbms_output.put_line(z);

exception

when others then

dbms_output.put_line('hafeez');

end;

declare

x number;

y number;

z varchar2(1000);

begin

x := 10/0;

y := sqlcode;

z := sqlerrm;

dbms_output.put_line(y);

dbms_output.put_line(z);

exception

when others then

dbms_output.put_line('hafeez');

dbms_output.put_line(y);

dbms_output.put_line(z);

end;

declare

x number;

y number;

z varchar2(1000);

begin

x := 10/0;

exception

when others then

y := sqlcode;

z := sqlerrm;

dbms_output.put_line('hafeez');

dbms_output.put_line(y);

dbms_output.put_line(z);

end;

Page # 51 of 65

NAMED PROCEDURE / STORED PROCEDURE

create or replace procedure at_procedure x number; begin x := 10/2;

dbms_output.put_line(x); end; Warning: Procedure created with compilation errors. SQL> show error Errors for PROCEDURE AT_PROCEDURE: LINE/COL ERROR -------- ----------------------------------------------------------------- 2/1 PLS-00103: Encountered the symbol "X" when expecting one of the following: ( ; is with authid as cluster compress order using compiled wrapped external deterministic parallel_enable pipelined The symbol "is" was substituted for "X" to continue. SQL> ed Wrote file afiedt.buf create or replace procedure at_procedure is

x number; begin

x := 10/2; dbms_output.put_line(x);

end; SQL> / Procedure created. SQL> execute at_procedure; 5 PL/SQL procedure successfully completed. create or replace procedure at_procedure is

x number; begin

select sal into x from emp

where empno = 7902; dbms_output.put_line(x);

end; Procedure created. SQL> execute at_procedure; 3000 PL/SQL procedure successfully completed.

Page # 52 of 65

create or replace procedure at_procedure is

x number(10); y varchar2(20);

begin select sal,ename into x,y from emp where empno = 7902;

dbms_output.put_line(x); dbms_output.put_line(y);

end; SQL> / Procedure created. SQL> execute at_procedure; 3000 FORD PL/SQL procedure successfully completed. create or replace procedure at_procedure(emp_no number) is

x number(10); y varchar2(20);

begin select sal,ename into x,y from emp where empno = '&emp_no';

dbms_output.put_line(x); dbms_output.put_line(y);

end; SQL> / Enter value for emp_no: 7900 old 9: where empno = '&emp_no'; new 9: where empno = '7900'; Procedure created. SQL> execute at_procedure(7902); 950 JAMES PL/SQL procedure successfully completed. create or replace procedure at_procedure(emp_no in number) is

x number(10); y varchar2(20);

begin select sal,ename into x,y from emp where empno = emp_no;

dbms_output.put_line(x); dbms_output.put_line(y);

end; SQL> / Procedure created. SQL> execute at_procedure(7902); 3000, FORD

Page # 53 of 65

create or replace procedure at_procedure(emp_no in number,e_name out varchar2) is begin

select ename into e_name from emp where empno = emp_no;

end; SQL> / Procedure created. SQL> variable v_e_name varchar2(20); SQL> execute at_procedure(7902,:v_e_name); PL/SQL procedure successfully completed. SQL> print v_e_name V_E_NAME -------------------------------- FORD create or replace procedure at_procedure(emp_no in number,e_name out varchar2) is begin

select ename into e_name from emp where empno = emp_no; dbms_output.put_line(e_name);

end; SQL> / Procedure created. SQL> execute at_procedure(7902,:v_e_name); FORD PL/SQL procedure successfully completed. SQL> print v_e_name; V_E_NAME -------------------------------- FORD create or replace procedure at_procedure(e_no out varchar2) is begin

e_no := '('||substr(1,3)|| ')'||substr(4,3)|| '-'||substr(7);

end; SQL> / Warning: Procedure created with compilation errors. SQL> show error; Errors for PROCEDURE AT_PROCEDURE: LINE/COL ERROR -------- ----------------------------------------------------------------- 4/1 PL/SQL: Statement ignored 6/7 PLS-00306: wrong number or types of arguments in call to 'SUBSTR'

Page # 54 of 65

SQL> ed Wrote file afiedt.buf create or replace procedure at_procedure(e_no out varchar2) is begin

e_no := '('||substr(1,3)|| ')'||substr(4,3)|| '-'||substr(7);

end; SQL> / Warning: Procedure created with compilation errors. SQL> show error Errors for PROCEDURE AT_PROCEDURE: LINE/COL ERROR -------- ----------------------------------------------------------------- 4/1 PL/SQL: Statement ignored 6/7 PLS-00306: wrong number or types of arguments in call to 'SUBSTR' SQL> ed Wrote file afiedt.buf create or replace procedure at_procedure(e_no out varchar2) is begin

e_no := '('||substr(1,3)|| ')'||substr(4,3)|| '-'||substr(7,10);

end; SQL> / Procedure created. begin :v_e_no := '8001248888'; end; SQL> / PL/SQL procedure successfully completed. create or replace procedure at_procedure(e_no out varchar2) is begin

e_no := '('||substr(1,3)|| ')'||substr(4,3)|| '-'||substr(7,10);

end; SQL> / Procedure created. SQL> variable v_e_no varchar2(20); SQL> begin :v_e_no := '8001248888'; end; PL/SQL procedure successfully completed. SQL> execute at_procedure(:v_e_no); PL/SQL procedure successfully completed. SQL> print :v_e_no; V_E_NO -------------------------------- ()- create or replace procedure at_procedure(e_no in out varchar2) is begin

e_no := '('||substr(1,3)|| ')'||substr(4,3)|| '-'||substr(7,10);

end;

Page # 55 of 65

SQL> / Procedure created. SQL> variable v_e_no varchar2(20); SQL> begin :v_e_no := '8001248888'; end; PL/SQL procedure successfully completed. SQL> execute at_procedure(:v_e_no); PL/SQL procedure successfully completed. SQL> print :v_e_no; V_E_NO -------------------------------- ()- create or replace procedure at_procedure(e_no in out varchar2) is begin

e_no := '('||substr(1,3)|| ')'||substr(4,3)|| '-'||substr(7,10); dbms_output.put_line(e_no);

end; SQL> / Procedure created. SQL> variable v_e_no varchar2(20); SQL> begin :v_e_no := '8001248888'; end; PL/SQL procedure successfully completed. SQL> execute at_procedure(:v_e_no); ()- PL/SQL procedure successfully completed. SQL> print :v_e_no; V_E_NO -------------------------------- ()- create or replace procedure at_procedure(e_no in out varchar2) is begin

e_no := '('||substr(e_no,1,3)|| ')'||substr(e_no,4,3)|| '-'||substr(e_no,7); end;

SQL> / Procedure created. SQL> variable v_e_no varchar2(20); SQL> begin :v_e_no := '8001248888'; end; PL/SQL procedure successfully completed. SQL> execute at_procedure(:v_e_no); PL/SQL procedure successfully completed. SQL> print :v_e_no; V_E_NO -------------------------------- (800)124-8888

Page # 56 of 65

IN PARAMETER

CREATE OR REPLACE PROCEDURE P_EMP(P_EMPNO NUMBER) IS V_ENAME EMP.ENAME%TYPE; BEGIN SELECT ENAME INTO V_ENAME FROM EMP WHERE EMPNO = P_EMPNO; DBMS_OUTPUT.PUT_LINE(V_ENAME); END;

CREATE OR REPLACE PROCEDURE raise_salary (id IN employees.employee_id%TYPE, percent IN NUMBER) IS BEGIN

UPDATE employees SET salary = salary * (1 + percent/100) WHERE employee_id = id;

END raise_salary;

OUT PARAMETER CREATE OR REPLACE PROCEDURE P_EMP(P_EMPNO IN NUMBER, P_ENAME OUT

VARCHAR2) IS

BEGIN SELECT ENAME INTO P_ENAME FROM EMP WHERE EMPNO = P_EMPNO; END;

IN OUT PARAMETER CREATE OR REPLACE PROCEDURE P_EMP(P_EMPNO_SAL IN OUT NUMBER) IS BEGIN SELECT SAL INTO P_EMPNO_SAL FROM EMP WHERE EMPNO = P_EMPNO_SAL; END;

CREATE OR REPLACE PROCEDURE format_phone (phone_no IN OUT VARCHAR2) IS BEGIN

phone_no := '(' || SUBSTR(phone_no,1,3) || ')' || SUBSTR(phone_no,4,3) || '-' || SUBSTR(phone_no,7); END format_phone;

Page # 57 of 65

Call Procedure DECLARE X NUMBER; BEGIN P_EMP(100,X); END;

BEGIN P_EMP(100);

END; DECLARE X NUMBER := 100; BEGIN P_EMP(X);

END;

Functions

create or replace function at_function

return number

is

begin

return 20;

end;

Function created.

variable g_f number;

execute :g_f := at_function;

procedure successfully completed.

print :g_f;

G_F

----------

20

create or replace function at_function

return number

is

x number;

begin

x := 20;

return x*20;

end;

Function created.

SQL> execute :g_f := at_function;

PL/SQL procedure successfully completed.

SQL> print :g_f;

G_F

----------

400

Page # 58 of 65

create or replace function at_function(x number)

return number

is

begin

return x*20;

end;

Function created.

SQL> execute :g_f := at_function(40);

PL/SQL procedure successfully completed.

SQL> print :g_f;

G_F

----------

800

create or replace function at_function(x in number)

return number

is

begin

return x*20;

end;

Function created.

SQL> execute :g_f := at_function(12);

PL/SQL procedure successfully completed.

SQL> print :g_f;

G_F

----------

240

create or replace function at_function(x in number,y out number)

return number

is

begin

y := x*20;

return y;

end;

SQL> /

Function created.

SQL> variable g_y number;

SQL> execute :g_f := at_function(12,:g_y);

PL/SQL procedure successfully completed.

SQL> print :g_f;

G_F

----------

240

SQL> print :g_y;

G_Y

----------

240

Page # 59 of 65

create or replace function at_function(x in number,y out number) return number is

x number; begin

y := x*20; z := y*x; return z;

end; SQL> / Warning: Function created with compilation errors. SQL> show error Errors for FUNCTION AT_FUNCTION: LINE/COL ERROR -------- ----------------------------------------------------------------- 0/0 PL/SQL: Compilation unit analysis terminated 1/1 PLS-00410: duplicate fields in RECORD,TABLE or argument list are not permitted SQL> ed Wrote file afiedt.buf create or replace function at_function(x in number,y out number) return number is

z number; begin y := x*20;

z := y*x; return z;

end; SQL> / Function created. SQL> execute :g_f := at_function(13,:g_y); PL/SQL procedure successfully completed. SQL> print :g_y; G_Y ---------- 260 SQL> print :g_f; G_F ---------- 3380 create or replace function at_function(x in out number) return number is

z number; begin

x := x*20; z := x*10; return z;

end; SQL> / Function created. SQL> begin :g_f := 5; end; PL/SQL procedure successfully completed.

Page # 60 of 65

create or replace function at_function(x in out number)

return number

is

y number;

begin

x := x*20;

y := x*10;

return y;

end;

SQL> /

Function created.

SQL> begin :g_f := 5; end;

PL/SQL procedure successfully completed.

SQL> execute :g_f := at_function(:g_f);

PL/SQL procedure successfully completed.

SQL> print :g_f;

G_F

----------

1000

SQL> execute :g_y := at_function(:g_f);

PL/SQL procedure successfully completed.

SQL> print :g_y;

G_Y

----------

200000

SQL> print :g_f;

G_F

----------

20000

CREATE OR REPLACE FUNCTION F_EMP(P_EMPNO IN NUMBER) RETURN VARCHAR2 IS

V_EMP EMP%ROWTYPE; BEGIN SELECT ENAME INTO P_ENAME FROM EMP WHERE EMPNO = P_EMPNO; END; CREATE OR REPLACE FUNCTION tax(value IN NUMBER) RETURN NUMBER IS BEGIN

RETURN (value * 0.08); END tax; SELECT employee_id, last_name, salary, tax(salary) FROM employees WHERE department_id = 100;

CALL FUNCTION SELECT F_EMP(7788) FROM DUAL;

Page # 61 of 65

Package CREATE OR REPLACE PACKAGE comm_pkg IS std_comm NUMBER := 0.10; --initialized to 0.10 PROCEDURE reset_comm(new_comm NUMBER); END comm_pkg; CREATE OR REPLACE PACKAGE BODY comm_pkg IS FUNCTION validate(comm NUMBER) RETURN BOOLEAN IS max_comm employees.commission_pct%type; BEGIN

SELECT MAX(commission_pct) INTO max_comm FROM employees; RETURN (comm BETWEEN 0.0 AND max_comm);

END validate; PROCEDURE reset_comm (new_comm NUMBER) IS BEGIN

IF validate(new_comm) THEN std_comm := new_comm; -- reset public var

ELSE RAISE_APPLICATION_ERROR(-20210, 'Bad Commission'); END IF;

END reset_comm; END comm_pkg; CREATE OR REPLACE PACKAGE BODY comm_pkg IS ... PROCEDURE reset_comm(new_comm NUMBER) IS BEGIN

IF validate(new_comm) THEN std_comm := new_comm;

ELSE ... END IF;

END reset_comm; END comm_pkg; CREATE OR REPLACE PACKAGE dept_pkg IS PROCEDURE add_department(deptno NUMBER, name VARCHAR2 := 'unknown', loc NUMBER := 1700); PROCEDURE add_department( name VARCHAR2 := 'unknown', loc NUMBER := 1700); END dept_pkg; CREATE OR REPLACE PACKAGE taxes_pkg IS FUNCTION tax (value IN NUMBER) RETURN NUMBER; END taxes_pkg; CREATE OR REPLACE PACKAGE BODY taxes_pkg IS FUNCTION tax (value IN NUMBER) RETURN NUMBER IS rate NUMBER := 0.08; BEGIN RETURN (value * rate); END tax; END taxes_pkg;

SOME OF BUILTIN PACKAGE DBMS_ALERT DBMS_LOCK DBMS_SESSION DBMS_OUTPUT HTP UTL_FILE UTL_MAIL DBMS_SCHEDULER

Page # 62 of 65

TRIGGER

create or replace trigger at_trig

before update

on emp

begin

if (to_char(sysdate,'24HH') not between '08' and '18') then

raise_application_trigger(-20001,'Date canot be same');

end if;

end; SQL> /

Warning: Trigger created with compilation errors.

SQL> show error

Errors for TRIGGER AT_TRIG: LINE/COL ERROR

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

3/1 PLS-00201: identifier 'RAISE_APPLICATION_TRIGGER' must be

declared

3/1 PL/SQL: Statement ignored

SQL> ed

Wrote file afiedt.buf

create or replace trigger at_trig

before update

on emp

begin

if (to_char(sysdate,'24HH') not between '08' and '18') then

raise_application_error(-20001,'Date canot be same');

end if;

end;

create or replace trigger at_trig

before update

on emp

begin

if (to_char(sysdate,'24HH') not between '08' and '18') or

to_char(sysdate,'dy') in ('sat','sun') then

raise_application_error(-20001,'Date canot be same');

end if;

end;

create or replace trigger at_trig

before update

on emp

begin

if (to_char(sysdate,'24HH') not between '08' and '18') or

to_char(sysdate,'dy') in ('sat','sun') then

raise_application_error(-20001,'Date canot be same');

end if;

end;

Trigger created.

Page # 63 of 65

create or replace trigger at_trig

before update

on emp

begin

if (to_char(sysdate,'24HH') not between '08' and '18') or

to_char(sysdate,'dy') in ('sat','sun') then

raise_application_error(-20001,'Date canot be same');

end if;

end;

10 .

SQL> /

Trigger created.

create or replace trigger at_trig

before update

on emp

begin

if (to_char(sysdate,'HH24') not between '08' and '18') or

to_char(sysdate,'dy') in ('sat','sun') then

raise_application_error(-20001,'Date canot be same');

end if;

end;

SQL> /

Trigger created.

SQL> /

1 row updated.

create or replace trigger at_trig

before update or delete or insert

on emp

begin

if (to_char(sysdate,'HH24') not between '08' and '18') or

to_char(sysdate,'dy') in ('sat','sun') then

raise_application_error(-20001,'Date canot be same');

end if;

end;

SQL> /

Trigger created.

create or replace trigger at_trig

after update or delete or insert

on emp

begin

if (to_char(sysdate,'HH24') not between '08' and '18') or

to_char(sysdate,'dy') in ('sat','sun') then

raise_application_error(-20001,'Date canot be same');

end if;

end;

SQL> /

Trigger created.

Page # 64 of 65

create or replace trigger at_trig

after update or delete or insert

on emp

begin

if (to_char(sysdate,'HH24') not between '08' and '18') or

to_char(sysdate,'dy') in ('sat','sun') then

raise_application_error(-20001,'Date canot be same');

end if;

end;

SQL> /

Trigger created.

create or replace trigger at_trig

after update or delete or insert

on emp

for each row

begin

if :new.sal > 6000 then

raise_application_error(-20001,'salary more than');

end if;

end;

SQL> /

Trigger created.

SQL> udpate emp set sal = 4000 where empno = 48;

SP2-0734: unknown command beginning "udpate emp..." - rest of line ignored.

SQL> update emp set sal = 4000 where empno = 48;

1 row updated.

create or replace trigger at_trig

after update or delete or insert

on emp

for each row

begin

insert into chor values(user,sysdate,:old.sal,:new.sal);

end;

Trigger created.

SQL> select * from chor;

no rows selected

SQL> upate emp set sal = 3200 where empno = 48;

SP2-0734: unknown command beginning "upate emp ..." - rest of line ignored.

SQL> update emp set sal = 3400 where empno = 48;

1 row updated.

SQL> select * from chor;

SQL> update emp set sal=2300 where empno = 48;

1 row updated.

SQL> insert into emp(empno,sal) values(200,4500);

1 row created.

Page # 65 of 65

CREATE OR REPLACE TRIGGER INS_EMP AFTER INSERT OR DELETE OR UPDATE OF SAL ON EMP REFERENCES NEW AS N OLD AS O FOR EACH ROW BEGIN IF INSERTING THEN

INSERT INTO EMP1(EMPNO,ENAME,JOB) VALUES (: ELSIF UPDATING THEN UPDATE EMP1 SET SAL = :N.SAL WHERE EMPNO = :O.EMPNO; ELSIF DELETING THEN DELETE FROM EMP WHERE EMPNO = :O.EMPNO; END IF; END;

CREATE OR REPLACE TRIGGER secure_emp BEFORE INSERT ON employees BEGIN IF (TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR (TO_CHAR(SYSDATE,'HH24:MI') NOT BETWEEN '08:00' AND '18:00') THEN RAISE_APPLICATION_ERROR(-20500, 'You may insert' ||' into EMPLOYEES table only during ' ||' business hours.'); END IF; END; CREATE OR REPLACE TRIGGER restrict_salary BEFORE INSERT OR UPDATE OF salary ON employees FOR EACH ROW BEGIN IF NOT (:NEW.job_id IN ('AD_PRES', 'AD_VP')) AND :NEW.salary > 15000 THEN RAISE_APPLICATION_ERROR (-20202, 'Employee cannot earn more than $15,000.'); END IF; END; INSERT INTO employees (employee_id, last_name, job_id, salary, ...) VALUES (999, 'Temp emp', 'SA_REP', 6000,...); UPDATE employees SET salary = 7000, last_name = 'Smith' WHERE employee_id = 999; CREATE OR REPLACE TRIGGER logon_trig AFTER LOGON ON SCHEMA BEGIN INSERT INTO log_trig_table(user_id,log_date,action) VALUES (USER, SYSDATE, 'Logging on'); END; / CREATE OR REPLACE TRIGGER logoff_trig BEFORE LOGOFF ON SCHEMA BEGIN INSERT INTO log_trig_table(user_id,log_date,action) VALUES (USER, SYSDATE, 'Logging off'); END;