8.4 Denetim akışı

<< İçindekileri Görüntülemek İçin Tıklayın >>

Yer:  Teknik Kılavuzlar > IVEDI SQL Kullanıcı Kılavuzu > 8. Yordamsal dil (PSQL) >

8.4 Denetim akışı

8.4.1 IF

IF ( <mantıksal ifade> ) THEN <deyim> [ELSE <deyim>]

Parantezler zorunludur. ELSIF ve END IF yoktur; else if (…) then … zincirlenebilir, çünkü ELSE dalı da bir PSQL deyimidir.

Not

ELSE'in önündeki noktalı virgül kuralı: THEN dalı end ile bittiyse ELSE hemen ardından noktalı virgülsüz gelir; bitmediyse araya bir ; girer.

8.4.2 WHILE ve FOR

WHILE ( <mantıksal ifade> ) DO <deyim>

FOR <tam sayı değişkeni> = <a> TO <b> [STEP <s>] DO <deyim>
FOR <tam sayı değişkeni> IN <a> .. <b> [STEP <s>] DO <deyim>
FOR SELECT … INTO <hedefler> DO <deyim>
FOR SELECT … AS CURSOR <ad> DO <deyim>
FOR EXECUTE STATEMENT <…> INTO <hedefler> DO <deyim>

Parantezler ve DO zorunludur. IN biçiminde ayırıcı ..'dır. Negatif STEP geriye sayar. Döngü değişkeni önceden bildirilmiş, salt okunur olmayan bir tam sayı olmalıdır.

AS CURSOR <ad> biçiminde satır alanlarına <ad>.<alan> ile erişilir. FOR EXECUTE STATEMENT biçiminde INTO zorunludur.

Sınır

Sorgu biçiminde parantez kullanılmaz: FOR SELECT … doğru, FOR (SELECT …) ise adlı bir hata alır. Parantezli sorgu ifadesi bu lehçenin hiçbir yerinde yoktur; komşu yazım olan imleç bildiriminde (<ad> CURSOR FOR (SELECT …)) parantez zorunludur, ama ikisi ayrı yapılardır.

Azalan döngünün yazımı negatif STEP'tir (FOR n IN 3 .. 1 STEP -1 DO). Oracle'ın REVERSE yazımı bir anahtar sözcük değildir ve tanınmaz; REVERSE bu lehçede yerleşik bir dizge fonksiyonudur.

8.4.3 CASE

CASE WHEN <koşul> THEN <değer> … [ELSE <değer>] END        -- aranan biçim
CASE <ifade> WHEN <değer> THEN <değer> … [ELSE <değer>] END -- basit biçim

THEN ve ELSE dalları CASE'in kendi bağlamının tipiyle derlenir (SQL:2011 6.12: sonuç tipi dal ifadelerinden türer), koşullar ve basit biçimin karşılaştırılanı ise kendi tipiyle. Pratik sonucu: bir ? parametresi bir dalda hedefin tipini alır ve niteliksiz bir sıralı (enum) sabit dalda çözülür — ama yalnızca CASE'in bir hedefi varsa (atama, INSERT değeri, tipi bilinen bir parametre). Bağlamsız bir SELECT listesinde dallar tipsiz derlenir; o durumda enum sabiti nitelenir.

Sınır

CASE yalnızca bir ifadedir; CASE deyimi ve END CASE yoktur. Eşleşme yoksa ve ELSE yazılmadıysa sonuç NULL'dur.

8.4.4 Etiketler, GOTO, BREAK / LEAVE / CONTINUE

<etiket> :
GOTO <etiket>;
BREAK [<etiket>];    LEAVE [<etiket>];    CONTINUE [<etiket>];

LEAVE, BREAK'in eşanlamlısıdır. İleri ve geri atlamalar çalışır. Etiketsiz BREAK/CONTINUE en içteki döngüyü hedefler; döngü dışında yazılması derleme hatasıdır. Etiketli BREAK/CONTINUE için etiketin bloğundaki son deyim olması ve etiketlediği deyimin bir FOR/WHILE olması gerekir — yani etiket döngünün hemen önünde durur.

Dikkat

Etiket görünürlüğü sınırlıdır: derleyici etiketi en içteki bloğa ekler, ama GOTO ve etiketli BREAK/CONTINUE etiketi yordamın en dış gövdesinde arar. İç içe bir begin … end içindeki etiket bunlara görünmez.

8.4.5 RETURN, EXIT, SUSPEND

DeyimKoşul
RETURN [<değer>]Bir yordam/fonksiyon gövdesinde. Değer, dönüş alanına göre tip denetiminden geçer.
EXITGövdeyi terk eder.
SUSPENDYalnızca RETURNS ( … ) bildiren yordam/blokta.