2016-03-28 21 views
0

Görevim, tablonun toplam sütun sayısını yazdırmaktır. Ardından, belirli bir kimlik için, yalnızca bu değere sahip sütunların adını yazdırın (bir sütunun belirli bir kimlik için null içeriyorsa atlayın). Kodumda FOR LOOP içinde EXECUTE IMMEDIATE kullanıyorum. EXECUTE IMMEDIATE bir sütunda veri bulamazsa, işleyebileceğim no_data_exception değerini atar, ancak bu özel durumdan sonra döngüye devam edemiyorum.FOR LOOP ve EXECUTE IMMEDIATE ile özel durum yönetimi

DECLARE 
    COL_TOTAL_NUM NUMBER; 
    COL_NAME VARCHAR2(500); 
    COL_VAL VARCHAR2(500); 
BEGIN 
    SELECT COUNT(*) INTO COL_TOTAL_NUM FROM user_tab_cols WHERE TABLE_NAME='PAY_SLIP_FEB_16'; 
    DBMS_OUTPUT.PUT_LINE('TOTAL COLUMN NUMBER = '||COL_TOTAL_NUM); 
    FOR A IN 1..COL_TOTAL_NUM LOOP 
     SAVEPOINT S1; 
     SELECT COLUMN_NAME INTO COL_NAME FROM user_tab_cols WHERE TABLE_NAME='PAY_SLIP_FEB_16' 
                AND COLUMN_ID=A; 
     EXECUTE IMMEDIATE 'SELECT '||COL_NAME||' FROM PAY_SLIP_FEB_16 WHERE EMP_ID=''FMINF83057'' AND '||COL_NAME||' IS NOT NULL' INTO COL_NAME; 
     DBMS_OUTPUT.PUT_LINE(COL_NAME||' -> '||COL_VAL); 
    END LOOP; 
    EXCEPTION 
     WHEN no_data_found THEN 
     DBMS_OUTPUT.PUT_LINE('ERROR'); 
     ROLLBACK TO SAVEPOINT S1; 
END; 

Benim çıktısı:

döngü
TOTAL COLUMN NUMBER = 117 
EMP_ID -> FMINF83057 
MONTH -> 2 
YEAR -> 2016 
NAME -> Mr.Md.Mohiduzzaman 
DESIGNATION -> Professor 
DEPARTMENT -> Institute of Nutrition and Food Sciences 
GRADE -> 2 
BASIC_PAY -> 73720 
HOUSE_RENT_ALLOWANCE -> 19750 
MEDICAL_ALLOWANCE -> 700 
ERROR 

burada durur. Bu hatadan sonra nasıl devam ederim?

+0

Yani 'HATA' yazdırmak istiyor ve sonra LOOP İÇİN devam etmek ister misiniz? Bu durumda, bunu yapabilirsiniz, ancak döngü, "ROLLBACK" komutuna sahip olduğunuzdan baştan başlayacaktır. – Hawk

+0

Hata yazdırmaya ihtiyacım yok. Özel durumu halledebildiğimden emin olmak için yazdırdım. Sadece onu atla ve döngüye devam etmem gerek. –

cevap

0

Hatayla karşılaştığınızda CONTINUE deyimini kullanmanız gerekir. Oracle 11g'den itibaren kullanılabilir. Ancak, döngüsündeki döngüsünü yapmanız gerekir. Ben döngü içinde istisna kısmını taşındı ve bir blok içinde onu kapalı:

DECLARE 
    COL_TOTAL_NUM NUMBER; 
    COL_NAME VARCHAR2(500); 
    COL_VAL VARCHAR2(500); 
BEGIN 
    SELECT COUNT(*) INTO COL_TOTAL_NUM FROM user_tab_cols WHERE TABLE_NAME='PAY_SLIP_FEB_16'; 
    DBMS_OUTPUT.PUT_LINE('TOTAL COLUMN NUMBER = '||COL_TOTAL_NUM); 
    FOR A IN 1..COL_TOTAL_NUM LOOP 
    BEGIN 
     SAVEPOINT S1; 
     SELECT COLUMN_NAME INTO COL_NAME FROM user_tab_cols WHERE TABLE_NAME='PAY_SLIP_FEB_16' 
               AND COLUMN_ID=A; 
     EXECUTE IMMEDIATE 'SELECT '||COL_NAME||' FROM PAY_SLIP_FEB_16 WHERE EMP_ID=''FMINF83057'' AND '||COL_NAME||' IS NOT NULL' INTO COL_NAME; 
     DBMS_OUTPUT.PUT_LINE(COL_NAME||' -> '||COL_VAL); 
    EXCEPTION 
     WHEN no_data_found THEN 
     DBMS_OUTPUT.PUT_LINE('ERROR'); 
     CONTINUE;       --move to the next iteration of the loop 
    END; 
    END LOOP; 
END; 

deyimi döngü geçerli yineleme atlayıp aşağıdaki birine atlamak için derleyici söyler. Günlüğe kaydetme amaçları için özellikle yararlıdır.

+1

İstisnaları for döngüsünün içinde kullanamadım çünkü bir bloğun içine dahil etmedim, ancak döngüyü kapattıktan sonra bunu kullanabilirim, çok teşekkürler. –