Oracle Etiketli Yazılar

Oracle – “ORA-01000: maximum open cursors exceeded” hatası

Bu hata Oracle Sistem Parametrelerinde belirtilen açık cursor değerinin üzerine çıkıldığında alınır.

Aşağıdaki sorgular ile,
Oracle parametrelerindeki değeri görebilir,
Kullanılan cursor adetlerini izleyebilir
ve open_cursors değerini değiştirebilirsiniz.

--Oracle Parametrelerindeki "open_cursors" değerini gösterir.
SELECT a.NAME, a.VALUE, upper(i.instance_name) instance_name
FROM v$parameter a, v$instance i
Where name='open_cursors'

-- Oracleda Kullanılan Cursor Adetlerini gösterir
Select s.username "User",sum(a.value) "Toplam Cursor", avg(a.value) "Ortalama", max(a.value) "Max", s.machine "Makine"
From v$sesstat a, v$statname b, v$session s
where a.statistic# = b.statistic# and s.sid=a.sid
and b.name = 'opened cursors current'
group by s.username, s.machine
order by "Toplam Cursor" desc

--Oracle Parametrelerindeki "open_cursors" değerini update eder.
ALTER SYSTEM SET open_cursors = 5000 SCOPE=BOTH;

Oracle – PL/SQL ile Mail Gönderme

--Öncelikle göndermek için gereken yetkileri tanımlıyoruz,
--1
BEGIN
dbms_network_acl_admin.create_acl (
acl => 'cahari.xml',
description => 'mai atmak için',
principal => 'tablespace yazın',
is_grant => true,
privilege => 'connect',
start_date => null,
end_date => null
);
END;

--2
begin
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl => 'cahari.xml',
principal => 'tablespace yazın',
is_grant => true,
privilege => 'resolve');
end;

--3
begin
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl => 'cahari.xml',
host => 'Buraya host ip yi yazıyoruz.');
end;

--4
--Procedure yaratılıyor
create or replace
PROCEDURE MailGonder
( sender IN VARCHAR2,
recipient IN VARCHAR2,
subject IN VARCHAR2,
message IN VARCHAR2)
IS
mailhost VARCHAR2(30) := '10.10.13.253';
mail_conn utl_smtp.connection;
crlf VARCHAR2( 2 ):= CHR( 13 ) || CHR( 10 );
mesg VARCHAR2( 1000 );

BEGIN
mail_conn := utl_smtp.open_connection(mailhost, 25);

mesg:= 'Date: ' || TO_CHAR( SYSDATE, 'dd Mon yy hh24:mi:ss' ) || crlf
||
'From: <'||sender||'>' || crlf ||
'Subject: '||subject || crlf ||
'To: '||recipient || crlf ||
''||crlf||
'MIME-Version: 1.0'||crlf|| message;

utl_smtp.helo(mail_conn, mailhost);
utl_smtp.mail(mail_conn, sender);
utl_smtp.rcpt(mail_conn, recipient);
utl_smtp.data(mail_conn, mesg);
utl_smtp.quit(mail_conn);

Exception
WHEN OTHERS THEN
raise_application_error(-20002,'Mail Gönderilemedi'||SQLERRM);
END;

--5
--Kullanım şekli
Begin
MailGonder('orhan@mail.com','orhan@mail.com','Konu','Deneme mesajı');
End;

Oracle – Session Monitor SQL

SELECT 
s.SCHEMANAME,
s.USERNAME,
UPPER(s.PROGRAM) PROGRAM,
 s.MACHINE,
 s.OSUSER,
s.MODULE
FROM V$SESSION S, V$PROCESS p,
      (SELECT DISTINCT SID, SERIAL#, AUTHENTICATION_TYPE, CLIENT_CHARSET, CLIENT_VERSION FROM V$SESSION_CONNECT_INFO) SCI
 WHERE  ( (s.USERNAME is not null) and (NVL(s.osuser,'x') <> 'SYSTEM') and (s.type <> 'BACKGROUND') )
and  p.addr(+) = s.paddr
and  sci.sid = s.sid and sci.serial# = s.serial#
order by "PROGRAM", OWNERID

Oracle – Tekrar eden kayıtları silmek

Silinecek Tekrarları Listelemek için;

SELECT * FROM tabloadi x
WHERE x.rowid > ( SELECT MIN(y.rowid) FROM tabloadi y WHERE x.tekrarfield= y.tekrarfield)

Tekrarları Silmek için;

DELETE FROM  tabloadi x
WHERE x.rowid > ( SELECT MIN(y.rowid)  FROM tabloadi y  WHERE x.tekrarfield = y.tekrarfield );

Oracle – Tablo Veri Boyutları (MB)

SELECT
owner AS "OWNER",
segment_name AS "OBJECT",
partition_name AS "PARTITION",
tablespace_name AS "TABLESPACE",
segment_type AS "TYPE",
ROUND (bytes / 1024 / 1024, 2)  AS "Boyut(MB)"
FROM dba_segments
WHERE segment_type IN ('TABLE', 'TABLE PARTITION')
AND owner = 'ABALI2011'
Order by ROUND (bytes / 1024 / 1024, 2) desc

Oracle – LISTAGG Analystic Function

LISTAGG fonksiyonu, 11gR2 ile gelen yeni bir fonksiyondur.

Kullanımı: LISTAGG(kolonadi,ayraç)

Anlatımımızı örnekle yapalım;
Şu şekilde bir tablomuz olduğunu varsayalım;

Depertman        Personel
Muhasebe           Fikret
Muhasebe           Ceyda
Satınalma            Turan
Satınalma            Emel

Her depertman satırının karşısında kişileri listelemek isteyelim,

Depertman          Personel
Muhasebe            Fikret,Ceyda
Satınalma             Turan,Emel

bu tip bir listelemeyi LISTAGG fonksiyonu kullanarak yapabiliriz.

Select Depertman, LISTAGG(Personel,',') as "Personeller" from tblSicil Group by Depertman

Daha önce kullandığımız ve aynı işi yapan WM_CONCAT ile arasındaki farklar ise şunlardır.

1-WM_CONCAT Oracle tarafından dökümante edilmemiştir, yani desteklenmez.LISTAGG ise Oracle tarafından desteklenen bir fonksiyondur.

2-WM_CONCAT, distinct kullanımına izin verir, LISTAGG ile kullanamazsınız.

select wm_concat(distinct sehir) as sehirler from Ulkeler;

3-LISTAGG ayrılmış dizelerin kendi içinde order ına izin verir, WM_CONCAT de yapılamaz.

select listagg(sehir,',') within group(order by sehirID desc) as sehirler from Ulkeler;

4-LISTAGG ayraç olarak birden fazla karakter kullanımına izin verir, WM_CONCAT buna izin vermez.

select listagg(sehir,'***') within group(order by sehirID desc) as sehirler from Ulkeler;

5-WM_CONCAT keep kullanımına izin verir, LISTAGG izin vermez.

select wm_concat(sehir) keep(dense_rank first order by sehirID ) as sehirler from Ulkeler;

6-WM_CONCAT olap da order by kullanımına izin verir, LISTAGG izin vermez.LISTAGG order by haricinde OLAP da desteklenir.

select deptno,wm_concat(sehir) over(order by sehirID ) as enames from Ulkeler;