2016-05-16 1 views
-3

enter image description here Я новичок в pl/sql. У меня есть Ошибка в строке 5: PL/SQL: SQL заявление игнорировалиPL/SQL функция

CREATE OR REPLACE FUNCTION calculeaza_total_incasari RETURN NUMBER IS 
     incasari NUMBER; 
     BEGIN 
     nrutilizatori:=calculeaza_total_utilizatori; 
     SELECT sum (p.pret) into incasari from rezervare r,planificare p , film f where f.idfilm=p.idfilm and r.idplanificare=p.idplanificare 
     RETURN incasari/nrutilizatori; 
    EXCEPTION 
     WHEN NO_DATA_FOUND THEN 
      dbms_output.put_line('Nu sunt incasari'); 
    END; 

Как я могу заменить эту строку? Спасибо заранее.

+0

просьба представить схему для 'rezervare,' 'planificare и' film' – piyushj

+0

Вы не объявили переменные '' nrutilizatori' и calculeaza_total_utilizatori' – Noel

ответ

4

Сначала вам нужно объявить параметр nrutilizatori и инициализировать его следующим образом: nrutilizatori := calculeaza_total_utilizatori();.

Не забудьте поместить все точки с запятой ; после выбора оператора.

Попробуйте следующий код:

CREATE OR REPLACE FUNCTION calculeaza_total_incasari RETURN NUMBER IS 
     incasari NUMBER; 
     nrutilizatori number; 
    BEGIN 
     nrutilizatori := calculeaza_total_utilizatori(); 
    SELECT sum (p.pret) into incasari from rezervare r,planificare p , film f where f.idfilm=p.idfilm and r.idplanificare=p.idplanificare; 
    RETURN incasari/nrutilizatori; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     dbms_output.put_line('Nu sunt incasari'); 
END; 
/
0
CREATE OR REPLACE FUNCTION calculeaza_total_incasari RETURN NUMBER IS 
    incasari NUMBER; 
nrutilizatori NUMBER; 
    BEGIN 

    nrutilizatori:=calculeaza_total_utilizatori(); 
    SELECT sum (p.pret) into incasari from rezervare r,planificare p , film f where f.idfilm=p.idfilm and r.idplanificare=p.idplanificare; 
    RETURN incasari; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     dbms_output.put_line('Nu sunt incasari'); 
END; 
0

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

Поскольку вы используете агрегированную функцию SUM, вам не нужен обработчик исключений - no_data_found никогда не будет поднят. Если вы не хотите, чтобы строки не возвращались, завершите SUM с помощью NVL, иначе вы получите значение NULL, и в этом случае результат возврата также будет NULL.

Кроме того, вы не объявляли переменную nrutilizatori, имели синтаксическую ошибку (вы не писали ';' после оператора select) и возможную логическую/числовую ошибку - если возможно, чтобы функция calculeaza_total_utilizatori возвращала 0, вы получит деление на нулевую ошибку, и если он сможет вернуть NULL, ваш конечный результат также будет NULL.

Еще один дополнительный комментарий - функции должны возвращать значение во всех случаях, включая блоки обработчиков исключений, иначе вы получите ошибку ORA-06503 «Функция возвращается без значения». Это не произойдет в вашем случае, потому что no_data_found не будет поднят, но вы должны помнить об этом для будущего развития.

Полная функция следующая (без проверки функции calculeaza_total_utilizatori), хотя я не понимаю эту функцию/запрос (или calculeaza_total_utilizatori) - почему нет входных переменных? Похоже, вы могли бы просто суммировать все из таблицы planificare, не присоединяясь к другим таблицам. Не уверен, что если это действительно требование ...

CREATE OR REPLACE FUNCTION calculeaza_total_incasari RETURN NUMBER IS 
    incasari NUMBER; 
    nrutilizatori NUMBER; 
BEGIN 
    nrutilizatori := calculeaza_total_utilizatori; 

    SELECT NVL(SUM(p.pret), 0) 
    INTO incasari 
    FROM rezervare r, planificare p, film f 
    WHERE f.idfilm = p.idfilm 
    AND r.idplanificare = p.idplanificare; 

    RETURN incasari/nrutilizatori; 
END; 
Смежные вопросы