Функция UPPER, используемая при инициализации параметра IN, не работает должным образом

92
13

CREATE OR REPLACE PROCEDURE appraisal
(p_grade IN VARCHAR2 := UPPER(' '))
IS
v_appraisal VARCHAR2(20) := '';
BEGIN
v_appraisal := CASE p_grade
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Very good'
WHEN 'C' THEN 'Bad'
ELSE 'No such grade!'
END;
DBMS_OUTPUT.PUT_LINE('Grade:-'||p_grade ||' Appraisal:-'|| v_appraisal);
END;
/

EXECUTE appraisal('a');

Вывод:

Grade:-a Appraisal:-No such grade!"

Мне интересно, почему это не работает - что я делаю неправильно?

спросил(а) 2021-01-19T16:12:22+03:00 9 месяцев назад
1
Решение
112

Функция UPPER() возвращает верхнюю версию того, что передается ей, но в вашем предложении по умолчанию вы передаете литерал ' ', который представляет собой одно пространство. Пробел не имеет обсадной колонны, поэтому нет разницы между пространством в нижнем регистре и прописным пространством - концепция на самом деле не имеет смысла. Вы не передаете значение параметра процедуры этой функции.

Предложение defaut должно предоставлять значение по умолчанию, если вызывающий абонент не предоставляет его. Итак, если вы execute appraisal; то внутри этой процедуры вызов переменной p_grade будет иметь значение, если одно пробел, что не полезно, и не то, что вы хотите здесь. Вы действительно не хотите дефолт вообще.

Поскольку @DavidFaber сказал, что вам нужно получить заглавный эквивалент значения парметера, когда вы его оцениваете, чтобы вы могли:

CREATE OR REPLACE PROCEDURE appraisal
(p_grade IN VARCHAR2)
IS
v_appraisal VARCHAR2(20);
BEGIN
v_appraisal := CASE UPPER(p_grade)
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Very good'
WHEN 'C' THEN 'Bad'
ELSE 'No such grade!'
END;
DBMS_OUTPUT.PUT_LINE('Grade:-'|| UPPER(p_grade)
||' Appraisal:-'|| v_appraisal);
END;
/

Alternativley вы можете объявить локальную переменную, которая установлена в значение верхнего регистра, и использовать ее:

 v_grade varchar2(1) := UPPER(p_grade);

Обычно вы не должны предполагать, что тот, кто называет вашу процедуру, отобразит буфер dbms_output. Это нормально для отладки или экспериментов, когда вы обычно контролируете вызывающую среду, но не в реальном коде. Например, вам может понадобиться функция, которая возвращает значения v_appraisal, например. Вот демоверсия SQL Fiddle для версии simole. Или просто справочная таблица, в которой содержатся оценки и их описания.

ответил(а) 2021-01-19T16:12:22+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема