2012-09-30 11 views
7

これは私を夢中にしています。私は列と変数の簡単な比較をしたいが、それは動作しません。次の行は、すべてのタプルをカウントしますが、where句で調整されたタプルのみ必要です。PLSQL Procudure(Oracle)where節の変数の比較

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

シンプルに見えますが、私はこれを何時間も働いています。完全なSQLプロシージャは

です。私がfidを(105のような)ハードコードされたIDで置き換えた場合、大きな混乱を招くことがありますが、fidを使用するとそれ以上は機能しませんすべてのクラスの数。何らかの理由で、常にclass.fid = fid。 >、<または<>を使用すると、0カウントが返されます。私はあなたが、それは残念ながらあなたが照会されているテーブルの列名と一致するよう、ローカル変数fidの名前を変更またはプレフィックスする必要があると考えてい

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

。 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