oracle etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
oracle etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

14 Nisan 2014 Pazartesi

ORACLE USER AUDIT TRAIL DB LOG

SELECT
  FROM user_audit_trail lo
 WHERE
  --LO.OBJ_NAME NOT IN ( 'GOP_SEF_LOK_MV', 'BUTCE_AKTARIMI_TMP','EVENT_TABLE_BRD') AND
  --LO.OBJ_NAME =  'LOKASYON' AND
   trunc(timestamp) > trunc(sysdate)- :KAC_GUNLUK_LOG
order by timestamp desc

13 Aralık 2013 Cuma

Global Temporary Tables GTT

ORACLE'in geçici kayıt tutmak için sunduğu bir tablo yapısı var. Bu tablo bir kez yaratılıyor. Bundan sonra ister kodun içinden ister TOAD gibi aracın içinden ORACLE'a bağlanın, bu tabloya yazdığınız kayıtları sadece siz görüyorsunuz. Kod bloğunuzda veya TOAD'ın içinden COMMIT veya ROLLBACK yaptığınızda tablo yazdığınız kayıtların ömrü bitmiş oluyor. ORACLE'ın  bizim yerimize bu tabloya sessionID diye bir sütun açtığını ve bu tabloya gelen okuma yazma sorgularının başına bu kuralan bağlantının (session'ın) Id^sini yazdığımızı düşünebiliriz.

Ne gibi problemlerin üzerinden gelmek için bu yaklaşımı kullanabiliriz?  (Bu amaçla yarattığımız tablonun adının PARAMETER_TABLE_GTT olduğunu düşünelim)

Rapor sorgusunu yazarken, raporu çalıştırdığımız parametleri Rapor sorgurunu içine  = :KUMPANYA_ID veya IN :KUMPANYA_ID_LIST diye ekleriz.  Rapor çalıştığında bizim parametrelerimiz, sorgu betiği içinde bunlarla yer değiştirir ve orjinalinde sanki bizim gönderidğimiz değerler varmış gibi çalışır. View içine parametre geçmek diye tabir edebileceğimiz bu yaklaşımı,  istediğimiz parametleri PARAMETER_TABLE_GTT kayıt ederek ve orijinal sorgumuzu bu tabloya join yaparak gerçekleştirebiliriz.

Kod içinden elde ettiğimiz ve başka bir sorgunun WHERE kısmına  IN ile eklemek istediğimiz değerleri bu tabloya yazarak, orijinal sorgumuzda bu tabloya exist olarak ekleyebiliriz.

Ayrıntılı bilgiye buradan ulaşabilirsiniz.


Örnek bir kullanımın adımları

Tablo Yaratılması  (Bir kez yapılacak bir işlemdir)

DROP TABLE YNA.PARAMETER_TABLE_GTT CASCADE CONSTRAINTS;

CREATE GLOBAL TEMPORARY TABLE YNA.PARAMETER_TABLE_GTT
(
  NUMBER_ALAN1  NUMBER
)
ON COMMIT DELETE ROWS
RESULT_CACHE (MODE DEFAULT)
NOCACHE;

GRANT DELETE, INSERT, SELECT, UPDATE ON YNA.PARAMETER_TABLE_GTT TO ORACLEREADERUSER;


View içinde kullanımı
DH_DA_GOP_SEF_KUMP_DA_VW tablosunda LEFT JOIN veirilmiş bir alt sorgunun içinde kullanılıyor. Bu alt sorgunun (aslında diğer tablolar ile bağlantısını bir alan üzerinden kuramadığımız) sadece istediğimiz parametre için çalışmasını istiyoruz.
..
..
(
..
  FATURA , DH_DA_SEFER_KUMPANYA ,
                             PARAMETER_TABLE_GTT GTT
                       WHERE    
                              DH_DA_SEFER_KUMPANYA.KUMPANYA_ID = GTT.NUMBER_ALAN1


Kod içerisinden çağırımı

            TransactionHelper txnHelper = new TransactionHelper();
            txnHelper.BeginTransaction();
            try
            {
                //txnHelper yaşamı boyunca geçici kayıt (ParameterTableGttEntity) tablosuna bir kayıt atıyor.
                //DhDaGopSefKumpDaVwCollection içinde bu tabloya JOIN atılıyor. View içine parametre geçmek için yazıldı.
                var prmTableGttEntity = new ParameterTableGttEntity();
                txnHelper.AddElementToTransaction(prmTableGttEntity);
                prmTableGttEntity.NumberAlan1 = request.KumpanyaId;
                prmTableGttEntity.Save();
                TypedListBuilder tlb = new TypedListBuilder();
                tlb.addFields(DhDaGopSefKumpDaVwFields.DaGopSeferLokasyonId, DhDaGopSefKumpDaVwFields.DaGopSeferLokasyonId.Name);
                tlb.addFields(DhDaGopSefKumpDaVwFields.DaKumpanyaId, DhDaGopSefKumpDaVwFields.DaKumpanyaId.Name);
                tlb.addFields(DhDaGopSefKumpDaVwFields.DaNo, DhDaGopSefKumpDaVwFields.DaNo.Name);
                
                //Veri çektiğimiz yapıda aynı Transaction'i kullanmalıyız.
                response.DhDaSeferKumpanyaDT = tlb.Fill(filtre, sortExpression, TxnHelper);
                //Tabloya attığımız kayıt bu noktada silindi.
                txnHelper.CommitTransaction();
            }
            catch (Exception)
            {

15 Kasım 2013 Cuma

ORA-02293 NOT NULL CHECK CONSTRAINT

Belli bir tarihten sonrası NOT NULL, belli bir tarihten öncesi NULL olarak yaşamına devam edecek kolonlar için ALTER TABLE MUSTERI ADD CHECK ("ULKE_LOKASYON_ID" IS NOT NULL); şeklindeki notasyon ihtiyaca cevap vermiyor. Bu notasyon kolonun tamamını NOT NULL'a çeker. Column description ekranında NULL? Bölümünde N gösterir. (eğer başarılı çalışırsa)
 
Bizim ihtiyacımıza cevap veren notasyon ALTER TABLE MUSTERI ADD (  CHECK ("ULKE_LOKASYON_ID" IS NOT NULL)  ENABLE NOVALIDATE); Bu durumda column description ekranındaki NULL? Bölümü Y gösterse de hayatına NOT NULL olarak devam eder, eski kayıtları NOT NULL'a zorlamaz.

8 Şubat 2012 Çarşamba

llblgen dbfunctioncall date oracle

llblgen dbfunctioncall date oracle

Llblblgen’den oracle / SQL komutu çalıştırmak lazım geldiğinde kullanılabiliyor. Bana bir sahanın senesi filtrelemek için gerekti.  



Örnek 1 
SELECT COUNT(1) FROM ISM_GUMRUKCU_KTF WHERE TO_CHAR(KKT_ALINIS_TARIHI,'YYYY')= '2011'

IPredicateExpression filtre = new PredicateExpression();
EntityField field = IsmGumrukcuKtfFields.KktAlinisTarihi;
field.ExpressionToApply = new DbFunctionCall("TO_CHAR", new object[] { IsmGumrukcuKtfFields.KktAlinisTarihi, "YYYY" });
IPredicateExpression phExpression = new PredicateExpression(field == yeniTO.KktAlinisTarihi.Year.ToString());
filtre.Add(phExpression);
col.GetMulti(filtre);

SELECT COUNT (1)
  FROM "YNA_HD"."ISM_GUMRUKCU_KTF"
WHERE (((TO_CHAR ("YNA_HD"."ISM_GUMRUKCU_KTF"."KKT_ALINIS_TARIHI",
                   :loa59d6d342
                  ) = :kktalinistarihi1
         )
        )
       )
    Parameter: :LOa59d6d342 : String. Length: 0. Precision: 0. Scale: 0. Direction: Input. Value: "YYYY".
    Parameter: :KktAlinisTarihi1 : String. Length: 0. Precision: 0. Scale: 0. Direction: Input. Value: "2011".

Örnek 2  İç İçe Kullanım
SELECT COUNT(1) FROM ISM_GUMRUKCU_KTF WHERE EXTRACT(YEAR FROM KKT_ALINIS_TARIHI)=2011

IPredicateExpression filtre = new PredicateExpression();
EntityField field = IsmGumrukcuKtfFields.KktAlinisTarihi;
field.ExpressionToApply = new DbFunctionCall("EXTRACT", new object[] { new DbFunctionCall("YEAR FROM", new object[] { IsmGumrukcuKtfFields.KktAlinisTarihi }) });
phExpression = new PredicateExpression(field == yeniTO.KktAlinisTarihi.Year);
filtre.Add(phExpression);
col.GetMulti(filtre);


SELECT COUNT(1)
  FROM "YNA_HD"."ISM_GUMRUKCU_KTF"
WHERE (((EXTRACT (YEAR FROM ("YNA_HD"."ISM_GUMRUKCU_KTF"."KKT_ALINIS_TARIHI"
                             )) = :kktalinistarihi1
         )
        )
       )

    Parameter: :KktAlinisTarihi1 : Int32. Length: 0. Precision: 0. Scale: 0. Direction: Input. Value: 2011.

26 Eylül 2011 Pazartesi

ORACLE RECURSIVE QUERY CONNECT BY PRIOR

Örnek
ust_mal_id tablodaki başka bir kayıdı (id’yi) göstersin (seviye mal tablosu üzerindeki bir alandır. En üst seviye=1 dir ve seviye=1 olan kayıtların ust_mal_id değeri bostur).

SELECT seviye,id, ust_mal_id
FROM mal
CONNECT BY PRIOR ust_mal_id=id
START WITH ID = 25909
ORDER BY SEVIYE DESC

ÇIKTI
SEVIYE      ID    UST_MAL_ID
3           25909 24916
2           24916 25051
1           25051


Bir Function Yazarak Bu Sorguyu Program içinden kullanabiliriz

/* Formatted on 26.09.2011 15:59:27 (QP5 v5.149.1003.31008) */
CREATE OR REPLACE FUNCTION "MAL_USTMALIDLERI_BIRLESTIR" (P_MAL_ID IN NUMBER)
   RETURN VARCHAR2
IS
   CURSOR C1
   IS
          SELECT seviye, id, ust_mal_id
            FROM mal
      CONNECT BY PRIOR ust_mal_id = id
      START WITH ID = P_MAL_ID
        ORDER BY SEVIYE DESC;

   V_MAL_IDLER   VARCHAR2 (100);
BEGIN
   V_MAL_IDLER := '';

   FOR C1REC IN C1
   LOOP
      V_MAL_IDLER := V_MAL_IDLER  || C1REC.ID || ';';
   END LOOP;

   RETURN V_MAL_IDLER;
END MAL_USTMALIDLERI_BIRLESTIR;

Grant
DBMS_UTILITY.EXEC_DDL_STATEMENT('grant execute on MAL_USTMALIDLERI_BIRLESTIR to vtuser');

Kullanım
SELECT MAL_USTMALIDLERI_BIRLESTIR(25909) FROM DUAL;

ÇIKTI
25909;24916;25051;