Arşiv

Posts Tagged ‘cursor’

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.

pl/sql cursor kullanımı örnek

Merhaba,

Pl/sql de cursor kullanımına bir kaç örnek.Örnek olarak bir yazılan bir cursor ın for-loop ve open-fetch yöntemi ile ilgili kullanımı hazırlanmıştır.

DECLARE
  CURSOR plsql_cursor_ornek IS
    SELECT rownum rw_id,
           'Pl/Sql Cursor Örnek' plsql_cursor
      FROM dual
    CONNECT BY rownum <= 10;
  id_rw     NUMBER;
  cur_plsql VARCHAR2(50);
BEGIN

  FOR cur_rec IN plsql_cursor_ornek LOOP
    dbms_output.put_line(cur_rec.rw_id || '--' || cur_rec.plsql_cursor || ' For-Loop');
  END LOOP;

  OPEN plsql_cursor_ornek;
  LOOP
    FETCH plsql_cursor_ornek
      INTO id_rw, cur_plsql;
    EXIT WHEN plsql_cursor_ornek%NOTFOUND;
    dbms_output.put_line(id_rw || '--' || cur_plsql || ' Open-Fetch');
  END LOOP;
  CLOSE plsql_cursor_ornek;

END;

pl/sql type kullanımı örnek

Merhaba pl/sql ortamında bir type oluşturma ve kullanımına dair hazırlanmış bir örnek.Öncelikle type oluşturalım.

CREATE OR REPLACE TYPE example_type AS OBJECT
(
  nmber NUMBER,
  str   VARCHAR2(50),
  dt    DATE
);
CREATE OR REPLACE TYPE example_table IS TABLE OF example_type;

Bu scriptler ile type hazırlanmış oldu.Sıra geldi oluşturuan bu type ı kullanan bir function hazırlayama.Aşağıdaki script ile de function hazırlayabiliriz.

CREATE OR REPLACE FUNCTION example RETURN example_table IS
  RESULT example_table := example_table(example_type(NULL, NULL, NULL));

  CURSOR example_cursor IS
    SELECT rownum nmber,
           'Row' rw,
           SYSDATE dt
      FROM dual
    CONNECT BY rownum <= 10;

BEGIN

  FOR example_rec IN example_cursor LOOP

    RESULT(RESULT.LAST) := example_type(example_rec.nmber, example_rec.nmber || '.' || example_rec.rw, example_rec.dt);
    RESULT.EXTEND;
  END LOOP;

  RESULT.TRIM;
  RETURN(RESULT);

END;

Artık hem type hem de function umuz hazır. Şimdi de bunları bir sql ile kullanalım. Aşağıdaki gibi bir sql ile de type ve function kullanmış oluyoruz.

SELECT * FROM TABLE(CAST(example AS example_table));

Çalıştırdığımız sql in çıktısıda aşağıdaki gibi olacaktır.

Takip Et

Get every new post delivered to your Inbox.

Join 62 other followers