Wednesday, 23 August 2017

printing values from ref cursor using anonymous block

------------------------------------simple cursor------------------------------------------------------------------
set serveroutput on;
declare
cursor c_emp is
select ename,deptno,hiredate from emp
where months_between(sysdate,hiredate)/12 > 30
order by hiredate desc;
begin
for c_var in c_emp
loop
dbms_output.put_line(c_var.ename||' '||c_var.deptno||' '||c_var.hiredate);
end loop;
end;
-------------------------------------using for loop sub-qury ------------------------------------------------------
set serveroutput on;
declare

begin
for c_var in (
select ename,deptno,hiredate from emp
where months_between(sysdate,hiredate)/12 > 30
order by hiredate desc)
loop
dbms_output.put_line(c_var.ename||' '||c_var.deptno||' '||c_var.hiredate);
end loop;
end;
----------------------using cursor dml operation through multiple rows---------------------------------
set serveroutput on;
declare

begin
for c_var in (
select empno,sal,ename,deptno,hiredate from emp
where months_between(sysdate,hiredate)/12 > 30
order by hiredate desc)
loop
update emp set sal=c_var.sal+100 where empno=c_var.empno;
--dbms_output.put_line(c_var.empno||'  '||c_var.sal||' '||c_var.ename||' '||c_var.deptno||' '||c_var.hiredate);
end loop;
end;
/
select * from emp;
-----------------------------------displaying multiple data using ref_cursor----------------------------
create or replace
procedure ref_proc
(po_result out SYS_REFCURSOR )

as
begin
open po_result for
select empno,sal,ename,deptno,hiredate from emp
where months_between(sysdate,hiredate)/12 > 30
order by hiredate desc;

end;
-- -----------------displaying values from ref cursor using anonymous block---------------------
set serveroutput on;
set autoprint on;
var r refcursor;
DECLARE
  PO_RESULT SYS_REFCURSOR;
BEGIN

  REF_PROC(
    PO_RESULT => :r
  );
  /* Legacy output:
DBMS_OUTPUT.PUT_LINE('PO_RESULT = ' || PO_RESULT);
*/
--  :PO_RESULT := PO_RESULT; --<-- Cursor
END;


how to see and delete duplicate rows .

select mgr,count(*) from emp
group by mgr
having count(*) >1;

MGRCOUNT(*)
78393
76985
75662

DELETE FROM your_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM your_table
GROUP BY column1, column2, column3);

example-
select * from emp
where rowid not in (select min(rowid) from emp group by mgr);
EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
7844TURNERSALESMAN769808-09-19811500030
7900JAMESCLERK769803-12-1981950 30
7654MARTINSALESMAN769828-09-19811250140030
7698BLAKEMANAGER783901-05-19812850 30
7902FORDANALYST756603-12-19813000 20
7521WARDSALESMAN769822-02-1981125050030
7782CLARKMANAGER783909-06-19812450 10