PLSQL中根据条件(其他变量的值)为变量赋值

Assign value to variable based on condition (value of other variable) in PLSQL

我想根据另一个变量是否为 null 为变量赋值。 我知道我在下面给出的相同代码中存在错误, 但我这样试过,但不知道如何完成。 虽然它清楚地说明了我想做什么。

declare 
lv_var1 varchar2(500);
lv_var2 varchar2(20);
ld_date date;

begin 
lv_var2 := 'sample value';
lv_var1 := case ld_date when not null 
                        then lv_var2
           end case;

dbms_output.put_line(lv_var1);         
end;

我想在 ld_date 不为空时将 lv_var2 的值赋给 lv_var1,否则 lv_var1 将为空。

我收到的错误是 ORA-06550。 这可能是因为 case 语句,但我还能用什么代替它来获得结果。

请帮忙。 谢谢...

您在 CASE 表达式中有语法错误,使用时不需要 CASE 关键字和 END 关键字它在 SQL 中。 END PL/SQL.

中需要关键字

使用 CASE 作为 SQL:

SQL> SET serveroutput ON
SQL> DECLARE
  2    lv_var1 VARCHAR2(500);
  3    lv_var2 VARCHAR2(20);
  4    ld_date DATE;
  5  BEGIN
  6    ld_date:= SYSDATE;
  7    lv_var2 := 'sample value';
  8    lv_var1 :=
  9    CASE
 10    WHEN ld_date IS NOT NULL THEN
 11      lv_var2
 12    END;
 13    dbms_output.put_line(lv_var1);
 14  END;
 15  /
sample value

PL/SQL procedure successfully completed.

SQL>

PL/SQL 中使用 CASE:

SQL> SET serveroutput ON
SQL> DECLARE
  2    lv_var1 VARCHAR2(500);
  3    lv_var2 VARCHAR2(20);
  4    ld_date DATE;
  5  BEGIN
  6    ld_date := SYSDATE;
  7    lv_var2 := 'sample value';
  8    CASE
  9    WHEN ld_date IS NOT NULL THEN
 10      lv_var1    := lv_var2;
 11    END CASE;
 12    dbms_output.put_line(lv_var1);
 13  END;
 14  /
sample value

PL/SQL procedure successfully completed.

SQL>

同样可以用IF写成PL/SQL:

SQL> SET serveroutput ON
SQL> DECLARE
  2    lv_var1 VARCHAR2(500);
  3    lv_var2 VARCHAR2(20);
  4    ld_date DATE;
  5  BEGIN
  6    ld_date    := SYSDATE;
  7    lv_var2    := 'sample value';
  8    IF ld_date IS NOT NULL THEN
  9      lv_var1  := lv_var2;
 10    END IF;
 11    dbms_output.put_line(lv_var1);
 12  END;
 13  /
sample value

PL/SQL procedure successfully completed.

SQL>
lv_var1 := case when ld_date is not null 
                    then lv_var2
            end;

select nvl2(ld_date,lv_var2,null) into lv_var1 from dual;

这应该有效:

declare 
lv_var1 varchar2(500);
lv_var2 varchar2(20);
ld_date date;
begin 
ld_date := null;  -- initialize the variable with null, or another value like sysdate
lv_var2 := 'sample value';
lv_var1 := case when ld_date is not null  -- case statement adapted
                        then lv_var2
           end;

dbms_output.put_line(lv_var1);         
end;

Hey you can try nvl2 function which can also suffice your requirement. Hope this helps.

SET serveroutput ON;
DECLARE
  lv_var1 VARCHAR2(500);
  lv_var2 VARCHAR2(20);
  ld_date DATE:= NULL;
BEGIN
  lv_var2 := 'sample value';
  SELECT nvl2(ld_date,lv_var2,NULL) INTO lv_var1 FROM dual;
  dbms_output.put_line(lv_var1);
END;
lv_var1 := case when ld_date is not null 
                        then lv_var2
           else null end case_;