PL/SQL bloğu
PL/SQL, Oracle'ın SQL'e eklediği programlama dilidir (T-SQL'in Oracle karşılığı). Her kod blok yapısındadır:
DECLARE
v_adet NUMBER;
v_ad customers.first_name%TYPE; -- sütunun tipini al
BEGIN
SELECT COUNT(*) INTO v_adet FROM orders WHERE status = 'cancelled';
DBMS_OUTPUT.PUT_LINE('İptal edilen sipariş: ' || v_adet);
IF v_adet > 100 THEN
DBMS_OUTPUT.PUT_LINE('İptal oranı yüksek!');
ELSIF v_adet > 50 THEN
DBMS_OUTPUT.PUT_LINE('İzlenmeli.');
ELSE
DBMS_OUTPUT.PUT_LINE('Normal.');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Kayıt yok');
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Hata: ' || SQLERRM);
END;
/
| T-SQL | PL/SQL |
|---|---|
DECLARE @x INT = 5; | v_x NUMBER := 5; (DECLARE bölümünde) |
SET @x = ... / SELECT @x = ... | v_x := ...; / SELECT ... INTO v_x |
PRINT | DBMS_OUTPUT.PUT_LINE |
IF ... ELSE, BEGIN ... END | IF ... THEN ... ELSIF ... END IF; |
WHILE | LOOP, WHILE ... LOOP, FOR i IN 1..10 LOOP |
TRY / CATCH | EXCEPTION WHEN ... THEN |
@@ROWCOUNT | SQL%ROWCOUNT |
İmleç FOR döngüsü
PL/SQL'de imleç kullanmanın en kısa yolu: açma, okuma ve kapatma otomatik yapılır.
BEGIN
FOR r IN (SELECT name, price FROM products WHERE category = 'Kitap' ORDER BY price DESC) LOOP
DBMS_OUTPUT.PUT_LINE(r.name || ': ' || r.price);
END LOOP;
END;
/
Prosedür, fonksiyon ve paket
CREATE OR REPLACE FUNCTION net_tutar(p_adet NUMBER, p_fiyat NUMBER, p_indirim NUMBER)
RETURN NUMBER IS
BEGIN
RETURN ROUND(p_adet * p_fiyat * (1 - NVL(p_indirim, 0)), 2);
END;
/
CREATE OR REPLACE PACKAGE satis_pkg AS
PROCEDURE fiyat_guncelle(p_kategori VARCHAR2, p_oran NUMBER);
FUNCTION kategori_ciro(p_kategori VARCHAR2) RETURN NUMBER;
END satis_pkg;
/
CREATE OR REPLACE PACKAGE BODY satis_pkg AS
PROCEDURE fiyat_guncelle(p_kategori VARCHAR2, p_oran NUMBER) IS
BEGIN
UPDATE products SET price = price * (1 + p_oran) WHERE category = p_kategori;
IF SQL%ROWCOUNT = 0 THEN
RAISE_APPLICATION_ERROR(-20001, 'Kategori bulunamadı: ' || p_kategori);
END IF;
COMMIT;
END;
FUNCTION kategori_ciro(p_kategori VARCHAR2) RETURN NUMBER IS
v_ciro NUMBER;
BEGIN
SELECT SUM(net_tutar(oi.quantity, oi.unit_price, oi.discount)) INTO v_ciro
FROM order_items oi JOIN products p ON p.product_id = oi.product_id
WHERE p.category = p_kategori;
RETURN v_ciro;
END;
END satis_pkg;
/
EXEC satis_pkg.fiyat_guncelle('Kitap', 0.05);
Paket, ilgili prosedür ve fonksiyonları bir arada tutar; dışarıya açık kısım (spec) ile uygulama (body) ayrıdır. Büyük Oracle sistemlerinde iş mantığının büyük kısmı paketlerde yaşar.
Bu uygulamadaTarayıcıdaki motor PL/SQL bloklarını çalıştırmaz; kodlar okuma amaçlıdır. Oracle'ın sorgu (SQL) kısmı Oracle sekmesinde çalışır.