2013-11-17 6 views
0

Я беру класс о базах данных. Я очень новичок в этом, поэтому извините меня, если это очевидная ошибка, но я много часов работал над этой проблемой и не уверен, что еще делать.SQL-функция и анонимный блок

код предполагают, чтобы создать функцию для того
А.) Выдает среднее NetWin за год, заданной параметром (задается формулой (SeasonW-Seasonl) + (PlayoffW - PlayoffL)
B .) Вывод всех тренеров, имеющих сеть в среднем
C.) Возвращает количество тренеров, которые соответствуют этим критериям.
D.) Имейте анонимный блок, который вызывает эту функцию, и выводит два разных сообщения в зависимости от возврата функции.

Теперь я успешно сделал часть A, C и D. Но по какой-то причине моей функция не будет создана, когда я ввожу часть B.

create or replace function GOOD_COACHES(season IN INT) 
return INT 
IS 
netwin INT; 
CNT INT; 
BEGIN 
     --Calculated netwin 
     select AVG((SEASON_WIN-SEASON_LOSS) + (PLAYOFF_WIN-PLAYOFF_LOSS)) into netwin from COACHESSEASON where YEAR = season; 

     --Prints out A 
     dbms_output.put_line('Average Netwin is: ' || netwin); 

     --This Line messes up the function, I don't know why 
     select T.FIRSTNAME, T.LASTNAME from COACHESSEASON T where ((T.SEASON_WIN-T.SEASON_LOSS) + (T.PLAYOFF_WIN-T.PLAYOFF_LOSS))>netwin and YEAR = season; 

     --Calculates the number of teams that satisfy average 
     select count(T.FIRSTNAME) into CNT from COACHESSEASON T where ((T.SEASON_WIN-T.SEASON_LOSS) + (T.PLAYOFF_WIN-T.PLAYOFF_LOSS))>netwin and YEAR = season; 

return CNT; 
END; 
--End of the Function 
--Start of the Anonymous Block 
DECLARE 
     x int := GOOD_COACHES(1998); 
BEGIN 
     if x = 0 then dbms_output.put_line('We didn''t find any good_coaches!'); 
     else dbms_output.put_line('The No. of good coaches is ' || x); 
     end if; 
END; 
/

Это третья строка в функции столовых его и Безразлично 'Позвольте, чтобы это было вызвано. Если я прокомментирую это, он работает правильно. Когда я выхожу из функции и превращаю ее в обычный SQL-оператор, он работает.

select T.FIRSTNAME, T.LASTNAME from COACHESSEASON T where ((T.SEASON_WIN-T.SEASON_LOSS) + (T.PLAYOFF_WIN-T.PLAYOFF_LOSS))>0 and YEAR = /*RandYear*/; 

Если кто-то понимает, почему функция не может быть создана с этой строкой, я буду признателен за совет. Я также не знаю, как распечатать результаты выбранной строки в функции.

+0

функции не являются частью SQL сам по себе, а что-нибудь g, которые приносит конкретная система управления базами данных (СУБД), и различные системы имеют тенденцию делать это по-разному, поэтому вам нужно рассказать нам, какую СУБД вы используете. – jpw

+0

sqlplus Я верю. – user3002669

+0

sqlplus - это не СУБД, а программа Oracle. Согласно синтаксису это Oracle. Если вы хотите, чтобы функция печатала что-то, вам нужно использовать dbms_output. Когда вы выбираете FIRSTNAME и LASTNAME, выберите их для переменных и put_line, аналогичную строке netwin – cha

ответ

0

Вы не выбираете T.FIRSTNAME и T.LASTNAME s во что-либо, поэтому утверждение недействительно для включения в блок PL/SQL.

Вероятно, существует несколько «хороших тренеров», поэтому вы не можете поместить значения в одну переменную и использовать курсор или коллекцию.

Использование коллекций, при создании типа таблицы для сбора и фамилии в:

CREATE TYPE VARCHAR2s_Table AS TABLE OF VARCHAR2(30); 
/

Затем вы можете использовать это, чтобы собрать и фамилии (и в качестве бонуса размер сбора будет рассказать вам, как много хороших тренеров есть, и вы можете пропустить последний запрос):

create or replace function GOOD_COACHES(season IN INT) 
return INT 
IS 
netwin INT; 
CNT INT; 
firstnames VARCHAR2s_Table; 
lastnames VARCHAR2s_Table; 
BEGIN 
    --Calculated netwin 
    select AVG((SEASON_WIN-SEASON_LOSS) + (PLAYOFF_WIN-PLAYOFF_LOSS)) 
    into netwin 
    from COACHESSEASON 
    where YEAR = season; 

    --Prints out A 
    dbms_output.put_line('Average Netwin is: ' || netwin); 

    --This Line messes up the function, I don't know why 
    select T.FIRSTNAME, T.LASTNAME 
    BULK COLLECT INTO firstnames, lastnames 
    from COACHESSEASON T 
    where ((T.SEASON_WIN-T.SEASON_LOSS) + (T.PLAYOFF_WIN-T.PLAYOFF_LOSS))>netwin 
    and YEAR = season; 

    FOR i IN 1 .. firstnames.COUNT LOOP 
    DBMS_OUTPUT.put_line(firstnames(i) || ' ' || lastnames(i)); 
    END LOOP; 

    return firstnames.COUNT; 
END; 
/

SQLFIDDLE

Смежные вопросы