Отладка PL / SQL Процедура для отчета службы бронирования - PullRequest
0 голосов
/ 10 ноября 2019

Для школьного проекта, неспособного выяснить, как отлаживать код, мне удалось выяснить, что проблема в этой строке кода: Reservation_id:=: reservation_ID;, но я не уверен, как ее исправить

Set serveroutput ON;
Create or replace procedure Reservation_Services_Report (reservation_ID IN number)
As
Service_number reservation.service_type_id%type;
People_attending reservation.numb_people_attend%type;
Begin
Reservation_id:=: reservation_ID; 
Select s.service_name, s.service_type, s.service_type_food, s.service_type_entertainment, r.numb_people_attend from services s, reservation r 
where services.service_type_id = reservation.service_type_id;
Exception 
When no_data_found then 
dbm_output.put_line(‘No services for this reservation’);
End;

1 Ответ

0 голосов
/ 10 ноября 2019

О, это только ваша единственная проблема!

  • , так как вы объявили параметр IN, почему бы вам не использовать его? Он здесь для того, чтобы передать процедуре, а не принимать ее во время выполнения (что вы и планировали сделать, поставив перед ее именем двоеточие).
    • кроме того, это хорошая идея, чтобы отличить имя параметра от имени столбца, в противном случае у вас возникнут проблемы, поскольку Oracle не будет знать, что есть что. Вот почему я переименовал его в par_reservation_id
  • select в PL / SQL требует условие into. В вашем случае вам нужно объявить все те переменные, которые соответствуют select списку столбцов. Я назвал их всех с префиксом l_ (как переменная l_ ocal);некоторые люди используют v_;выберите то, что вы хотите, просто попробуйте придерживаться некоторых стандартов - это облегчит чтение, отладку и поддержку вашего кода
  • select, который вы написали, вероятно, вернет too_many_rows ошибка, поскольку количество строк не ограничено;Я предполагаю, что вы «забыли» включить предложение where, поэтому я поместил его туда;Я не знаю, правильно это или нет, потому что у меня нет твоих столов. Исправьте это, если необходимо
  • при объединении таблиц, попробуйте переключиться на современный синтаксис ANSI и отделить объединений от (where) условий , как я пытался
  • , если вы не запускаете этот код в инструменте, который поддерживает dbms_output для отображения на экране, вы ничего не увидите. Исключение составляет , обработано (вроде), но никто не узнает, что произошлоПопробуйте вместо этого поднять ошибку, например, raise_application_error(-20000, 'No services for this reservation')

Вот как может выглядеть процедура;надеюсь, это несколько лучше, чем оригинальная версия. Посмотрите, поможет ли это.

Create or replace procedure 
  Reservation_Services_Report (par_reservation_ID IN number)
As
  l_service_name               services.service_name%type;
  l_service_type               services.service_type%type;
  l_service_type_Food          services.service_type_Food%type;
  l_service_type_entertainment services.service_type_entertainment%type;
  l_numb_people_attend         reservation.numb_people_attend%type;
Begin
  Select s.service_name, 
         s.service_type, 
         s.service_type_food, 
         s.service_type_entertainment, 
         r.numb_people_attend 
  into l_service_name,
       l_service_type,
       l_service_type_food,
       l_service_type_entertainment,
       l_numb_people_attend
  from services s join reservation r  on s.service_type_id = r.service_type_id
  where r.reservation_id = par_reservation_id;

Exception 
  When no_data_found then 
    dbms_output.put_line(‘No services for this reservation’);
End;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...