2012-09-30 42 views
7

這讓我瘋狂。我想做一個列和一個變量的簡單比較,但它不起作用。下面一行總是記錄所有的元組,而我只需要那些由where子句調整的元組。PLSQL Procudure(Oracle)比較where子句中的變量

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

它看起來SOOOOO簡單,但我一直工作在這幾個小時。完整的SQL PROC是

大令人困惑的事情是,如果我更換FID一些硬編碼ID(如105),它給出了一個正確的答案),但是當我使用FID它只是不工作了,返回所有班級的人數。出於某種原因,總是class.fid = fid。當我使用>,<或<>時,返回0個計數!

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; 

感謝

回答

7

我相信你需要重命名或前綴局部變量fid因爲它不幸的是你查詢的表匹配的列名。 SQL引擎簡單地比較每行fid = fid,這將永遠是真實的(除了空值,但這是另一回事)。另外,當您將變量命名爲與列相同的變量時,更難以閱讀代碼。

在PL/SQL中,往往會有一個約定,將局部變量前綴爲l_(對於本地),所以清楚它的目的是什麼。但是,列名以外的任何名稱都可以。嘗試:

l_fid faculty.fid%type := 102; 

然後......

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

+0

謝謝你(及其他適當的替代品。)!那是一個可怕的錯誤,它耗費了我很多工作。它現在有效!我的天啊! – user1710120

+0

@ user1710120我很高興你解決了這個問題。如果您願意,歡迎您將此答案標記爲正確。 – Wolf