26 Şubat 2017

Oracle PL/SQL XMLAGG Kullanımı ve Sayısal Veri Üzerinde İşlem Yapmak

Oracle PL/SQL XMLAGG Kullanımı ve Sayısal Veri Üzerinde İşlem Yapmak

Oracle'da Column içindeki verileri tek satırda göstermek istediğimiz zaman Xmlagg Xmlelement Extract komutlarını kullanırız. Bunu kullanmamızın amacı bazı Join yaptığımız kolonlarda ortak ID'lerin birden fazla farklı verisi olabilir, Bunları tek satırda görme ihtiyacı duyabiliriz. Örnek ile HR Schema üzerinde anlatacak olursak;

HR.EMPLOYEES ve HR.DEPARTMENTS tablolarında DEPARTMENT_ID kolonu ortak olup bunları JOIN'leriz. Daha JOIN'lenen Datalar da DEPARTMENT_ID bilgisi aynı fakat SALARY bilgisi farklı olan Dataları MAASLAR kolonu içinde tek Row'da göstermeye çalışırız. Sonuç aşağıdaki sorgu gibi olmalıdır.

SELECT DEPARTMENT_ID,
       (SELECT RTRIM(XMLAGG (XMLELEMENT (e, T.SALARY ||','))
        .EXTRACT( '//text()'),
        ',')
FROM HR.EMPLOYEES T
WHERE T.DEPARTMENT_ID = S.DEPARTMENT_ID) AS MAASLAR
FROM HR.DEPARTMENTS S
ORDER BY DEPARTMENT_ID ASC

Bunun dışında HR.DEPARTMENTS tablosu içinde LOCATION_ID kolonundaki bilgileri tek Row'da göstermek istediğimizde; (Ayrıca 5 veriden altını göstermesi için WHERE ROWNUM < 5 şartını ekleyebilirsiniz)

SELECT RTRIM (
XMLAGG (XMLELEMENT (e, LOCATION_ID, ',').EXTRACT ('//text()')),',')
LOCATION_ID FROM HR.DEPARTMENTS
--WHERE ROWNUM < 5;

2) Sayısal Veri Üzerinde İşlem Yapmak

SELECT EMP.EMPLOYEE_ID AS ID,
EMP.LAST_NAME AS SOYAD,
DP.DEPARTMENT_NAME,EMP.SALARY
FROM HR.EMPLOYEES EMP LEFT JOIN HR.DEPARTMENTS DP
ON DP.DEPARTMENT_ID = EMP.DEPARTMENT_ID
WHERE EMP.SALARY > (SELECT SalarY FROM HR.EMPLOYEES EE WHERE EE.EMPLOYEE_ID = 200)

SELECT EMP.EMPLOYEE_ID AS ID,
EMP.LAST_NAME AS SOYAD,
DP.DEPARTMENT_NAME,EMP.SALARY
FROM HR.EMPLOYEES EMP LEFT JOIN HR.DEPARTMENTS DP
ON DP.DEPARTMENT_ID = EMP.DEPARTMENT_ID
WHERE EMP.SALARY IN (SELECT SalarY FROM HR.EMPLOYEES EE WHERE EE.EMPLOYEE_ID IN (200,201,202))