Plsql varchar处理中使用的PL/SQL中的NVL与NVL2

Plsql varchar处理中使用的PL/SQL中的NVL与NVL2,plsql,nvl,Plsql,Nvl,我想在字符串处理中使用NVL2函数,例如 一些变量:=nvl2其他变量'。| |其他变量 为此,我收到了一个错误 PLS-00201:必须声明标识符“NVL2” 令人惊讶的是,这项工作: 某些_变量:=nvl其他_变量 除了使用if-then-end还有什么帮助吗 谢谢 Jan根据本协议,nvl2仅适用于SQL,不适用于PLSQL 你可以像下面这样使用 select nvl2 (other_variable, '.' || other_variable, '') into some_variab

我想在字符串处理中使用NVL2函数,例如

一些变量:=nvl2其他变量'。| |其他变量

为此,我收到了一个错误

PLS-00201:必须声明标识符“NVL2”

令人惊讶的是,这项工作:

某些_变量:=nvl其他_变量

除了使用if-then-end还有什么帮助吗

谢谢 Jan

根据本协议,nvl2仅适用于SQL,不适用于PLSQL

你可以像下面这样使用

select nvl2 (other_variable, '.' || other_variable, '') into some_variable from dual;

您还可以直接在PL/SQL中使用case表达式,以避免在SQL引擎之间切换上下文:

DECLARE
  v_chk VARCHAR2(1);
  v_not_null VARCHAR2(1) := 'B';
  v_null VARCHAR2(1) := 'C';
  v_res VARCHAR2(1);
BEGIN
  v_res := CASE WHEN v_chk IS NOT NULL THEN v_not_null
                ELSE v_null
           END;
  dbms_output.put_line('v_chk = "'||v_chk||'", v_res = "'||v_res||'"');

  v_chk := 'A';
  v_res := CASE WHEN v_chk IS NOT NULL THEN v_not_null
                ELSE v_null
           END;
  dbms_output.put_line('v_chk = "'||v_chk||'", v_res = "'||v_res||'"');
END;
/

v_chk = "", v_res = "C"
v_chk = "A", v_res = "B"

我创建了一个函数,这样我就可以像在plsql中一样使用nvl2,它可能也适合您的目的

create or replace FUNCTION NVL2
( p_value                  IN VARCHAR2,
  p_newval_if_not_null     IN VARCHAR2,
  p_newval_if_null         IN VARCHAR2 ) RETURN VARCHAR2 DETERMINISTIC IS

BEGIN

  IF p_value IS NOT NULL THEN
    RETURN(p_newval_if_not_null);
  ELSE
    RETURN(p_newval_if_null);
  END IF;

END;

如果需要,可以重新创建它以使用不同的数据类型

谢谢。是的,就是这样。我使用PL/SQL作为另一种具有SQL知识的脚本语言,这对于nvl的工作来说是一个惊喜。