【问题标题】:Assign value to variable based on condition (value of other variable) in PLSQL根据PLSQL中的条件(其他变量的值)为变量赋值
【发布时间】:2016-05-29 01:14:04
【问题描述】:

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

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 语句,但我还能用什么来代替它来获得结果。

请帮忙。 谢谢...

【问题讨论】:

    标签: oracle plsql oracle11g plsqldeveloper


    【解决方案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>
    

    【讨论】:

      【解决方案2】:
      lv_var1 := case when ld_date is not null 
                              then lv_var2
                 else null end case_;
      

      【讨论】:

        【解决方案3】:
        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;
        

        【讨论】:

        • 不,还是错了。 ELSE 与 OP 的错误无关。 ELSE 是可选的,不是强制性的。问题在于 PL/SQL 中的语法。
        【解决方案4】:

        这应该可行:

        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;
        

        【讨论】:

          【解决方案5】:

          你可以试试 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;
          

          【讨论】:

            猜你喜欢
            • 2020-02-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-20
            • 2022-08-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多