SQL, проблема с регистром при сравнении varchars - PullRequest
0 голосов
/ 27 апреля 2018

Сначала мой код

CREATE OR REPLACE FUNCTION exchangeRate(from_in VARCHAR2(5), to_in VARCHAR2(5)) RETURN NUMBER IS 
  exchange_rate NUMBER;
BEGIN
    CASE
        WHEN to = 'USD' THEN 
        CASE
            WHEN from = 'EUR' THEN exchange_rate := 25.49;
            ELSE exchange_rate := 1;
        END CASE;
        ELSE exchange_rate := 1;
    END CASE;
  RETURN exchange_rate;
END;

Это более короткая версия, я удалил дополнительные, когда они идентичны (отличаются только валютой и курсами). Однако я не понимаю причину этого, я бы попросил помочь с пониманием ошибки.

CREATE OR REPLACE FUNCTION exchangeRate(from_in table.currency%TYPE, to_in table.currency%TYPE) RETURN table.price%TYPE IS 
  exchange_rate table.price%TYPE;
BEGIN
    CASE
        WHEN to = 'USD' THEN 
        CASE
            WHEN from = 'EUR' THEN exchange_rate := 25.49;
            ELSE exchange_rate := 1;
        END CASE;
        ELSE exchange_rate := 1;
    END CASE;
  RETURN exchange_rate;
END;

И поскольку я не уверен, что с этим не так, я также хотел бы спросить, могу ли я использовать table.row%TYPE для объявления параметра и возврата типа

Редактировать: я переименовал его только в "from" и "to", прошу прощения за то, что исходный код имел разные имена (которые были слишком случайными)

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

EDIT

Другие ответы уже объяснили, что не так с вашим кодом.

Вот как вы можете упростить ваше заявление CASE.

CREATE OR replace FUNCTION Exchangerate(p_from VARCHAR2, 
                                        p_to   VARCHAR2) 
RETURN NUMBER 
IS 
  exchange_rate NUMBER; 
BEGIN 
    exchange_rate := CASE p_to 
                       WHEN 'USD' THEN CASE p_from 
                                         WHEN 'EUR' THEN 25.49 
                                         ELSE 1 
                                       END 
                       ELSE 1 
                     END; 

    RETURN exchange_rate; 
END; 

Или этот оператор возврата должен быть эквивалентен

RETURN CASE 
           WHEN p_to = 'USD' 
              AND p_from = 'EUR' THEN 25.49 
           ELSE 1 
END; 

и избавьтесь от exchange_rate переменной

0 голосов
/ 27 апреля 2018

Проблема с вашим кодом заключается в том, что вы не можете использовать varchar (размер) в качестве входного параметра, просто используйте тип данных без указания размера.

И ключевое слово from является таким, что вы не можете использовать его в качестве входного параметра.

Ниже код работает нормально, вы можете попробовать.

CREATE OR REPLACE FUNCTION exchangeRate(from_in VARCHAR2, to_in VARCHAR2) RETURN NUMBER IS 
  exchange_rate NUMBER;
BEGIN
    CASE
        WHEN to_in = 'USD' THEN 
        CASE
            WHEN from_in = 'EUR' THEN exchange_rate := 25.49;
            ELSE exchange_rate := 1;
        END CASE;
        ELSE exchange_rate := 1;
    END CASE;
  RETURN exchange_rate;
END;
0 голосов
/ 27 апреля 2018

Вы не можете использовать from в качестве имени параметра, потому что это ключевое слово.

Рекомендуется использовать некоторый префикс при объявлении параметра, поэтому в вашем примере вместо параметров from и to используйте p_from и p_to.

Кроме того, удалите объявление размера varchars в параметрах функции. Ваша процедура будет скомпилирована, если будет выглядеть так:

CREATE OR REPLACE FUNCTION exchangeRate(p_from VARCHAR2, p_to VARCHAR2) RETURN NUMBER IS 
  exchange_rate NUMBER;
BEGIN
    CASE
        WHEN p_to = 'USD' THEN 
        CASE
            WHEN p_from = 'EUR' THEN exchange_rate := 25.49;
            ELSE exchange_rate := 1;
        END CASE;
        ELSE exchange_rate := 1;
    END CASE;
  RETURN exchange_rate;
END;

Согласно вашему второму вопросу: Да, вы можете использовать типы таблиц как для параметров, так и для типов возвращаемых данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...