PL SQL过程(Oracle)比较where子句中的变量

时间:2012-09-30 17:43:01

标签: mysql sql database oracle sqlplus

这让我发疯了。我想对列和变量进行简单的比较,但它不起作用。以下行总是计算所有元组,而我只需要那些由where子句约束的元素。

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

看起来很简单,但我已经花了好几个小时了。完整的sql proc是

令人困惑的是,如果我用一些硬编码的ID(如105)替换fid,它会给出一个正确的答案),但是当我使用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;

由于

1 个答案:

答案 0 :(得分: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;

(加上其他适当的替代品。)

相关问题