NVL против NVL2 в PL / SQL, используемых в обработке varchar - PullRequest
2 голосов
/ 07 марта 2019

Я хочу использовать функцию NVL2 при обработке строк, например,

some_variable := nvl2 (other_variable, '.' || other_variable, '');

Для этого я получаю ошибку

PLS-00201: identifier 'NVL2' must be declared

Удивительно, работает:

some_variable := nvl (other_variable, '');

Есть ли какая-либо помощь, кроме использования if-then-end?

Спасибо Jan

Ответы [ 3 ]

3 голосов
/ 07 марта 2019

Согласно этой ссылке nvl2 доступен только для SQL, а не для PLSQL

Вы можете использовать как показано ниже

select nvl2 (other_variable, '.' || other_variable, '') into some_variable from dual;
1 голос
/ 07 марта 2019

Вы также можете использовать выражение case непосредственно в PL / SQL (что позволяет избежать переключения контекста на и из механизма 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"
0 голосов
/ 08 марта 2019

Я создал функцию, чтобы я мог использовать nvl2, как если бы он существовал в plsql, он может также соответствовать вашим целям

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;

Затем он может быть воссоздан для использования различных типов данных, если требуется

...