Oracle PL/SQL似乎忽略了我函数的WHERE子句
我有一个俱乐部成员表,其中有一列状态,a希望在下面的功能中将其用作过滤器。但是无论我作为函数参数传递什么数字,结果总是一样的。计数总是与整个表的寄存器总数一起出现Oracle PL/SQL似乎忽略了我函数的WHERE子句,oracle,plsql,oracle18c,Oracle,Plsql,Oracle18c,我有一个俱乐部成员表,其中有一列状态,a希望在下面的功能中将其用作过滤器。但是无论我作为函数参数传递什么数字,结果总是一样的。计数总是与整个表的寄存器总数一起出现 CREATE OR REPLACE FUNCTION fn_count_members (id_status in club.members.id_status%TYPE) RETURN NUMBER IS total club.members.id%TYPE:=0; BEGIN SELECT COUNT(id) INTO t
CREATE OR REPLACE FUNCTION fn_count_members
(id_status in club.members.id_status%TYPE)
RETURN NUMBER IS
total club.members.id%TYPE:=0;
BEGIN
SELECT COUNT(id) INTO total
FROM club.members m
WHERE m.id_status = id_status;
RETURN total;
END;
以及查询:
select id_status, fn_count_members(1) as total from club.members;
我错过了什么?
谢谢。这是错误的:
(id_status in club.members.id_status%TYPE)
---------
this
因为,在where子句中使用时
结果是1=1并返回所有内容,根本不进行过滤
将参数重命名为,例如
(par_id_status in club.members.id_status%TYPE)
并将其用作
WHERE m.id_status = par_id_status
这是错误的:
(id_status in club.members.id_status%TYPE)
---------
this
因为,在where子句中使用时
结果是1=1并返回所有内容,根本不进行过滤
将参数重命名为,例如
(par_id_status in club.members.id_status%TYPE)
并将其用作
WHERE m.id_status = par_id_status
你有两个问题:
创建或替换函数fn\u count\u成员
俱乐部中的p_id_状态。成员。id_状态%TYPE-将参数名称更改为
-一些不同于
-列名。
返回号码是
俱乐部成员总数。id%类型:=0;
开始
选择COUNTid进入总数
来自俱乐部成员
其中m.id\u status=p\u id\u status;-这里呢
返回总数;
终止
/
然后需要传入参数,而不是使用1:
选择id\U状态,
fn\u计数\u成员SID\u状态总计
来自俱乐部会员;
dbfiddle您有两个问题:
创建或替换函数fn\u count\u成员
俱乐部中的p_id_状态。成员。id_状态%TYPE-将参数名称更改为
-一些不同于
-列名。
返回号码是
俱乐部成员总数。id%类型:=0;
开始
选择COUNTid进入总数
来自俱乐部成员
其中m.id\u status=p\u id\u status;-这里呢
返回总数;
终止
/
然后需要传入参数,而不是使用1:
选择id\U状态,
fn\u计数\u成员SID\u状态总计
来自俱乐部会员;
Dfiddlefn\u count\u members1!=fn\u计数\u成员SID\u状态。例如,只需将固定值1转换为id_statusLittlefoot就可以给出答案,并找到解决方法。要理解这个问题,您需要熟悉名称解析-如果相同的名称用于多个事物,会发生什么情况。在where子句中,一个id_状态由m限定,因此没有混淆。另一个不合格。在查询中,第一个选项是表中的一列。有这样一列,因此将使用它。它不会是传递给函数的参数。然后-除了Littlefoot所展示的之外,还有其他修复方法,但这是最好的选择。fn_count_members1!=fn\u计数\u成员SID\u状态。例如,只需将固定值1转换为id_statusLittlefoot就可以给出答案,并找到解决方法。要理解这个问题,您需要熟悉名称解析-如果相同的名称用于多个事物,会发生什么情况。在where子句中,一个id_状态由m限定,因此没有混淆。另一个不合格。在查询中,第一个选项是表中的一列。有这样一列,因此将使用它。它不会是传递给函数的参数。然后-除了Littlefoot所展示的,还有其他的修复方法,但这是最好的选择。非常感谢!非常感谢你!非常感谢你!非常感谢你!