You are on page 1of 11

What are the Type of Triggers?

1. Before
2. After
3. ROW
4. Table
5. INSERT
6. UPDATE
7. DELETE
8. ALL
9. BEFORE ALL ROW INSERT
10. AFTER ALL ROW INSERT
11. BEFORE INSERT
12. AFTER INSERT
=============================================
The main difference between statement level trigger?

statement level trigger : based on name it works if any statement is executed.


Does not depends on how many rows or any rows effected.It executes only once.
Exp : if you want to update salary of every employee from department HR and at the
end you want to know how many rows get effected
means how many got salary increased then use statement level trigger. please note
that trigger will execute even if zero rows get updated
because it is statement level trigger is called if any statement has been executed.
No matters if it is affecting any rows or not.

Row level trigger : executes each time when an row is affected.


if zero rows affected.no row level trigger will execute.suppose if u want to delete
one employye from emp table whose department
is HR and u want as soon as employee deleted from emp table the count in dept table
from HR section should be reduce by
1.then you should opt for row level trigger.
=======================================================
Deleting duplicate records?
1. Using rowid

SQL > delete from emp


where rowid not in
(select max(rowid) from emp group by empno);

This technique can be applied to almost scenarios. Group by operation should be on


the columns which identify the duplicates.

2. Using self-join

SQL > delete from emp e1


where rowid not in
(select max(rowid) from emp e2
where e1.empno = e2.empno );

3. Using row_number()

SQL > delete from emp where rowid in


(
select rid from
(
select rowid rid,
row_number() over(partition by empno order by empno) rn
from emp
)
where rn > 1
);

This is another efficient way to delete duplicates

4. Using dense_rank()

SQL > delete from emp where rowid in


(
select rid from
(
select rowid rid,
dense_rank() over(partition by empno order by rowid) rn
from emp
)
where rn > 1
);

Here you can use both rank() and dens_rank() since both will give unique records
when order by rowid.

5. Using group by

Consider the EMP table with below rows

10 Bill 2000
11 Bill 2000
12 Mark 3000
13 Mark 3000

SQL > delete from emp where


(empno,empname,salary) in
(
select max(empno),empname,salary from emp
group by empname,salary
);
----------------------------
***replace column data.
SELECT * FROM emp ORDER BY empid ASC;
UPDATE emp
SET DEPTNO = (decode(deptno,20,30,30,20))
WHERE deptno IN(20,30);

SELECT e.*,e.rowid FROM emp e;

SELECT *,
FROM emp
AS OF TIMESTAMP TO_TIMESTAMP('14-OCT-2015 02:00:00');

SELECT * FROM dept; --FK_DEPTNO ,, PK_DEPT


SELECT * FROM emp;
SELECT * FROM user_constraints WHERE table_name IN ('EMP','DEPT');

INSERT INTO EMP VALUES(8588,'SDFD','HR','7849',SYSDATE,5458,200,60) ;

DELETE FROM EMP WHERE EMPID=8888;

ALTER TABLE EMP ENABLE NOVALIDATE CONSTRAINT FK_DEPTNO ;


ALTER TABLE DEPT ENABLE NOVALIDATE CONSTRAINT PK_DEPT ;

ALTER TABLE EMP ADD CONSTRAINT FK_DEPTNO FOREIGN KEY(DEPTNO) REFERENCES


DEPT(DEPTNO);
ALTER TABLE DEPT ADD CONSTRAINT PK_DEPT PRIMARY KEY(DEPTNO);

INSERT INTO emp ( SELECT *


FROM emp
AS OF TIMESTAMP TO_TIMESTAMP('14-OCT-2015 02:00:00'));

SELECT * FROM emp;


-----------------------------------------------------------------------------------
-----------
* first day of the month
SELECT TRUNC (SYSDATE, 'MONTH') "First day of current month"
FROM DUAL;
------------------------------------------------------------------------------
* last day of the month
SELECT TRUNC (LAST_DAY (SYSDATE)) "Last day of current month"
FROM DUAL;
--------------------------------------------------------------------------
* first day of the year
SELECT TRUNC (SYSDATE, 'YEAR') "Year First Day" FROM DUAL;

----------------------------------------------
* last day of the year
SELECT ADD_MONTHS (TRUNC (SYSDATE, 'YEAR'), 12) - 1 "Year Last Day" FROM DUAL;
-----------------------------------------
* number_of_days in month
SELECT CAST (TO_CHAR (LAST_DAY (SYSDATE), 'dd') AS INT) number_of_days
FROM DUAL;
-------------------------------------------------

* number of days left in current month


SELECT SYSDATE,
LAST_DAY (SYSDATE) "Last",
LAST_DAY (SYSDATE) - SYSDATE "Days left"
FROM DUAL;
--------------------------------------------------------------
* number of days between two dates
SELECT ROUND ( (MONTHS_BETWEEN ('01-Feb-2014', '01-Mar-2012') * 30), 0)
num_of_days
FROM DUAL;
--OR

SELECT TRUNC(sysdate) - TRUNC(e.hire_date) FROM employees;


------------------------------------------------------------------------
* Display each months start and end date upto last month of the year
SELECT ADD_MONTHS (TRUNC (SYSDATE, 'MONTH'), i) start_date,
TRUNC (LAST_DAY (ADD_MONTHS (SYSDATE, i))) end_date
FROM XMLTABLE (
'for $i in 0 to xs:int(D) return $i'
PASSING XMLELEMENT (
d,
FLOOR (
MONTHS_BETWEEN (
ADD_MONTHS (TRUNC (SYSDATE, 'YEAR') - 1, 12),
SYSDATE)))
COLUMNS i INTEGER PATH '.');
-----------------------------------------------------------------------------

* Get number of seconds passed since today (since 00:00 hr)


SELECT (SYSDATE - TRUNC (SYSDATE)) * 24 * 60 * 60 num_of_sec_since_morning
FROM DUAL;
-----------------------------------------------------------------------
* Get number of seconds left today (till 23:59:59 hr)
SELECT (TRUNC (SYSDATE+1) - SYSDATE) * 24 * 60 * 60 num_of_sec_left
FROM DUAL;
----------------------------------------------------------------------
* Check if a table exists in the current database schema
SELECT table_name
FROM user_tables
WHERE table_name = 'TABLE_NAME';
**********************************************************
* Check if a column exists in a table
SELECT column_name AS FOUND
FROM user_tab_cols
WHERE table_name = 'TABLE_NAME' AND column_name = 'COLUMN_NAME';
---------------------------------------------------------------------------
* Showing the table structure
SELECT DBMS_METADATA.get_ddl ('TABLE', 'TABLE_NAME', 'USER_NAME') FROM DUAL;
-----------------------------------------------------------
* Getting current schema
SELECT SYS_CONTEXT ('userenv', 'current_schema') FROM DUAL;
---------------------------------------------------------------
*Changing current schema
ALTER SESSION SET CURRENT_SCHEMA = new_schema;
-----------------------------------------------------------
* Database version information
SELECT * FROM v$version;
-----------------------------------------------
* Database default information --not sure
SELECT username,
profile,
default_tablespace,
temporary_tablespace
FROM dba_users;
----------------------------------------------------------
* Database Character Set information
SELECT * FROM nls_database_parameters;
------------------------------------------------------------
* Get Oracle version --not sure
SELECT VALUE
FROM v$system_parameter
WHERE name = 'compatible';
-----------------------------------------------------------
* Store data case sensitive but to index it case insensitive
CREATE TABLE tab (col1 VARCHAR2 (10));

CREATE INDEX idx1


ON tab (UPPER (col1));

ANALYZE TABLE a COMPUTE STATISTICS;


-----------------------------------------------------------
* Resizing Tablespace without adding datafile
ALTER DATABASE DATAFILE '/work/oradata/STARTST/STAR02D.dbf' resize 2000M;
----------------------------------------------------------------------
* Checking autoextend on/off for Tablespaces
SELECT SUBSTR (file_name, 1, 50), AUTOEXTENSIBLE FROM dba_data_files;

--OR

SELECT tablespace_name, AUTOEXTENSIBLE FROM dba_data_files;


------------------------------------------------------------------
* Adding datafile to a tablespace
ALTER TABLESPACE data01 ADD DATAFILE '/work/oradata/STARTST/data01.dbf'
SIZE 1000M AUTOEXTEND OFF;
--------------------------------------------------------------------

* Increasing datafile size


ALTER DATABASE DATAFILE '/u01/app/Test_data_01.dbf' RESIZE 2G;
---------------------------------------------------------------
* Find the Actual size of a Database
SELECT SUM (bytes) / 1024 / 1024 / 1024 AS GB FROM dba_data_files;
----------------------------------------------------------------
* Find the size occupied by Data in a Database or Database usage details
SELECT SUM (bytes) / 1024 / 1024 / 1024 AS GB FROM dba_segments;
---------------------------------------------------------------
* Find the size of the SCHEMA/USER
SELECT SUM (bytes / 1024 / 1024) "size"
FROM dba_segments
WHERE owner = '&owner';
--------------------------------------------------
* Last SQL fired by the User on Database

SELECT S.USERNAME || '(' || s.sid || ')-' || s.osuser UNAME,


s.program || '-' || s.terminal || '(' || s.machine || ')' PROG,
s.sid || '/' || s.serial# sid,
s.status "Status",
p.spid,
sql_text sqltext
FROM v$sqltext_with_newlines t, V$SESSION s, v$process p
WHERE t.address = s.sql_address
AND p.addr = s.paddr(+)
AND t.hash_value = s.sql_hash_value
ORDER BY s.sid, t.piece;
-------------------------------------------------------------------------
* CPU usage of the USER
SELECT ss.username, se.SID, VALUE / 100 cpu_usage_seconds
FROM v$session ss, v$sesstat se, v$statname sn
WHERE se.STATISTIC# = sn.STATISTIC#
AND NAME LIKE '%CPU used by this session%'
AND se.SID = ss.SID
AND ss.status = 'ACTIVE'
AND ss.username IS NOT NULL
ORDER BY VALUE DESC;
------------------------------------------------------------------------
* Long Query progress in database
SELECT a.sid,
a.serial#,
b.username,
opname OPERATION,
target OBJECT,
TRUNC (elapsed_seconds, 5) "ET (s)",
TO_CHAR (start_time, 'HH24:MI:SS') start_time,
ROUND ( (sofar / totalwork) * 100, 2) "COMPLETE (%)"
FROM v$session_longops a, v$session b
WHERE a.sid = b.sid
AND b.username NOT IN ('SYS', 'SYSTEM')
AND totalwork > 0
ORDER BY elapsed_seconds
---------------------------------------------------------------------------
* Get current session id, process id, client process id?
SELECT b.sid,
b.serial#,
a.spid processid,
b.process clientpid
FROM v$process a, v$session b
WHERE a.addr = b.paddr AND b.audsid = USERENV ('sessionid');
---------------------------------------------------------------------------
* Last SQL Fired from particular Schema or Table
SELECT CREATED, TIMESTAMP, last_ddl_time
FROM all_objects
WHERE OWNER = 'MYSCHEMA'
AND OBJECT_TYPE = 'TABLE'
AND OBJECT_NAME = 'EMPLOYEE_TABLE';
---------------------------------------------------------------------------
* Find Top 10 SQL by reads per execution
SELECT *
FROM ( SELECT ROWNUM,
SUBSTR (a.sql_text, 1, 200) sql_text,
TRUNC (
a.disk_reads / DECODE (a.executions, 0, 1, a.executions))
reads_per_execution,
a.buffer_gets,
a.disk_reads,
a.executions,
a.sorts,
a.address
FROM v$sqlarea a
ORDER BY 3 DESC)
WHERE ROWNUM < 10;
-----------------------------------------------------------------------------
* Oracle SQL query over the view that shows actual Oracle connections.
SELECT osuser,
username,
machine,
program
FROM v$session
ORDER BY osuser;
--------------------------------------------------------------------------------
* Oracle SQL query that show the opened connections group by the program that opens
the connection.
SELECT program application, COUNT (program) Numero_Sesiones
FROM v$session
GROUP BY program
ORDER BY Numero_Sesiones DESC;
-----------------------------------------------------------------------------------
------
* Oracle SQL query that shows Oracle users connected and the sessions number for
user
SELECT username Usuario_Oracle, COUNT (username) Numero_Sesiones
FROM v$session
GROUP BY username
ORDER BY Numero_Sesiones DESC;
-----------------------------------------------------------------------------------
------
* Get number of objects per owner
SELECT owner, COUNT (owner) number_of_objects
FROM dba_objects
GROUP BY owner
ORDER BY number_of_objects DESC;
-----------------------------------------------------------------------------------
----------
* Convert number to words
SELECT TO_CHAR (TO_DATE (1526, 'j'), 'jsp') FROM DUAL;
------------------------------------------------------------------------
* Convert Comma Separated Values into Table
WITH csv
AS (SELECT 'AA,BB,CC,DD,EE,FF'
AS csvdata
FROM DUAL)
SELECT REGEXP_SUBSTR (csv.csvdata, '[^,]+', 1, LEVEL) pivot_char
FROM DUAL, csv
CONNECT BY REGEXP_SUBSTR (csv.csvdata,'[^,]+', 1, LEVEL) IS NOT NULL;
------------------------------------------------------------------------------
* Find the last record from a table
SELECT *
FROM employees
WHERE ROWID IN (SELECT MAX (ROWID) FROM employees);

--OR

SELECT * FROM employees


MINUS
SELECT *
FROM employees
WHERE ROWNUM < (SELECT COUNT (*) FROM employees);
---------------------------------------------------------------------------------
* Generating Random Data In Oracle
SELECT LEVEL empl_id,
MOD (ROWNUM, 50000) dept_id,
TRUNC (DBMS_RANDOM.VALUE (1000, 500000), 2) salary,
DECODE (ROUND (DBMS_RANDOM.VALUE (1, 2)), 1, 'M', 2, 'F') gender,
TO_DATE (
ROUND (DBMS_RANDOM.VALUE (1, 28))
|| '-'
|| ROUND (DBMS_RANDOM.VALUE (1, 12))
|| '-'
|| ROUND (DBMS_RANDOM.VALUE (1900, 2010)),
'DD-MM-YYYY')
dob,
DBMS_RANDOM.STRING ('x', DBMS_RANDOM.VALUE (20, 50)) address
FROM DUAL
CONNECT BY LEVEL < 10000;
-------------------------------------------------------------------------------
* Generating Random number In Oracle
SELECT ROUND (DBMS_RANDOM.VALUE () * 100) + 1 AS random_num FROM DUAL;
------------------------------------------------------------------------------
* Check if table contains any data
SELECT 1
FROM TABLE_NAME
WHERE ROWNUM = 1;
===========================================================================19-OCT-
2015==================================================
Word To Number conversion

SELECT LEVEL

FROM dual

WHERE to_char(to_date(LEVEL,'J'), 'JSP') = UPPER('seven')

CONNECT BY to_char(to_date(LEVEL-1,'J'), 'JSP') != UPPER('seven')

AND LEVEL < 99999999;


=====================================================
** Explain Plan
SELECT PLAN_TABLE_OUTPUT
FROM TABLE(DBMS_XPLAN.DISPLAY('Table name', 'statement_id','BASIC'));
A format option that determines the level of detail: BASIC, SERIAL, and TYPICAL,
ALL

======================

avinash.more@irclass.org,
deepa.palmar@irclass.org
===================================================================================
==========================================================
SET SERVEROUTPUT ON SIZE 1000000
DECLARE
TYPE t_collection IS VARRAY(5) OF NUMBER(10);

l_coll t_collection;
l_idx NUMBER;
BEGIN
-- Initialise the collection with two values.
l_coll := t_collection(1, 2);

-- Extend the collection with extra values.


<< load_loop >>
FOR i IN 3 .. 5 LOOP
l_coll.extend;
l_coll(l_coll.last) := i;
END LOOP load_loop;

-- Can't delete from a VARRAY.


-- l_coll.DELETE(3);

-- Traverse collection
l_idx := l_coll.FIRST;
<< display_loop >>
WHILE l_idx IS NOT NULL LOOP
DBMS_OUTPUT.PUT_LINE('The number ' || l_coll(l_idx));
l_idx := l_coll.NEXT(l_idx);
END LOOP display_loop;
END;

===================================================================================
==============================================================
MARGE QUERY
MERGE INTO bonuses b
USING (
SELECT employee_id, salary, dept_no
FROM employee
WHERE dept_no =20) e
ON (b.employee_id = e.employee_id)
WHEN MATCHED THEN
UPDATE SET b.bonus = e.salary * 0.1
DELETE WHERE (e.salary < 40000)
WHEN NOT MATCHED THEN
INSERT (b.employee_id, b.bonus)
VALUES (e.employee_id, e.salary * 0.05)
WHERE (e.salary > 40000);

===================================================================================
=============================================================
order by city any order on top

SELECT * FROM demo_table


ORDER BY (CASE WHEN cname ='INDIA' THEN 1 ELSE 2 END),cname ASC

===================================================================================
===============================================================
sort Array in Oracle

DECLARE
TYPE LV_ARRAY_TYPE IS VARRAY(10) OF NUMBER;
LV_ARRAY LV_ARRAY_TYPE := LV_ARRAY_TYPE(17, 50, 51, 16, 3, 4, 1, 2, 9, 6);
SEARCHED BOOLEAN;
TEMP NUMBER;
J NUMBER:=0;
BEGIN

LOOP
BEGIN
SEARCHED := FALSE;
J := J + 1;
FOR I IN 1 .. LV_ARRAY.COUNT-J LOOP
IF (LV_ARRAY(I) > LV_ARRAY(I + 1)) THEN
BEGIN
TEMP := LV_ARRAY(I);
LV_ARRAY(I) := LV_ARRAY(I + 1);
LV_ARRAY(I + 1) := TEMP;
SEARCHED := TRUE;
END;
END IF;
END LOOP;
EXIT WHEN SEARCHED = FALSE;
END;
END LOOP;
FOR I IN 1 .. LV_ARRAY.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(LV_ARRAY(I));
END LOOP;
END;
===================================================================================
====================================================================
To find out Given Input is String or Number?

select DECODE( TRANSLATE('&ER','0123456789',' '), NULL, 'number','String')


from dual

=============================================================================
suffel order by

select * from city_demo order by dbms_random.value


===============================================================================
HiricL Query

select lpad(' ',6*(level-1)) || to_char(child) s


from test_connect_by
start with parent is null
connect by prior child = parent;

===================================new concepts=====================
oracle DBMS_SCHEDULAR

begin
DBMS_SCHEDULER.create_job(
job_name =>'t',
job_type =>'plsql_block',
job_action => 'insert into A values(a1.nextval,a2.nextval);',
start_date => sysdate,
repeat_interval => 'freq = secondly ;interval =5',
enabled => true);
end;

exec DBMS_SCHEDULER.disable('t');
exec DBMS_SCHEDULER.enable('t');
exec DBMS_SCHEDULER.drop_job('t');
======================================================
first employee of each department

select * from(select FIRST_NAME,HIRE_DATE,DEPARTMENT_ID, row_number()


over(PARTITION BY DEPARTMENT_ID ORDER BY hire_date desc )as rn from EMPLOYEES )
where rn =1

=======================Gather Table Statics=============


exec dbms_stats.gather_table_stats(user, 'A', method_opt => 'for all columns size
skewonly');
select /*+ gather_plan_statistics */ count(*) from A;
select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));

=====================REGEXP_LIKE==============================
select * from EMPLOYEES where not regexp_like(PHONE_NUMBER,'[[:digit:]]{3}.
[[:digit:]]{3}.[[:digit:]]{4}');

=====Search double vowel in their names====

select * from EMPLOYEES where regexp_like(FIRST_NAME,'([aeiou])\1','i');


===============
The following query returns the first and last names for those employees with a
first name of Steven or Stephen (where first_name begins with Ste and ends with en
and in between is either v or ph):
=================
SELECT first_name, last_name
FROM employees
WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$');

======================SQL Loader=========================
inserting data from multiple-file---and multiple-tables------------

load data
infile '/home/ramesh/employee.txt'
infile '/home/ramesh/newemployee.txt'
into table employee
fields terminated by ","
( id, name, dept, salary )
-------------------------
load data
infile '/home/ramesh/employee-bonus.txt'
into table employee
( id position(1:3),
name position(5:10),
dept position(12:21),
salary position(23:26))
into table bonus
( id position(1:3),
bonus position(28:31))
----------------------------
sqlldr scott/tiger control=/home/ramesh/sqlldr-multiple-tables.ctl

You might also like