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;