Ana içeriğe geç
Kesit SQL
İleri · SQL Türlerine Özgü

Oracle PL/SQL ile programlama: blok, imleç, prosedür, paket

Anonim bloklar, değişkenler, döngüler, imleçler, istisnalar ve paketler.

Uygulamada aç, 9 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

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-SQLPL/SQL
DECLARE @x INT = 5;v_x NUMBER := 5; (DECLARE bölümünde)
SET @x = ... / SELECT @x = ...v_x := ...; / SELECT ... INTO v_x
PRINTDBMS_OUTPUT.PUT_LINE
IF ... ELSE, BEGIN ... ENDIF ... THEN ... ELSIF ... END IF;
WHILELOOP, WHILE ... LOOP, FOR i IN 1..10 LOOP
TRY / CATCHEXCEPTION WHEN ... THEN
@@ROWCOUNTSQL%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.
Alıştırmalara geç (9)