mysql - PL SQL Procedure (Oracle) 比较 where 子句中的变量

标签 mysql sql database oracle sqlplus

这让我发疯。我想对列和变量进行简单比较,但它不起作用。以下行总是计算所有元组,而我只需要那些由 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;

(加上其他适当的替换。)

关于mysql - PL SQL Procedure (Oracle) 比较 where 子句中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12663484/

相关文章:

php - 使用 php 的 mysqli 准备好的语句很慢

c# - LINQ - 不返回与 SQL Server 相同的值

MySQL 不会向同一张表添加多个外键

sql - 添加第二个连接条件以指数方式增加查询时间

mysql - 如何在 k8s 中连接到我的 mysql pod 或 mysql 节点?

mysql - 使用两个单独的 SQL 语句还是一个 SQL 语句与 JOIN 结合使用更快?

javascript - 如何缩短代码或将其存储在数据文件中

ruby-on-rails - 在 Ruby on Rails 上使用表行值进行数学运算

database - 如何设计我的应用程序以使审计跟踪无法编辑或删除?

php - 多个 MySQL 查询并从表中获取最低价格