Orace SQL - вложенные операторы CASE

Мне нужно добавить к функции параметр COD. COD - это число, 2, 4 или 6. Мне нужно преобразовать параметр unit1 в unit2 в зависимости от количества.

Меня интересует только последняя часть кода, когда unit1 является «планшетом», а cod = 4 преобразует «планшет» в кг (для unit2). Я хочу, чтобы код рассчитывался с помощью WHEN 'KG' THEN IVALUE := QUANTITY * 0.0000011, в противном случае, если это что-то еще, кроме cod = 4, я хочу, чтобы он рассчитывался с помощью WHEN 'KG' THEN IVALUE := QUANTITY * 0.00025.

Как мне написать приведенный ниже код, чтобы он правильно скомпилировался?

Я получаю синтаксическую ошибку в Oracle. Я неправильно вложил свои операторы CASE?

create or replace FUNCTION  CONVERTUNITOFMEASURE_COD
 (COD NUMBER,
QUANTITY NUMBER,
UNIT1 VARCHAR2,
UNIT2 VARCHAR2)
RETURN NUMBER IS
  IVALUE NUMBER;
  OUT_UOM NUMBER;
BEGIN

CASE UPPER(UNIT1)

WHEN 'KG' THEN
    CASE UPPER(UNIT2)
      WHEN 'LB' THEN IVALUE := QUANTITY / 0.45359237;
      WHEN 'G' THEN IVALUE := QUANTITY / 0.001;
      WHEN 'L' THEN IVALUE := QUANTITY / 0.8;
      WHEN 'TABL' THEN IVALUE := QUANTITY / 0.00025;
      WHEN 'GAL' THEN IVALUE := QUANTITY / 2.64;
      WHEN 'KG' THEN IVALUE := QUANTITY * 1;
      ELSE NULL;
    END CASE;

WHEN 'G' THEN
    CASE UPPER(UNIT2)
      WHEN 'LB' THEN IVALUE := QUANTITY  * 0.00220462262 ;
      WHEN 'KG' THEN IVALUE := QUANTITY * 0.001;
      WHEN 'G' THEN IVALUE := QUANTITY * 1;
      ELSE NULL;
    END CASE;

WHEN 'LB' THEN
    CASE UPPER(UNIT2)
        WHEN 'KG' THEN IVALUE := QUANTITY * 0.45359237;
        WHEN 'G' THEN IVALUE := QUANTITY * 453.59237;
        WHEN 'LB' THEN IVALUE := QUANTITY * 1;
        ELSE NULL;
    END CASE;

WHEN 'L' THEN
     CASE UPPER(UNIT2)
         WHEN 'ML' THEN IVALUE := QUANTITY * 1000;
         WHEN 'GAL' THEN IVALUE := QUANTITY * 0.264172052;
         WHEN 'KG' THEN IVALUE := QUANTITY * 0.8;
         WHEN 'L' THEN IVALUE := QUANTITY * 1;
         ELSE NULL;
      END CASE;

WHEN 'ML' THEN
     CASE UPPER(UNIT2)
         WHEN 'L' THEN IVALUE := QUANTITY * 0.001;
         WHEN 'GAL' THEN IVALUE := QUANTITY / 3785.41178;
         WHEN 'ML' THEN IVALUE := QUANTITY * 1;
         ELSE NULL;
      END CASE;

WHEN 'GAL' THEN
     CASE UPPER(UNIT2)
         WHEN 'L' THEN IVALUE := QUANTITY * 3.785411784;
         WHEN 'ML' THEN IVALUE := QUANTITY * 3785.41178;
         WHEN 'KG' THEN IVALUE := QUANTITY * 2.64;
         WHEN 'GAL' THEN IVALUE := QUANTITY * 1;
         ELSE NULL;
      END CASE;

WHEN 'TABL' THEN
             CASE WHEN (COD) = 4 THEN 
  CASE UPPER(UNIT2)
             WHEN 'KG' THEN IVALUE := QUANTITY * 0.0000011;
         WHEN 'TABL' THEN IVALUE := QUANTITY * 1;
     ELSE NULL;
     END CASE;

     CASE UPPER(UNIT2)
         WHEN 'KG' THEN IVALUE := QUANTITY * 0.00025;
         WHEN 'TABL' THEN IVALUE := QUANTITY * 1;
        ELSE NULL;
      END CASE;
ELSE NULL;
END CASE;
OUT_UOM := IVALUE ;
RETURN OUT_UOM;
END;

Спасибо.

Похоже, вам не хватает финального end case.

William Robertson 27.04.2018 18:00
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
1 838
1

Ответы 1

Если вы сделаете отступ в конце раздела, вы увидите, что вам не хватает END CASE;:

WHEN 'TABL' THEN
     CASE WHEN (COD) = 4 THEN 
         CASE UPPER(UNIT2)
             WHEN 'KG' THEN IVALUE := QUANTITY * 0.0000011;
             WHEN 'TABL' THEN IVALUE := QUANTITY * 1;
             ELSE NULL;
         END CASE;
         CASE UPPER(UNIT2)
             WHEN 'KG' THEN IVALUE := QUANTITY * 0.00025;
             WHEN 'TABL' THEN IVALUE := QUANTITY * 1;
             ELSE NULL;
         END CASE;
         ELSE NULL;
     END CASE;

-- shoudld have another END CASE; here

OUT_UOM := IVALUE ;
RETURN OUT_UOM;
END;

Хотя два вложенных случая тоже кажутся неправильными; второй просто перезаписывает значения, установленные первым - возможно, вам также не хватает ELSE между ними:

WHEN 'TABL' THEN
     CASE WHEN (COD) = 4 THEN 
         CASE UPPER(UNIT2)
             WHEN 'KG' THEN IVALUE := QUANTITY * 0.0000011;
             WHEN 'TABL' THEN IVALUE := QUANTITY * 1;
             ELSE NULL;
         END CASE;
     ELSE
         CASE UPPER(UNIT2)
             WHEN 'KG' THEN IVALUE := QUANTITY * 0.00025;
             WHEN 'TABL' THEN IVALUE := QUANTITY * 1;
             ELSE NULL;
         END CASE;
     END CASE;

END CASE;

OUT_UOM := IVALUE ;
RETURN OUT_UOM;
END;

Другие вопросы по теме