Splere Opsiyonel Input
Uğur Sak isimli arkadaşım tarafından yazılmış açıklamayı tarihe not düşüyorum. Dikkat faydalıdır.
İhtiyaçtan dolayı finansal splerimize opsiyonel input eklememiz gerekti. Benim gibi daha önce bilmeyenler varsa bilgi vermeye çalışalım. Parametrik olarak yarattığınız input gelmediği zaman otomatik null değeri ile doldurulur.
Örnek bir sp ile açıklamaya çalışalım. pi_test3 ve pi_test4 ün opsiyonel olduğu bir sp yaratalım.
CREATE OR REPLACE PROCEDURE Deneme (pi_test1 IN VARCHAR2,
pi_test2 IN VARCHAR2,
pi_test3 IN VARCHAR2 DEFAULT NULL, —-parametrik input
pi_test4 IN VARCHAR2 DEFAULT NULL) —-parametrik inputReferans Vermeden Çağırma;
Var olan splerimiz de böyle bir input eklerseniz sona eklemeniz gerekmektedir. Sebebi spleri kullandığımız yerde referanssız olarak çağırıyoruz. Ya bu kullanımları düzeltmemiz gerekiyor yada tek input eklemenizi tavsiye ediyoruz.
Çünkü referanssız olarak çağırdığımızda spler input sırasına göre atama yapıyor.Deneme ( ‘1’,’2’); olarak çağırabiliriz.
Deneme ( ‘1’,’2’,’3’); olarak çağırabiliriz.
Deneme ( ‘1’,’2’,’3’,’4’); olarak çağırabiliriz.
Deneme ( ‘1’,’2’,’4’); olarak çağıramayız. Çağırırsak pi_test3 e = 4 değeri atanmış olur.Referans Vererek Çağırma;
Deneme (pi_test1 => ‘1’,
pi_test2 => ‘2’,
pi_test3 => ‘3’,
pi_test4 => ‘4’)Deneme (pi_test1 => ‘1’,
pi_test2 => ‘2’Deneme (pi_test1 => ‘1’,
pi_test2 => ‘2’,
pi_test3 => ‘3’)Deneme (pi_test1 => ‘1’,
pi_test2 => ‘2’,
pi_test4 => ‘4’)
Sql Server Numeric Hk. İvedi Açıklama
Oracle’da bir numeric tanımlama yaptığızda şu şekildedir :
number(4,3) –> 9999,999 ‘a kadar.
Fakat Sql Server’da bu biraz değişikmiş :
numeric(4,3) –> 9,999 ‘a kadar.
Acı tecrübe ile sabittir.
Birden fazla kolonu IN ile kullanmak
Bu kadar :
SELECT *
FROM hayvanlar h
WHERE(h.adi, h.ailesi, h.ayak_sayisi)
IN
(SELECT o.adi,o.ailesi,o.ayak_sayisi
FROM hayvan_ozellikleri o
WHERE o.adi = ‘MAYMUN’)
Fakat statik değerler ile kullanmaya izin vermiyor. yani ” IN ((‘TOPAÇ’,’KÖPEK’,’4′),(‘BONCUK’,’AT’,’4′)) ” şeklinde kullanılmıyor.
Oracle’da bir sub procedure dışarıdan kullanılabilir mi ?
Hayır.
OrnekProcedure.AltProcedure(p1,p2);
şeklinde bir kullanım olmuyor.
Oracle – Ref Cursor , Oracle’da sonuç olarak tablo dönmek
Aşağıdaki prosedür out parametresi olarak bir cursor dönecek. Dönen bu cursor diğer bir prosedür içerisinde kullanılabilir.
CREATE OR REPLACE PROCEDURE get_emp_rs (p_deptno IN emp.deptno%TYPE, p_recordset OUT SYS_REFCURSOR) AS -- Burada out olarak tanımlandı BEGIN OPEN p_recordset FOR -- Burada açıldı SELECT ename, empno, deptno FROM emp WHERE deptno = p_deptno ORDER BY ename; END GetEmpRS; /
–
SET SERVEROUTPUT ON SIZE 1000000 DECLARE l_cursor SYS_REFCURSOR; l_ename emp.ename%TYPE; l_empno emp.empno%TYPE; l_deptno emp.deptno%TYPE; BEGIN get_emp_rs (p_deptno => 30, p_recordset => l_cursor); LOOP -- bu döngü içerisinde okunmaya başlandı Allah kabul etsin. FETCH l_cursor INTO l_ename, l_empno, l_deptno; EXIT WHEN l_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE(l_ename || ' | ' || l_empno || ' | ' || l_deptno); END LOOP; CLOSE l_cursor; END; /
Bu cursor :
- PL/sql içerisinde
- ADO Recordset olarak
- Java Resultset olarak
kullanılabiliyor.
Kaynak : http://www.oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets.php
PL/SQL Select Into Hilesi
SELECT INTO kullanırken değer bulunamadığında hata fırlatması engellenmek istiyorum ve begin-exception-end bloğuna almak istemiyorum. O halde :
SELECT MAX(ORNEK_DEGER) INTO P_VALUE FROM ORNEK_TABLO;
Böyle yaptığımda veri dönmese dahi hata fırlatılmayacak.
Oracle Dinamik Sorgu
Bir dinamik sorguyu adamakıllı çalıştırma yöntemini araştırırken kaynak kısmında verdiğim makaleyi okudum. Okumak isteyen için güzel bir makale. Özetle :
select num
from (select distinct q.NUM
from cqqv q
where (q.bcode = :bcode)
and (1=1 or :lb is null)
and (1=1 or :type is null)
and (q.edate> :edate)
order by dbms_random.value()) subq
where rownum <= :numrows
Sonucunu üreten bir dinamik sorgu olşuturuluyor. Parametre değerleri sorgu oluşturulurken yazılmıyor. Sorgu içerisinde bind edilebilecek şekilde düzenleniyor. Diğer tavsiye edilen yöntemler için aşağıdaki başlığa bakılmasını şiddetle tavsiye ederim. Bir dost.
Oracle’da hata mesajı ne kadar uzağa fırlatılabilir
Çok uzağa değil.
SUBSTR(SQLERRM, 1, 100);
şeklinde çabucak yakalanır. (SUBSTR ile ilk 100 karakteri alınır)
Oracle’da Açık Oturumlar (Session)
Oracle’da bir kullanıcıya ait açık olan oturumları (session’ları) nasıl mı görürüz ?
SELECT a.spid,
b.sid,
b.serial# as ser#,
b.machine as box,
b.username as username,
b.osuser as os_user,
b.program as program
FROM v$session b,v$process a
WHERE b.paddr = a.addr
AND TYPE = ‘USER’
AND b.username = ‘KULLANICI_ADI’
ORDER BY spid;
Şeklinde görebiliriz.
Oracle Hint
SELECT /*+ index(t1 t1_abc) index(t2 t2_abc) */ COUNT(*)
FROM t1, t2
WHERE t1.col1 = t2.col1;
t1 : tablo 1
t1_abc : tablo 1 üzerindeki index
t2 aynen..
Bu sorguda oracle cebren ve hile ile t1_abc indeksini kullanmaya ikna edilmiştir.