Arşiv

Posts Tagged ‘forms’

pl/sql de sqlerrm kullanımı

Merhaba,
Pl/sql ortamında ya da Oracle forms ortamında yazdığımız programlarda çoğu zaman Oracle hatası alırız. Doğru bir hata yönetimimiz olmaz ise yani exception satırlarımızda yeterli bilgilendirme yapmaz isek bu hataları bulmak bazı durumlarda çok zor olabilir. Bu gibi durumlarda hatanın meydana geldiği scripti ve hatanın ne olduğu konusundaki detaylı bilgiyi Oracle’ın SQLERRM komutu ile rahatça öğrenebiliriz.Tabi bu durumu daha net anlamak için örneklerimize bir göz atalım.
Örnek olarak bir tabloya insert işlemi yapalım ve bu insert işlemi sırasında alabileceğimiz hataları SQLERRM kullanmadan görelim. Daha sonraki örneğimizde de SQLERRM komutu ile gelen uyarı/hata mesajını inceleyelim.
Aşağıdaki örneğimizde kullandığımız tablonun id bilgisi not null bir alan ve bu alana null veri kayıt etmeye çalıştığımızda scriptin exception satırına düşeceğiz.

DECLARE
BEGIN
  BEGIN
    INSERT INTO sqlerrm_example_table
      (set_id,
       set_aciklama)
    VALUES
      (NULL,
       'SQLERRM Kullanılmayan Insert');
  EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line('Kayıt İşleminde Bir Hata Oldu');
  END;
END;

Script içerisinde görüldüğü gibi exception satırından bize aşağıdaki uyarı gelecektir.
Kayıt İşleminde Bir Hata Oldu

Ama bu script yerine aşağıdaki gibi SQLERRM komutunu kullandığımız scriptler hazırladığımızda hatayı bulmamız ve hastanın sebebini öğrenmemiz daha kolay olur.
DECLARE
BEGIN
  BEGIN
    INSERT INTO sqlerrm_example_table
      (set_id,
       set_aciklama)
    VALUES
      (NULL,
       'SQLERRM Kullanılan Insert');
  EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line('Kayıt İşleminde Bir Hata Oldu' || chr(13) || SQLERRM);
  END;
END;

Mevcut scriptimizi yukarıdaki gibi güncellediğimizde ise aşağıdaki gibi daha sağlıklı ve hata hakkında daha fazla bilgi veren bir mesaj elde etmiş oluruz.
Kayıt İşleminde Bir Hata Oldu
ORA-01400: ("SQLERRM_EXAMPLE_TABLE"."SET_ID") içine NULL eklenemez

Bu uyarıyı aldığımız zaman insert satırımızdaki NULL olarak gönderdiğimiz id bilgisine değer verdiğimizde sorunsuz kayıt işlemimizi yapabiliriz.
DECLARE
BEGIN
  BEGIN
    INSERT INTO sqlerrm_example_table
      (set_id,
       set_aciklama)
    VALUES
      (1,
       'SQLERRM ve Id Bilgisi Kullanılan Insert');
  EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line('Kayıt İşleminde Bir Hata Oldu' || chr(13) || SQLERRM);
  END;
END;

Bu script ile sorunsuz olarak kayıt işlemimi yaptığımıza göre tabloya select atıp kayıt sonucumuzu görebiliriz.
SELECT * FROM sqlerrm_example_table;

İşte bu select sonucunda sorunsuz olarak tabloya kayıt ettiğimiz veri karşımızda.

SET_ID SET_ACIKLAMA
1 SQLERRM ve Id Bilgisi Kullanılan Insert

Bu örneğimizde sadece insert işlemi üzerinde SQLERRM komutunu kullandık. Bu komut yazmış olduğumuz tüm scriptlerimiz için kullanılabilinir. Select , update , insert işlemlerinde de SQLERRM komutu rahatlıkla kullanılabilinir.
Kolay gelsin.

pl/sql ve oracle forms da lpad ve rpad kullanımı

Merhaba,
Pl/Sql ve Oracle Forms içinde sabit bir metin ya da değişen özel durumlarda sabit bir uzunluk değerine sahip olması gerekebilir. Bu gibi durumlar için sabit uzunluğun değeri ne kadar ise elimizdeki verinin o uzunluğa ulaşması için öncelikle elimizdeki değişkenin uzunluk bilgisini öğrenip, geriye kalan değer kadar sabit bir karakter ekleyerek istenilen uzunluğa erişebiliriz. Fakat bu yöntem hem uzun hem de zahmetlidir. Çünkü bu işlemler için gereğinden fazla değişkene ihtiyacımız olur. Örnek olarak aşağıdaki kodlar ile bu durumu daha iyi görebiliriz.

DECLARE
  CURSOR lr_pad IS
    SELECT rownum,
           table_name
      FROM all_tables
     WHERE owner = 'SYS'
       AND rownum <= 10;
  lpad_val VARCHAR2(10);
  rpad_val VARCHAR2(10);
BEGIN
  FOR cur_rec IN lr_pad LOOP
    IF length(cur_rec.rownum) = 10 THEN
      lpad_val := cur_rec.rownum;
      rpad_val := cur_rec.rownum;
    ELSIF length(cur_rec.rownum) = 9 THEN
      lpad_val := '0' || cur_rec.rownum;
      rpad_val := cur_rec.rownum || '0';
    ELSIF length(cur_rec.rownum) = 8 THEN
      lpad_val := '00' || cur_rec.rownum;
      rpad_val := cur_rec.rownum || '00';
    ELSIF length(cur_rec.rownum) = 7 THEN
      lpad_val := '000' || cur_rec.rownum;
      rpad_val := cur_rec.rownum || '000';
    ELSIF length(cur_rec.rownum) = 6 THEN
      lpad_val := '00000' || cur_rec.rownum;
      rpad_val := cur_rec.rownum || '0000';
    ELSIF length(cur_rec.rownum) = 5 THEN
      lpad_val := '000000' || cur_rec.rownum;
      rpad_val := cur_rec.rownum || '000000';
    ELSIF length(cur_rec.rownum) = 4 THEN
      lpad_val := '0000000' || cur_rec.rownum;
      rpad_val := cur_rec.rownum || '0000000';
    ELSIF length(cur_rec.rownum) = 3 THEN
      lpad_val := '00000000' || cur_rec.rownum;
      rpad_val := cur_rec.rownum || '00000000';
    ELSIF length(cur_rec.rownum) = 2 THEN
      lpad_val := '00000000' || cur_rec.rownum;
      rpad_val := cur_rec.rownum || '00000000';
    ELSIF length(cur_rec.rownum) = 1 THEN
      lpad_val := '000000000' || cur_rec.rownum;
      rpad_val := cur_rec.rownum || '000000000';
    END IF;
    dbms_output.put_line('Lpad Bilgisi=' || lpad_val || '=' || cur_rec.table_name || chr(13) || 
                         'Rpad Bilgisi=' || rpad_val || '=' || cur_rec.table_name);
    dbms_output.put_line('---');
  END LOOP;
END;

Yukarıdaki komutlar ile yapılmak istenilen on(10) satır veri dönen bir query den satır bilgilerinin sabit olarak on(10) karakter uzunluğa sahip olmasını sağlamaktır. Görüldüğü gibi bu işlem için birçok kontrol ve gereksiz değişkenlere ihtiyaç duyulmuştur. Bu işlemin sonucu aşağıdaki gibidir.

Lpad Bilgisi=0000000001=ACCESS$
Rpad Bilgisi=1000000000=ACCESS$
---
Lpad Bilgisi=0000000002=ALERT_QT
Rpad Bilgisi=2000000000=ALERT_QT
---
Lpad Bilgisi=0000000003=APPLY$_CONF_HDLR_COLUMNS
Rpad Bilgisi=3000000000=APPLY$_CONF_HDLR_COLUMNS
---
Lpad Bilgisi=0000000004=APPLY$_CONSTRAINT_COLUMNS
Rpad Bilgisi=4000000000=APPLY$_CONSTRAINT_COLUMNS
---
Lpad Bilgisi=0000000005=APPLY$_DEST_OBJ
Rpad Bilgisi=5000000000=APPLY$_DEST_OBJ
---
Lpad Bilgisi=0000000006=APPLY$_DEST_OBJ_CMAP
Rpad Bilgisi=6000000000=APPLY$_DEST_OBJ_CMAP
---
Lpad Bilgisi=0000000007=APPLY$_DEST_OBJ_OPS
Rpad Bilgisi=7000000000=APPLY$_DEST_OBJ_OPS
---
Lpad Bilgisi=0000000008=APPLY$_ERROR
Rpad Bilgisi=8000000000=APPLY$_ERROR
---
Lpad Bilgisi=0000000009=APPLY$_ERROR_HANDLER
Rpad Bilgisi=9000000000=APPLY$_ERROR_HANDLER
---
Lpad Bilgisi=0000000010=APPLY$_ERROR_TXN
Rpad Bilgisi=1000000000=APPLY$_ERROR_TXN

Aynı sonucu verecek olan ”lpad” ve “rpad” kullanımı ile yapılan komutlar aşağıdadır.

DECLARE
  CURSOR lr_pad IS
    SELECT rownum,
           table_name
      FROM all_tables
     WHERE owner = 'SYS'
       AND rownum <= 10;
  lpad_val VARCHAR2(10);
  rpad_val VARCHAR2(10);
BEGIN
  FOR cur_rec IN lr_pad LOOP
  
    lpad_val := lpad(cur_rec.rownum, 10, '0');
    rpad_val := rpad(cur_rec.rownum, 10, '0');
  
    dbms_output.put_line('Lpad Bilgisi=' || lpad_val || '=' || cur_rec.table_name || chr(13) || 
                         'Rpad Bilgisi=' || rpad_val || '=' || cur_rec.table_name);
    dbms_output.put_line('---');
  END LOOP;
END;

Görüldüğü gibi if kontrollerine gerek kalmadan aynı işlemi tek satırda çözüme kavuşturduk. Bu işlemin çıktısı da aşağıdaki gibidir.

Lpad Bilgisi=0000000001=ACCESS$
Rpad Bilgisi=1000000000=ACCESS$
---
Lpad Bilgisi=0000000002=ALERT_QT
Rpad Bilgisi=2000000000=ALERT_QT
---
Lpad Bilgisi=0000000003=APPLY$_CONF_HDLR_COLUMNS
Rpad Bilgisi=3000000000=APPLY$_CONF_HDLR_COLUMNS
---
Lpad Bilgisi=0000000004=APPLY$_CONSTRAINT_COLUMNS
Rpad Bilgisi=4000000000=APPLY$_CONSTRAINT_COLUMNS
---
Lpad Bilgisi=0000000005=APPLY$_DEST_OBJ
Rpad Bilgisi=5000000000=APPLY$_DEST_OBJ
---
Lpad Bilgisi=0000000006=APPLY$_DEST_OBJ_CMAP
Rpad Bilgisi=6000000000=APPLY$_DEST_OBJ_CMAP
---
Lpad Bilgisi=0000000007=APPLY$_DEST_OBJ_OPS
Rpad Bilgisi=7000000000=APPLY$_DEST_OBJ_OPS
---
Lpad Bilgisi=0000000008=APPLY$_ERROR
Rpad Bilgisi=8000000000=APPLY$_ERROR
---
Lpad Bilgisi=0000000009=APPLY$_ERROR_HANDLER
Rpad Bilgisi=9000000000=APPLY$_ERROR_HANDLER
---
Lpad Bilgisi=0000000010=APPLY$_ERROR_TXN
Rpad Bilgisi=1000000000=APPLY$_ERROR_TXN

Kolay gelsin.

ora-01422:exact fetch returns more than requested number of rows hatası

22 Haziran 2010 6 yorum

Merhaba,

Pl/sql ortamında ya da oracle forms içindeki kullanımlarda bazen hazırladığımız sql lerden into ile alacağımız değerler kısmında birden fazla kayıt gelmesi durumunda ora-01422 hatası alınır.Örnek olarak aşağıdaki sql ler kontrol edilebilinir.

DECLARE
  ora_01422 NUMBER(12);
BEGIN
  BEGIN
    SELECT rownum
      INTO ora_01422
      FROM dual
    CONNECT BY rownum < 10;
  END;
END;

Bu script çalıştırıldığı zaman ora-01422 hatası alınır.Çünkü into olarak almamız gereken kayıt sayısı 1 adettir.Ama sql e dikkat edilir ise CONNECT BY ifadesi ile 10 dan küçük olan rownum lar yani 9 satırlık bir veri çekilmiştir.Fakat aşağıdaki sql de ise sorun olmadan istediğimiz kaydı alabiliriz.

DECLARE
  ora_01422 NUMBER(12);
BEGIN
  BEGIN
    SELECT rownum
      INTO ora_01422
      FROM dual;
  END;
END;

Categories: Hata Etiketler:, , , , ,

oracle forms ve pl/sql de ascii ve chr komutları kullanımı

Merhaba oracle forms ve pl/sql ortamında ascii ve chr komutları kullanım örnekleri. Örneğin pl/sql ortamında yazılan örnekler.

SELECT ascii('A')
  FROM dual;
Bu satırın sonucu "65" olacaktır.

ya da
SELECT chr(65)
  FROM dual;
Bu satırın sonucu da "A" olacaktır.

Bu satrılar oracle forms ortamında da kullanılabilinir.

Categories: Database, Forms, Oracle, PL/SQL, Reports Etiketler:, , , ,

ora-06502:pl/sql numeric or value error string hatası

Merhaba çoğunluk oracle ve pl/sql ortamında alınan bir hatadır. Hatanın sebebi kullanılan bir değişkene belirtilen uzunluktan fazla değer ya da farklı bir tipde veril gelmesinden kaynaklanır.

Örneğin

str varchar2(3);

olan değişkenimize aşağıdaki gibi bir işlem yaparsak ora-06502 hatası alırız.
str:='abcd';

Aldığımız hatanın sebebi 3 karakter ile sınırladığımıza str değişkenini 4 karakter veri atamaya çalışıyoruz. Bu yüzden bu hata alınır.Başka bir örnek olarak
nmbr number;

Olan bir değişkene aşağıdaki gibi atama yapıldığında da ora-06502 hatası alınır.
nmbr:='abcd';

Hatanın sebebi ile number bir alana string bir değer atama yapamaya çalışıyoruz.

Categories: Hata Etiketler:, ,
Takip Et

Get every new post delivered to your Inbox.

Join 62 other followers