Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

Bilgisayar Mühendisliği Bölümü

Benzer bir sunumlar


... konulu sunumlar: "Bilgisayar Mühendisliği Bölümü"— Sunum transkripti:

1 Bilgisayar Mühendisliği Bölümü
Veri Tabanı Yönetim Sistemleri 2 Ders 6 Ek Bilgiler: Merge, Type, Array, Cursor ve Dinamik SQL Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği Bölümü

2 MERGE Kaynak ve hedef tablolarda eşleşen değerler varsa hedef tablodaki değerleri güncelleyen, yoksa hedef tabloya yeni değer olarak ekleyen DML komutudur. MERGE INTO art a USING items i ON (a.id = i.item_id) WHEN MATCHED THEN UPDATE SET a.artist = i.artist, a.description = i.description WHEN NOT MATCHED THEN INSERT VALUES(i.item_id, i.title, i.artist, i.description); Database Programming with PL/SQL, Section 3, Lesson 1, Review of SQL DML

3 TYPE Nesne Yönelik Programlama dillerinde kullanılan nesnelere benzer PL/SQL yapısı CREATE TYPE … AS OBJECT ile oluşturulur: CREATE TYPE address_typ AS OBJECT ( street VARCHAR2(30), city VARCHAR2(20), postal_code VARCHAR2(6) ); Bir nesne tanımı içinde başka bir nesne kullanılabilir: CREATE TYPE employee_typ AS OBJECT ( employee_id NUMBER(6), first_name VARCHAR2(20), last_name VARCHAR2(25), .. address address_typ ); CREATE TABLE employees OF employee_typ; şeklinde tablo oluşturulabilir.

4 Diziler VARRAY türünde TYPE ile oluşturulur
CREATE TYPE Phone_List_Type AS VARRAY(5) OF VARCHAR2(25) DECLARE type namesarray IS VARRAY(5) OF VARCHAR2(10); type grades IS VARRAY(5) OF INTEGER; names namesarray; marks grades; total integer; BEGIN names := namesarray('Ali', 'Pınar', 'Ayhan', 'Veli'); marks := grades(98, 97, 78, 87); total := names.count; dbms_output.put_line('Total '|| total || ' Students'); FOR i in 1 .. total LOOP dbms_output.put_line('Student: ' || names(i) || ' Marks: ' || marks(i)); END LOOP; END; NOT: VideoRental.sql scriptinde TYPE içinde FUNCTION kullanımını da inceleyiniz.

5 Cursor'lar: Implicit & Explicit
Önceki derslerde bahsedilen Cursor hakkında biraz daha ayrıntılı bilgi vermek gerekirse, cursor aslında sorgu sonucunun saklandığı alana bir isim verilmesi veya bu alanı gösteren bir pointer gibi düşünülebilir. Database Programming with PL/SQL, Section 5, Lesson 1'e göre iki tip Cursor'un tanımı şu şekildedir: Implicit Cursor: Tüm DML işlemleri için ve tek satır döndüren sorgular için ORACLE tarafından otomatik olarak tanımlanır. Explicit Cursor: Programcı tarafından çok satır döndüren sorguların saklanması için tanımlanır. Bazı kaynaklara göre çok satır döndüren bir sorgu eğer FOR döngüsü tanımında cursor olarak tanımlanmadan (isim verilmeden) kullanıldıysa, bu da bir Implicit Cursor kullanımıdır.

6 Implicit Cursor FOR döngüsü:
BEGIN FOR kayit IN ( SELECT * FROM Personel WHERE "BÖLÜM" = 10 ORDER BY Soyad) LOOP DBMS_OUTPUT.put_line ( kayit.Ad || ' ' || Kayit.Soyad); END LOOP; END; Önceki dersimizde FOR döngüsünü adım sayısı bilinen bir işlem için FOR num IN LOOP şeklinde kullanmıştık. Buradaki kullanım For Each döngüsüne benzer şekilde kayıt sayısını bilmemize gerek kalmadan tüm kayıtlar için çalışır.

7 Explicit Cursor FOR döngüsü:
DECLARE CURSOR c1 IS SELECT * FROM Personel WHERE "BÖLÜM" = 10 ORDER BY Soyad; BEGIN FOR kayit IN c1 LOOP DBMS_OUTPUT.put_line ( kayit.Ad || ' ' || Kayit.Soyad); END LOOP; END;

8 FETCH kullanımı DECLARE CURSOR c1 IS SELECT Ad, Soyad FROM Personel WHERE "BÖLÜM" = 10 ORDER BY Soyad; Ad Personel.Ad%TYPE; Soyad Personel.Soyad%TYPE; BEGIN OPEN c1; LOOP FETCH c1 INTO Ad, Soyad; EXIT WHEN c1%NOTFOUND; DBMS_OUTPUT.put_line ( Ad || ' ' || Soyad); END LOOP; END; Cursor'lar ile çalışırken FOR döngüsü kullanmak yerine FETCH ile kayıtlar tek tek çekilebilir. Fakat bunun için önce Cursor'u Open ile açmak gerekir. Cursor sorgusunda elde edilen tüm alanlar için değişkenler tanımlamak ta gerekir. Sona geldiğimizi anlayıp döngüden çıkmak için %NOTFOUND özelliğini kullanabiliriz.

9 Cursor Özellikleri (Attributes)
Description %FOUND Eğer bir INSERT, UPDATE veya DELETE ifadesi bir yada daha çok satırı etkilediyse veya bir SELECT INTO ifadesi bir yada daha çok satır döndürdüyse TRUE döndürür. %NOTFOUND %FOUND'un mantıksal tersidir. DML işleminde herhangi bir satır etkilenmediyse veya sorguda döndürülmediyse TRUE döndürür. %ISOPEN Cursor açık ise TRUE döndürür. Implicit Cursor'larda hep FALSE döndürür (çünkü Oracle ilgili SQL ifadesini yürüttükten sonra otomatik olarak Cursor'u kapatır). %ROWCOUNT INSERT, UPDATE veya DELETE ifadelerinden etkilenen, veya SELECT INTO ifadesinden dönen satır sayısını döndürür.

10 Execute Immediate ile Dinamik Sorgular
Sorgunun yazıldığı ve derlendiği anda sorgunun parse edilmesi için gerekli bilgilerin tamamı yoksa, bu bilgilerin bir kısmı çalışma anında (runtime) elde ediliyorsa bu tip sorgulara dinamik sorgular denir. ORACLE'da EXECUTE IMMEDIATE ifadesi ile sorgunun dinamik olarak çalıştırılması mümkündür.

11 EXECUTE IMMEDIATE Örneği
CREATE OR REPLACE FUNCTION single_number_value ( table_in IN VARCHAR2, column_in IN VARCHAR2, where_in IN VARCHAR2) RETURN NUMBER IS l_return NUMBER; BEGIN EXECUTE IMMEDIATE 'SELECT ' || column_in || ' FROM ' || table_in || ' WHERE ' || where_in INTO l_return; RETURN l_return; END; BEGIN DBMS_OUTPUT.put_line ( single_number_value ( 'employees', 'salary', 'employee_id=138')); END; 


"Bilgisayar Mühendisliği Bölümü" indir ppt

Benzer bir sunumlar


Google Reklamları