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

时间:2016-02-17 11:05:35

标签: oracle plsql oracle11g plsqldeveloper

我想根据另一个变量是否为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;

我想在lv_var2不为空时将lv_var1的值分配到ld_date,否则lv_var1将为空。

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

请帮忙。 谢谢......

5 个答案:

答案 0 :(得分:1)

CASE 表达式中存在语法错误,在 SQL中使用 END 关键字时不需要CASE关键字 PL / SQL 中需要END个关键字。

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>

可以使用 PL / SQL

中的 IF 编写相同的内容
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>

答案 1 :(得分:1)

lv_var1 := case when ld_date is not null 
                        then lv_var2
           else null end case_;

答案 2 :(得分:0)

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;

答案 3 :(得分:0)

这应该有效:

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;

答案 4 :(得分:0)

  

嘿,你可以尝试nvl2功能,这也足以满足你的要求。   希望这会有所帮助。

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;