Функция возвращает максимум всей таблицы, а не какую-то конкретную - PLSQL - PullRequest
0 голосов
/ 15 января 2020

У меня вопрос PL SQL, связанный с моим выводом. Предположим, у меня есть такая таблица:

Rates:
Company  | Country  | Level
AA       | US       |   5
BB       | UK       |   4
CC       | FRANCE   |   2
DD       | FRANCE   |   3
EE       | US       |   4
FF       | UK       |   5

Мне нужно создать ФУНКЦИЮ, которая получает в качестве параметра страну и предоставляет мне ее максимальный уровень.

это то, что я написал:

CREATE OR REPLACE
FUNCTION getMaxLevel(Country VARCHAR2)
RETURN NUMBER
IS
MaxLevel NUMBER;
BEGIN
        SELECT max(R.Level) INTO MaxLevel 
        FROM Rates R
        WHERE R.country=Country;
        RETURN MaxLevel;
END getMaxLevel;
/
/*CALL TO CHECK*/
DECLARE
X NUMBER;
BEGIN
        X:=getMaxLevel('FRANCE');
        dbms_output.put_line(X);
END;

и мой вывод - максимальная ставка всей таблицы Rates, которая здесь, например, равна 6, но мне нужно было получить 3.

Буду благодарен за обнаружение моей ошибки :) Спасибо!

Ответы [ 2 ]

2 голосов
/ 15 января 2020

У вас проблема с именем параметра. Я бы рекомендовал поставить перед ним префикс, например, in:

CREATE OR REPLACE
FUNCTION getMaxLevel(
    in_Country VARCHAR2
    )
RETURN NUMBER IS
MaxLevel NUMBER;
BEGIN
    SELECT max(R.Level) INTO MaxDegree
    FROM Rates R
    WHERE R.country = in_Country;

    RETURN MaxLevel;
END getMaxLevel;
/

Вы думаете , что Country в вашем выражении:

R.country = Country

относится к параметр. Но это не то, как работают SQL правила определения объема. Это относится к R.country - отсюда и бессмысленный результат.

1 голос
/ 15 января 2020

Вы должны дать своему параметру другое имя, чем имя столбца в таблице, в противном случае условие в предложении WHERE является неоднозначным.

В условии R.country = Country база данных считает, что второе Country относится к (неквалифицированному) имени столбца, а не к параметру. Это условие всегда выполняется (если Country не равно null), и запрос в итоге возвращает максимальный уровень из всей таблицы.

CREATE OR REPLACE
FUNCTION getMaxLevel(pCountry VARCHAR2)
RETURN NUMBER
IS
MaxLevel NUMBER;
BEGIN
        SELECT max(R.Level) INTO MaxLevel 
        FROM Rates R
        WHERE R.country = pCountry;
        RETURN MaxLevel;
END getMaxLevel;
/
/*CALL TO CHECK*/
DECLARE
X NUMBER;
BEGIN
        X:=getMaxLevel('FRANCE');
        dbms_output.put_line(X);
END;

Примечание: в запросе есть опечатка, Вы имели в виду SELECT .. INT0 MaxLevel вместо SELECT .. INT0 MaxDegree.

...