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

17 Nisan 2014 Perşembe

[ORACLE SQL] Combination Calculation

You replace the string 'ALI' with any type you prefer and use to calculate combination of strings by letters.


WITH got_a_char AS
(SELECT 'ALI' AS txt, substr('ALI', LEVEL, 1) AS a_char, LEVEL AS n
    FROM dual
  CONNECT BY LEVEL <= length('ALI'))
SELECT DISTINCT REPLACE(sys_connect_by_path(a_char, '~~'), '~~') AS perm
  FROM got_a_char
WHERE LEVEL = length(txt)
CONNECT BY nocycle txt = PRIOR txt

       AND n != PRIOR n;

Result:

LIA
ILA
ALI
IAL
LAI
AIL

19 Mart 2013 Salı

[Oracle SQL] Parse XML From CLOB



Oracle SQL ile XML Parsing.

----------------------------------------------------------------------------


WITH ornek_xml AS
(SELECT '<manav><meyve>Elma</meyve></manav>' AS meyve_xml
  FROM   dual)
SELECT xmltype(ox.meyve_xml).extract('//meyve/text()').getstringval() AS extracted_meyve
FROM   ornek_xml ox;

----------------------------------------------------------------------------
Result:
EXTRACTED_MEYVE
Elma

[Oracle SQL] Split Comma Delimited String

Oracle 11G ile yapılabilecek bir splitting işlemi:

WITH docs_string AS
(SELECT 'mehmet,ahmet,hasan,huseyin,mahmut' AS str
  FROM   dual)
SELECT LEVEL lvl
      ,regexp_substr(str,
                     '[^,]+',
                     1,
                     LEVEL) splitted_string
FROM   docs_string t
CONNECT BY LEVEL <= regexp_count(str,
                                 ',') + 1;

------------------------------------
LVL SPLITTED_STRING
1 mehmet
2 ahmet
3 hasan
4 huseyin
5 mahmut

6 Şubat 2013 Çarşamba

[Oracle] - Existence check ve performansları


Merhabalar,

Oracle geliştirmeleri yaparken en az bir kez kullandığımız ”existence check (Bir data mevcut mu kontrolü)” yöntemlerini ve performans farkları ile ilgili bir test yaptım ve sizle paylaşmak istedim.

Not: 5. Yöntemde explicit cursor kullanılıyor. Her ne kadar bu örnek için çok farklı performans vermiyor olsa da ilk 4 yöntemde olduğu gibi implicit cursor kullanmak her zaman tercih edilmelidir. Detaylar için aşağıdaki linkler incelenebilir:



create table TABLE_TEST
(
  key   NUMBER,
  value VARCHAR2(2)
);


INSERT INTO table_test
  SELECT LEVEL
        ,dbms_random.string('X',
                            2)
  FROM   dual
  CONNECT BY LEVEL <= 10000;

COMMIT;


DECLARE
  l_start PLS_INTEGER;
  l_end   PLS_INTEGER;

  l_count PLS_INTEGER;

  CURSOR yontem5 IS
    SELECT 1
    FROM   table_test t
    WHERE  t.value = 'AA';

BEGIN

  --Yontem 1

  l_start := dbms_utility.get_time;

  FOR i IN 1 .. 5000 LOOP
 
    SELECT COUNT(1)
    INTO   l_count
    FROM   table_test t
    WHERE  t.value = 'AA';
 
    IF l_count > 0 THEN
      NULL;
    ELSE
      NULL;
    END IF;
 
  END LOOP;

  l_end := dbms_utility.get_time;

  dbms_output.put_line('Yontem 1 sonucu: ' || to_char(l_end - l_start));

  --Yontem 2
  l_start := dbms_utility.get_time;

  FOR i IN 1 .. 5000 LOOP
 
    SELECT COUNT(1)
    INTO   l_count
    FROM   dual
    WHERE  EXISTS (SELECT 1
            FROM   table_test t
            WHERE  t.value = 'AA');
 
    IF l_count > 0 THEN
      NULL;
    ELSE
      NULL;
    END IF;
 
  END LOOP;
  l_end := dbms_utility.get_time;

  dbms_output.put_line('Yontem 2 sonucu: ' || to_char(l_end - l_start));

  --Yontem 3

  l_start := dbms_utility.get_time;

  FOR i IN 1 .. 5000 LOOP
 
    SELECT COUNT(1)
    INTO   l_count
    FROM   (SELECT 1
            FROM   table_test t
            WHERE  t.value = 'AA'
            AND    rownum = 1);
 
    IF l_count > 0 THEN
      NULL;
    ELSE
      NULL;
    END IF;
 
  END LOOP;
  l_end := dbms_utility.get_time;

  dbms_output.put_line('Yontem 3 sonucu: ' || to_char(l_end - l_start));

  --Yontem 4

  l_start := dbms_utility.get_time;

  FOR i IN 1 .. 5000 LOOP
 
    SELECT CASE
             WHEN EXISTS (SELECT 1
                   FROM   table_test t
                   WHERE  t.value = 'AA') THEN
              1
             ELSE
              0
           END AS rec_exists
    INTO   l_count
    FROM   dual;
 
    IF l_count > 0 THEN
      NULL;
    ELSE
      NULL;
    END IF;
 
  END LOOP;
  l_end := dbms_utility.get_time;

  dbms_output.put_line('Yontem 4 sonucu: ' || to_char(l_end - l_start));

  --Yontem 5
  l_start := dbms_utility.get_time;

  FOR i IN 1 .. 5000 LOOP
 
    OPEN yontem5;
 
    FETCH yontem5
      INTO l_count;
 
    IF yontem5%FOUND THEN
      NULL;
    ELSE
      NULL;
    END IF;
    CLOSE yontem5;
  END LOOP;

  l_end := dbms_utility.get_time;

  dbms_output.put_line('Yontem 5 sonucu: ' || to_char(l_end - l_start));
END;


Yontem 1 sonucu: 151
Yontem 2 sonucu: 51
Yontem 3 sonucu: 50
Yontem 4 sonucu: 49
Yontem 5 sonucu: 50