8.5 İstisna işleme

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

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

8.5 İstisna işleme

WHEN ANY DO <deyim>
WHEN EXCEPTION <ad> [, <ad> …] DO <deyim>
WHEN SQLCODE <n> [, <n> …] DO <deyim>
WHEN SQLSTATE '<durum>' [, …] DO <deyim>
WHEN EXCEPTION a | SQLCODE -802 | ANY DO <deyim>   -- birleşik süzgeç

DO zorunludur. İşleyiciler bloğun en sonunda olmalıdır: son WHEN'den sonra yalnızca END gelebilir. İşleyici gövdesi sıradan bir PSQL deyimi olduğu için iç içe geçebilir. WHEN EXCEPTION hem katalogdaki CREATE EXCEPTION nesnelerini hem motorun yerleşik durum adlarını (DIVIDE_BY_ZERO gibi) kabul eder; ikisinde de olmayan bir ad derleme uyarısı alır ve o dal hiç eşleşmez. GDSCODE yoktur.

İşleyici içinde kullanılabilen bağlam değişkenleri:

AdTipDeğer
SQLERRORnesne adıİstisnanın adı (örn. 'NOT_A_NUMBER')
SQLERRMnesne adıMesaj metni
SQLCODEINTEGERSayısal hata kodu
SQLSTATEdurum koduSQLSTATE biçimli kod
ERROREXCEPTION nesnesi .name, .code, .state, .message, .getStackTrace()
Yığın derinliği

Sonlanma koşulu olmayan bir özyineleme (kendini çağıran bir yordam, birbirini tetikleyen tetikleyiciler, sonsuz iç içe bir ifade) süreci düşürmez: motor, özyinelemenin girdiği yerlerde iş parçacığının yığın kullanımını ölçer ve sınır aşılınca STACK_DEPTH_EXCEEDED istisnasını yükseltir — SQLCODE 704, SQLSTATE 54001. Sıradan bir istisnadır: WHEN SQLSTATE '54001', WHEN SQLCODE 704 ya da WHEN ANY ile yakalanabilir. Sınır, iş parçacığının yığın boyutundan türetilir ve SQL'den ayarlanamaz; 1 MB'lik varsayılan yığında 768 KB'dir.

8.5.1 İstisna yükseltme

EXCEPTION <ad>;                                   -- bildirilmiş mesajı kullanır
EXCEPTION <ad> <mesaj ifadesi>;
EXCEPTION <ad> <kalıp> USING ( <e1>, <e2>, … );  -- {0} yer tutucuları
EXCEPTION <ad> [<mesaj>] [CODE <tam sayı>] [STATE <dizge>];  -- kod/durum ezme
EXCEPTION;                                        -- yeniden yükselt (yalnızca işleyicide)

Kullanıcı istisnaları CREATE EXCEPTION <ad> '<mesaj>' [CODE <n>] [STATE '<5 karakter>'] ile oluşturulur; mesaj zorunludur, CODE 0 yasaktır. SQLCODE ve SQLSTATE anahtar sözcükleri CODE/STATE yerine de yazılabilir. Çözüm sırası: yükseltmedeki ezme > tanımdaki değer > varsayılan (SQLCODE 20000, SQLSTATE 45000). İkisi de işleyicideki bağlam değişkenlerine ve WHEN SQLCODE/WHEN SQLSTATE eşleşmesine akar.