【发布时间】:2020-06-23 00:14:49
【问题描述】:
这应该是一个简单的问题。我想要一个特定的列 claimby 在用户 ID 和任何内容之间交替。所以,我正在编写一个简单的程序,它应该查看该列以查看用户 ID 是否在其中。如果是,请将其设置为空。如果没有,则将其设置为用户 ID。这就是我所需要的。但是,我在确定该列是否为空时遇到了困难。我正在尝试各种方法,例如 1) case claimby when null,2) case claimby when '',3) if length(claimedby)
create or replace PROCEDURE claimprocedure
( userID IN varchar2, docketnum IN varchar2 )
IS
claimed_by varchar2(10);
cursor c1 is
SELECT claimedby FROM DR_RULE24.CISR_INTAKE_ERRORS_MASTER
WHERE docket_num = docketnum;
BEGIN
open c1;
fetch c1 into claimed_by;
close c1;
DBMS_OUTPUT.PUT_LINE('claimed_by = ' || claimed_by);
CASE claimed_by
when null then update DR_RULE24.cisr_intake_errors_master set claimedby = userID where docket_num = docketnum;
when '' then update DR_RULE24.cisr_intake_errors_master set claimedby = userID where docket_num = docketnum;
ELSE update DR_RULE24.cisr_intake_errors_master set claimedby = '' where docket_num = docketnum;
END CASE;
if length(claimed_by) < 1 then update DR_RULE24.cisr_intake_errors_master set claimedby = userID where docket_num = docketnum;
else update DR_RULE24.cisr_intake_errors_master set claimedby = '' where docket_num = docketnum;
end if;
if claimed_by = '' then update DR_RULE24.cisr_intake_errors_master set claimedby = userID where docket_num = docketnum;
else update DR_RULE24.cisr_intake_errors_master set claimedby = '' where docket_num = docketnum;
end if;
if claimed_by is null then update DR_RULE24.cisr_intake_errors_master set claimedby = userID where docket_num = docketnum;
else update DR_RULE24.cisr_intake_errors_master set claimedby = '' where docket_num = docketnum;
end if;
END;
我确认该列设置为空,然后我调用它:
SET SERVEROUTPUT ON
call claimprocedure('shone','106712');
案卷编号 106712 的列未设置为“闪耀”。我已经确认程序中的claim_by变量与claimby列的结构相匹配,即varchar2(10);
我认为也许 IF 语句可能会相互抵消。所以,我注释掉了所有的 ELSE 子句并再次尝试。它仍然为空,证明这些 IF 语句都不起作用。
这一定很简单。我错过了什么?谢谢。
【问题讨论】:
-
除了我的答案,试试这个:select length(null) from dual;如果你不理解输出,请查找 length 的文档乙>。然后想想条件 null ;这是什么时候真的?
标签: oracle if-statement null case varchar2