Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql PLSQL程序(Oracle)比较where子句中的变量_Mysql_Sql_Database_Oracle_Sqlplus - Fatal编程技术网

Mysql PLSQL程序(Oracle)比较where子句中的变量

Mysql PLSQL程序(Oracle)比较where子句中的变量,mysql,sql,database,oracle,sqlplus,Mysql,Sql,Database,Oracle,Sqlplus,这让我快发疯了。我想对一个列和一个变量进行简单的比较,但它就是不起作用。下一行总是计算所有元组,而我只需要where子句所限定的元组 SELECT count(*) INTO cnt from class where class.fid = fid; 看起来很简单,但我已经做了好几个小时了。完整的sql过程是 令人困惑的是,如果我用一些硬编码的ID(比如105)替换fid,它会给出正确的答案),但当我使用fid时,它就不再工作了,并返回所有类的计数。出于某种原因,始终使用class.fid=

这让我快发疯了。我想对一个列和一个变量进行简单的比较,但它就是不起作用。下一行总是计算所有元组,而我只需要where子句所限定的元组

 SELECT count(*) INTO cnt from class where class.fid = fid;
看起来很简单,但我已经做了好几个小时了。完整的sql过程是

令人困惑的是,如果我用一些硬编码的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;

谢谢

我认为您需要重命名局部变量
fid或为其添加前缀
,因为它不幸与您正在查询的表中的列名匹配。SQL引擎只是比较每一行的
fid=fid
,这总是正确的(空值除外,但那是另一回事)。另外,如果变量的名称与列的名称相同,则更难读取代码

在PL/SQL中,有一种惯例是在局部变量前面加上
l
(对于局部变量),因此很清楚其目的是什么。但是,除了列名之外的任何名称都足够了。尝试:

l_fid faculty.fid%type := 102;
然后

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

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

谢谢!那是一个可怕的错误,我为此付出了很多努力。现在可以了!天哪@用户1710120我很高兴你解决了这个问题。如果您愿意,欢迎您将此答案标记为正确。