2012-09-30 25 views
7

Maddesindeki bir değişkenin karşılaştırılması Bu beni çıldırtıyor. Bir sütunun ve bir değişkenin basit bir karşılaştırmasını yapmak istiyorum ama sadece işe yaramıyor. Aşağıdaki satır her zaman tüm tuplları sayarken, sadece buradaki şartlara göre şart koşulanlara ihtiyacım var.PLSQL Procudure (Oracle)

SELECT count(*) INTO cnt from class where class.fid = fid; 

Sooooo basit görünüyor ama saatlerce üzerinde çalışıyorum. Komple sql proc değeri

Büyük kafa karıştırıcı şey, eğer fid'i kodlanmış bir ID ile değiştirirsek (105 gibi) doğru bir cevap verir), ama fid'i kullandığım zaman artık işe yaramıyor ve geri dönüyor. tüm sınıfların sayısı. Herhangi bir nedenle, her zaman class.fid = fid. >, < veya <> tuşlarını kullandığımda, 0 sayımı geri döndürülür!

create or replace PROCEDURE pro_report2 
AS 
CURSOR c_dept IS select deptid, dname from department; 
TYPE cur_typ IS REF CURSOR; 
c1 cur_typ; 
query_str1 VARCHAR2(200); 
fid faculty.fid%type := 102; 
fname faculty.fname%type; 
cnt NUMBER; 

BEGIN 
    FOR dept_row in c_dept LOOP 
     DBMS_OUTPUT.PUT_LINE('Dept.Name: ' || dept_row.dname); 
     DBMS_OUTPUT.PUT_LINE('Faculty Name' || chr(9)|| chr(9) || '0 Class' || chr(9) || chr(9) || '1 Class' || chr(9) || chr(9) || '2 Classes' || chr(9) || '>2 Classes'); 
     DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------------------'); 
     --find all faculty in this department 
     query_str1 := 'select fid, fname from faculty where faculty.deptid = ' || to_char(dept_row.deptid); 
     open c1 for query_str1; 
     LOOP 
      FETCH c1 into fid, fname; 
      exit when c1%notfound; 
      DBMS_OUTPUT.PUT_LINE(fname); 
      SELECT count(*) INTO cnt from class where class.fid = fid; 
      DBMS_OUTPUT.PUT_LINE(to_char(cnt) || ' ' || to_char(fid)); 
     END LOOP; 
     -- Spaces between departments 
     DBMS_OUTPUT.PUT_LINE(chr(10)); 
     DBMS_OUTPUT.PUT_LINE(chr(10)); 
    END LOOP; 
END; 

Teşekkür

cevap

7

sana adlandırmak ya da maalesef sorguladığınız tablodaki sütun adıyla eşleşen olarak yerel değişken fid önüne gerektiğine inanıyorum. SQL motoru her satır için fid = fid'u karşılaştırır, bu her zaman doğru olur (boş değerlerin dışında, ama bu başka bir hikaye). Ayrıca, sütun olarak adlandırılan değişkenlere sahip olduğunuzda kodunuzu okumak daha zordur.

PL/SQL'de yerel değişkenleri l_ (yerel için) önekine almak için bir kural olma eğilimindedir, bu nedenle amacın ne olduğu anlaşılır. Ancak, bir sütun adı dışında herhangi bir isim yeterli olacaktır. Deneyin:

l_fid faculty.fid%type := 102; 

Ve sonra ...

SELECT count(*) INTO cnt from class where class.fid = l_fid; 

+0

teşekkür ederiz (diğer uygun değiştirmeler Artı.)! Bu korkunç bir hataydı ve bana çok fazla iş verdi. Şuan çalışıyor! AMAN TANRIM! – user1710120

+0

@ user1710120 Sorunu çözdüğünüze sevindim. İsterseniz bu cevabı doğru olarak işaretleyebilirsiniz. – Wolf