Добавление описаний для кодов статуса заказа - PullRequest
2 голосов
/ 12 марта 2019

Код:

CREATE OR REPLACE FUNCTION STATUS_DESC_SF 
(
  P_STATUS_ID IN bb_basketstatus.IDSTAGE%type 
)
RETURN VARCHAR2 AS 
    lv_idstage bb_basketstatus.IDSTAGE%type;

BEGIN
    select (CASE
            WHEN IDSTAGE = 1 THEN
                'Order submitted'
            WHEN IDSTAGE = 2 THEN
                'Accepted, sent to shipping'
            WHEN IDSTAGE = 3 THEN
                'Back-ordered'
            WHEN IDSTAGE = 4 THEN
                'Cancelled'
            ELSE
                'Shipped'
            END) STAGE_ID
        INTO lv_idstage
    from bb_basketstatus
    where idbasket = P_STATUS_ID;
  RETURN lv_idstage;
END STATUS_DESC_SF;

select idstage, status_desc_sf(idstage) status_desc
from bb_basketstatus
where idbasket = 4;

Вопрос:

Когда покупатель возвращается на веб-сайт, чтобы проверить состояние заказа, отображается информация из таблицы BB_BASKETSTATUS.Однако в таблице BB_BASKETSTATUS доступен только код состояния, но не описание статуса.Создайте функцию с именем STATUS_DESC_SF, которая принимает идентификатор этапа и возвращает описание статуса.Описание идентификаторов этапов приведено в таблице 6-3.Протестируйте функцию в операторе SELECT, который извлекает все строки в таблице BB_BASKETSTATUS для корзины 4 и отображает идентификатор этапа и его описание.

Story:

Я знаю, что написал сохраненную функциюправильно, потому что, когда он разорван и имеет оператор выбора сам по себе, он работает.Когда я добавляю его в функцию, он не работает.Я попытался переключить параметр и локальную переменную lv_idstage, это ничего не делает.Я получаю что-то обратно из кода SQL, но описание статуса 1 | (null) для idstage и status_desc.Если вы уже поняли это, не могли бы вы объяснить, как это получает «(ноль)» для меня?Я не уверен, как он это делает.

Спасибо за помощь !!

1 Ответ

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

Кажется, вам не нужен запрос внутри вашей функции, только оператор CASE:

CREATE OR REPLACE FUNCTION STATUS_DESC_SF (
    P_STATUS_ID IN bb_basketstatus.IDSTAGE%type)
    RETURN VARCHAR2 AS 
  lv_status_desc varchar2(100);

BEGIN
  lv_status_desc :=  
       CASE WHEN P_STATUS_ID = 1 THEN 'Order submitted'
            WHEN P_STATUS_ID = 2 THEN 'Accepted, sent to shipping'
            WHEN P_STATUS_ID = 3 THEN 'Back-ordered'
            WHEN P_STATUS_ID = 4 THEN 'Cancelled'
            ELSE 'Shipped' END;

  return lv_status_desc;
end;
...