2012-09-30 40 views
7

Điều này khiến tôi phát điên. Tôi muốn làm so sánh đơn giản của một cột và một biến nhưng nó chỉ không hoạt động. Dòng sau luôn luôn đếm tất cả các bộ dữ liệu trong khi tôi chỉ cần những người được điều chỉnh theo mệnh đề where.PLSQL Procudure (Oracle) So sánh một biến trong mệnh đề

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

Dường như rất đơn giản nhưng tôi đã làm việc này hàng giờ liền. Các sql proc hoàn chỉnh là

Điều khó hiểu lớn nhất là nếu tôi thay thế fid bằng một số ID được mã hóa cứng (như 105) nó đưa ra câu trả lời đúng), nhưng khi tôi sử dụng nó sẽ không hoạt động nữa và trả về đếm tất cả các lớp. Vì một lý do nào đó, luôn luôn class.fid = fid. Khi tôi sử dụng>, < hoặc <>, số 0 được trả về!

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; 

Cảm ơn

Trả lời

7

Tôi tin rằng bạn cần phải đổi tên hoặc tiền tố biến địa phương của bạn fid vì nó không may khớp với tên cột trong bảng bạn đang truy vấn. Công cụ SQL chỉ đơn giản là so sánh fid = fid cho mỗi hàng, điều này sẽ luôn đúng (trừ các giá trị rỗng, nhưng đó là một câu chuyện khác). Thêm vào đó, khó đọc mã của bạn hơn khi bạn có các biến có tên giống như một cột.

Trong PL/SQL có xu hướng là một quy ước để tiền tố biến cục bộ với l_ (cho địa phương) để rõ ràng mục đích là gì. Tuy nhiên, bất kỳ tên nào khác ngoài tên cột sẽ đủ. Hãy thử:

l_fid faculty.fid%type := 102; 

Và sau đó ...

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

+0

Cảm ơn bạn (Plus thay thế thích hợp khác.)! Đó là một sai lầm kinh khủng và nó khiến tôi tốn rất nhiều công sức. Nó hoạt dộng bây giờ! CHÚA ƠI! – user1710120

+0

@ user1710120 Tôi rất vui khi bạn giải quyết vấn đề. Bạn được quyền đánh dấu câu trả lời này là chính xác nếu bạn muốn. – Wolf

Các vấn đề liên quan