PL/SQL

2011-01-18 8 views
11

'da bir sütun üzerinde yineleme EmpID, Empname, Maaş ile bir tablo var ve her çalışan için bir hesaplama yapmaya çalışıyorum. Ama her bir empın üzerinde hesaplamayı yapmak için yinelemeye çalışıyorum. Ben açıkça imleçler kullanamazsınız.PL/SQL

Bu yüzden şu anda sadece empIDs listesini oluşturmak çalışıyorum:

Declare 
    aRows Number; 
    eid emp_ID%TYPE; 
Begin 
    Select Count(*) 
    Into aRows 
    from emp; 

    Select emp_ID 
    Into eid 
    From emp; 

    FOR days IN 1..Tot_Rows 
    Loop 
     Dbms_Output.Put_Line(eid); 
     eid := eid + 1; 
    End Loop; 
END; 

Ama hatayı alıyorum: PLS-00320: bu ifadenin türü beyanı olan eksik veya hatalı

cevap

24

PL/SQL bir tablonun satırlarını üzerinde yineleme yapmak kolay yolu tüm alamadan,

BEGIN 
    FOR employees IN (SELECT emp_id FROM emp) 
    LOOP 
    dbms_output.put_line(employees.emp_id); 
    END LOOP; 
END; 

Alternatif gibi bir şey yapmaktır sorgu PGA bellek daha kullanabilir koleksiyonuna tüm verileri alma işleminde ancak, satır binlerce dönebiliyor EID Bu örnekte

DECLARE 
    TYPE emp_id_tbl IS TABLE OF emp.emp_id%type; 
    l_emp_ids emp_id_tbl ; 
BEGIN 
    SELECT emp_id 
    BULK COLLECT INTO l_emp_ids 
    FROM emp; 

    FOR i IN l_emp_ids .FIRST .. l_empnos.LAST 
    LOOP 
    dbms_output.put_line(l_emp_ids (i)); 
    END LOOP; 
END; 

olduğu gibi bir PL/SQL koleksiyon haline değerleri ve koleksiyonu üzerinde yineleme İstediğinizden ve LIMIT deyimini kullanarak satırları satırlara almanız gerekebilir. Ama bu, bu noktada kendimize doğru geliyor gibi görünüyor.

+0

Yardımınız için teşekkürler Justin, ama ilk kodunuzu çalıştırdığımda ancak dbms çıkışı (eid) değil (employees.eid), dbms çıkışında yazdıramıyor. Neden biliyor musun? – Leo

+0

@ Leo- Hangi aracı kullanıyorsunuz? SQL * Plus'da, DBMS_OUTPUT çıktısını etkinleştirmek için SET SERVEROUTPUT ON komutunu çalıştırmanız gerekir. –

+0

@Leo: "declare" bölümünü sakladıysanız, "eid" başlatılamayabilir; bu nedenle, sunucu çıktısı etkinleştirilmiş olduğu varsayılarak boş yazdırılır. @Justin, "dbms_output.put_line (employed.emp_id)" veya imlecin sütun takma adı olmalı mı? –

4

Justin Mağarası bunu yapmak için, ama özellikle elindeki hata bakmak nasıl izah etmiştir, çünkü bu oldu:

eid emp_ID%TYPE; 

kullanarak %TYPE tablo adını belirtmek yanı sıra zorunda sütun adı: satırdaki tüm sütunları seçerek olsaydı

eid emp.emp_ID%TYPE; 

ayrıca %ROWTYPE bakabilir. Sizin yaklaşımınız da iki varsayım yapıyordu: eid'a ilk seçimin en düşük ID olduğunu buldu; ve sonraki tüm ID değerleri sıralıdır. Ve aRows bildiriyor ve dolduruyorsunuz ancak Tot_Rows'a başvuruyorsunuz.

İlgili konular