【发布时间】:2021-04-25 01:00:47
【问题描述】:
我写了以下函数。但最后我无法在 count 为空时检测到它并放入返回 0 的 result 变量;不知道怎么回事,可能count(*)应该是外部SELECT放的,不确定。
运行为例,随机输入:
SELECT is_department_active('44','222') from dual
我得到了 is_department_active (null) 但预期为 0。
CREATE OR REPLACE FUNCTION is_department_active (
department_id VARCHAR2,
doc_id VARCHAR2
) RETURN NUMBER IS
result NUMBER(1);
cnt number(3);
BEGIN
result:=0;
SELECT
dep_active, count(*)
INTO result,cnt
FROM
(
SELECT
grade,
dep_active, 3 "priority number"
FROM
vrsc.inst_department
WHERE
af_feature_id = department_id
AND grade = 'DOC'
AND grade_field = doc_id
UNION
SELECT grade,
dep_active,
1 "priority number"
FROM
vrsc.inst_department
WHERE
af_feature_id = department_id
AND grade = 'CUSTOMER'
AND grade_field IN (
SELECT
doc_cust_id
FROM
customer_docs
WHERE
doc_id = doc_id)
UNION
SELECT
grade,
dep_active,
0 "priority number"
FROM
vrsc.inst_department
WHERE
af_feature_id = department_id
AND grade = 'DEFAULT'
AND GRADE_FIELD = 'DEFAULT'
UNION
SELECT
grade, dep_active,
2 "priority number"
FROM
vrsc.groups_docs left
JOIN vrsc.inst_department ON grade = 'GROUP'
AND grade_field = gs_group_id
AND grade_sec_field = gs_doc_code
WHERE
gs_doc_id = doc_id
AND af_feature_id = feature_id
ORDER BY
"priority number" DESC
)
WHERE
ROWNUM = 1 group by dep_active;
if cnt=0 then
result:=0;
end if;
RETURN result;
END;
我想获取优先级为 3 的第一行,但如果此查询为 null,则我无法将 0 作为 DEFAULT 返回。
【问题讨论】:
-
如果您使用这些参数运行“SELECT AND UNION INSIDE”子查询,结果是什么样的?如果它返回
null, 1,则会导致此问题。 -
你写的代码看起来有点糟糕(不要误会我的意思,但是...... ROWNUM = 1 的聚合看起来很可疑)。如果您发布一些示例数据并解释某些部门被认为是“活跃的”意味着什么,也许会更好。也许有人会提出比你更好的方法。
-
@kfinity 我把部分放在 select 和 union 里面,它给了我空
-
@Littlefoot 我编辑并把部分放在里面:选择和联合
-
我发布了一个答案;请看一下。