gpt4 book ai didi

oracle - 在 Oracle PL/SQL 中处理 NULL

转载 作者:行者123 更新时间:2023-12-04 07:52:28 25 4
gpt4 key购买 nike

数据通过sql插入语句导入data_import表。这些插入语句可能不是最准确的,所以我想将所有数据放入表中(因此没有防止重复的 PK)
该代码使用出现次数的计数检查 data_import 表的内容是否有重复的实例,任何出现都被标记为错误。

DECLARE
CURSOR C_DUPLICATE_IMPORT_IDS
IS
SELECT COUNT (D.LEARNER_ID), D.LEARNER_ID
FROM ILA500.DATA_IMPORT D
WHERE D.USER_ID IN (SELECT S.OSUSER
FROM V$SESSION S
WHERE S.SID IN (SELECT DISTINCT V.SID
FROM V$MYSTAT V))
AND D.ERROR_FLAG = 'N'
AND D.LEARNER_ID <> NULL
HAVING COUNT (D.LEARNER_ID) > 1
GROUP BY D.LEARNER_ID;


V_DUPLICATE_IMPORT_IDS C_DUPLICATE_IMPORT_IDS%ROWTYPE;
BEGIN
OPEN C_DUPLICATE_IMPORT_IDS;

LOOP
FETCH C_DUPLICATE_IMPORT_IDS INTO V_DUPLICATE_IMPORT_IDS;

EXIT WHEN C_DUPLICATE_IMPORT_IDS%NOTFOUND;

UPDATE ILA500.DATA_IMPORT D
SET D.ERROR_FLAG = 'Y'
WHERE D.LEARNER_ID = V_DUPLICATE_IMPORT_IDS.LEARNER_ID;

UPDATE ILA500.DATA_IMPORT D
SET D.IMPORT_NOTIFICATION =
'DUPLICATE LEARNER_ID IDENTIFIED ('
|| V_DUPLICATE_IMPORT_IDS.LEARNER_ID
|| '). LEARNER_IDS ERROR_FLAG SET, THIS CASE WILL NOT IMPORT UNTIL CORRECTED.'
WHERE D.LEARNER_ID = V_DUPLICATE_IMPORT_IDS.LEARNER_ID;

IF V_DUPLICATE_IMPORT_IDS.LEARNER_ID IS NOT NULL
THEN
DBMS_OUTPUT.PUT_LINE (
'THE FOLLOWING LEARNER WAS IDENTIFIED AS A DUPLICATE '
|| V_DUPLICATE_IMPORT_IDS.LEARNER_ID);
ELSE
DBMS_OUTPUT.PUT_LINE (
CHR (10)
|| 'THERE ARE NO DUPLICATE LEARNER_IDS WITHIN THIS UPLOAD.');

END IF;

END LOOP;

CLOSE C_DUPLICATE_IMPORT_IDS;
DBMS_OUTPUT.PUT_LINE (CHR (10) || 'STEP 1 COMPLETED');
COMMIT;
END;
我的问题出在 IF 语句中
IF V_DUPLICATE_IMPORT_IDS.LEARNER_ID IS NOT NULL
THEN
DBMS_OUTPUT.PUT_LINE (
'THE FOLLOWING LEARNER WAS IDENTIFIED AS A DUPLICATE '
|| V_DUPLICATE_IMPORT_IDS.LEARNER_ID);
ELSE
DBMS_OUTPUT.PUT_LINE (
CHR (10)
|| 'THERE ARE NO DUPLICATE LEARNER_IDS WITHIN THIS UPLOAD.');

如果计数大于 1,则返回数据并且
DBMS_OUTPUT.PUT_LINE ('THE FOLLOWING LEARNER WAS IDENTIFIED AS A DUPLICATE '|| DUPLICATE_IMPORT_IDS.LEARNER_ID);
语句成功输出该行。
但是,如果在查询中返回空计数
ELSE (DBMS_OUTPUT.PUT_LINE (
CHR (10)
|| 'THERE ARE NO DUPLICATE LEARNER_IDS WITHIN THIS UPLOAD.');)
不输出行。
如何获取 dmbs_output 以从空值生成数据?

最佳答案

However if a null count is returned ...


无法返回空计数。 COUNT (D.LEARNER_ID)在您的游标查询中不能评估为空;它可能会产生零,但您正在使用 HAVING 过滤任何此类结果。子句(如果可能发生,也将排除 null)。由于您计算值的方式,因此无法返回空 ID。
您的游标查询包括:
AND D.LEARNER_ID <> NULL
这是不对的; null 不等于或不等于任何值,因此这排除了所有行;你可以这样做:
AND D.LEARNER_ID IS NOT NULL
但无论如何它都是多余的,因为你正在做 COUNT(D.LERARNER_ID) ,这不会计算空值。如果你在做 COUNT(*) 会有所作为尽管。 db<>fiddle只用游标查询,显示出这种效果。
无论如何...如果你想为每个 ID 显示一条消息,如果没有重复,你可以删除 HAVING子句和测试非零而不是非空;但是从文本看来,如果您的光标根本找不到任何行,您似乎只需要一条消息。如果您进入游标循环,您可以使用“找到”标志来处理该问题,如果您进入游标循环,则将其设置为 true,然后在循环后进行测试:
DECLARE
CURSOR C_DUPLICATE_IMPORT_IDS
IS
...

V_DUPLICATE_IMPORT_IDS C_DUPLICATE_IMPORT_IDS%ROWTYPE;

V_FOUND BOOLEAN := FALSE;
BEGIN
OPEN C_DUPLICATE_IMPORT_IDS;

LOOP
FETCH C_DUPLICATE_IMPORT_IDS INTO V_DUPLICATE_IMPORT_IDS;

EXIT WHEN C_DUPLICATE_IMPORT_IDS%NOTFOUND;
...

DBMS_OUTPUT.PUT_LINE (
'THE FOLLOWING LEARNER WAS IDENTIFIED AS A DUPLICATE '
|| V_DUPLICATE_IMPORT_IDS.LEARNER_ID);

V_FOUND := TRUE;
END LOOP;

CLOSE C_DUPLICATE_IMPORT_IDS;

IF NOT V_FOUND THEN
DBMS_OUTPUT.PUT_LINE (
CHR (10)
|| 'THERE ARE NO DUPLICATE LEARNER_IDS WITHIN THIS UPLOAD.');

END IF;

DBMS_OUTPUT.PUT_LINE (CHR (10) || 'STEP 1 COMPLETED');
COMMIT;
END;
db<>fiddle有和没有匹配数据。
您也可以使用隐式游标循环稍微简化一下,但“找到”逻辑是相同的。

关于oracle - 在 Oracle PL/SQL 中处理 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66885023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com