Как создать процедуру, которая вставляет записи из одной таблицы в другую, а также проверяет достоверность? PL / SQL - PullRequest
1 голос
/ 23 октября 2019

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

create or replace procedure enroll_student2(p_stu_ID number,p_class_id number)
as
declare
    stu_standing number;
    course_standing number;
begin
    if stu_standing >= course_standing THEN
        insert into enroll (stu_ID,class_id)
        select stu_id,class_id
        from student,class_sched
        where stu_id=p_stu_ID and class_id=p_class_id;
    else
        DBMS_OUTPUT.PUT_LINE('Requirement not met');
    end if;
END;
/

Я пытаюсь записать студента на курс, одновременно проверяяесли их успеваемость равна или выше, чем у курса. Ссылка на данные

Ответы [ 2 ]

2 голосов
/ 23 октября 2019

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

Примерно так:

create or replace procedure enroll_student2
  (p_stu_ID number,p_class_id number)
as

    l_stu_standing number;
    l_course_standing number;

begin

    select s.stu_standing
    into l_stu_standing
    from student s
    where s.stu_id = p_stu_id;


    select c.course_standing
    into l_course_standing
    from class_sched cs
         inner join course c on c.course_id = cs.course_id
    where c.class_id = p_class_id;

    if l_stu_standing >= l_course_standing then
        insert into enroll (stu_ID, class_id)
        values (p_stu_id, p_class_id); 
    else
        dbms_output.put_line('Requirement not met');
    end if;

end;
/

Примечание: вы не опубликовали свою модель данных, поэтому я взялнекоторые предположения: следовательно, вам может понадобиться исправить ошибки компиляции. Также я не включил обработку ошибок для очевидных потенциальных исключений (NO_DATA_FOUND, TOO_MANY_ROWS и т. Д.), Которые вы, вероятно, должны включить.

Вам не нужно DECLARE, фактически вы получите ошибку компиляции. Это требуется для анонимных блоков, но для именованных процедур и функций ключевое слово AS (или IS) обозначает начало раздела объявления. (Это распространенная ошибка для людей, начинающих с PL / SQL, и, честно говоря, это кажется несовместимым с объявлением триггеров.)

Наконец, помните, что использование DBMS_OUTPUT для сообщения о сбое программы не является надежной тактикой,Бесполезно, если пользователь работает с отключенным SERVEROUTPUT или когда другая программа вызывает эту.

0 голосов
/ 26 октября 2019

Пожалуйста, просмотрите раздел Ask в справке. После этого в качестве шаблона для вашего вопроса резко увеличивается ваш шанс получить удовлетворительный ответ. Не забудьте включить DDL для всех соответствующих таблиц и образцов данных в виде текста (не изображения) и ожидаемых результатов этих данных. Но из упомянутого ERD должно работать следующее. Однако я не проверял это.

create or replace procedure enroll_student2(p_stu_id number,p_class_id number)
as
begin
    insert into enroll (s.stu_id,cs.class_id)
          select s.stu_id,cs.class_id
            from student      s 
               , class_sched  cs
           where s.stu_id = p_stu_id 
             and cs.class_id = p_class_id
             and s.stu_standing >= cs.course_standing;

    if sql%rowcount = 0 
    then 
        dbms_output.put_line('Requirement not met');
    end if;
end enroll_student2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...