Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Базы данных] Переселение студентов


Автор: Golovastik 20.11.2009, 19:09
Ребята, скажите, как процедуркой можно реализовать переселение студентов. Что-то не приходит на голову. Вот такое условие.
Код

1.    Процедуру, которая по номеру студента и комнаты переселяет его в новую комнату.
 При этом если имелась запись о его проживании в другой комнате с незаполненной датой
 выселение, то в это поле заносится текущая дата;


Представляю это где то так, в общем виде.

Код

CREATE PROCEDURE LAB4(N_STUD VARCHAR2(10), N_KOMN VARCHAR2(10)) AS
 
BEGIN
 
END;


На голову не приходит, как можно реализовать.
Вот какие таблицы есть в данный момент.
Фото таблиц вложенно.

Автор: DimW 23.11.2009, 09:01
что конкретно не понятно? как сделать update даты выселения и insert новой записи?

Код

begin
update STUD_ADR
   set data_vyselenia = sysdate
 where n_zachotki = N_STUD
   and data_vyselenia is null;
end;


это что касается изменения даты выселения. 
а в какую комнату заселять вообще не понятно из задания т.к. в приведенных вами таблицах есть ее и связь с общежитием - по этому № комнаты в качестве параметра в процедуре будет не достаточно.

Автор: Golovastik 23.11.2009, 20:16
Вот я попробовал где-то так, но мне кажется что это наверно не верно. Помогите исправить, чтоб соответствовало условию.
Это первый из 5 пунктов лабы, и уже неделю парюсь.  Тут по идее должен идти 1 инсерт и 1 юпдейт.


Вот как примерно сделал.

Код

CREATE PROCEDURE LAB4(N_STUD VARCHAR2(10), N_KOMN VARCHAR2(10)) AS
 
BEGIN
insert STUD_ADR(N_ZACHIOTKI, N_ROOMS,DATA_VYSELENIA) values(N_STUD,N_KOMN,'06.05.07');
update STUD_ADR set DATA_VYSELENIA=sysdate where N_ROOMS!=N_ROOMS and 
DATA_VSELENIA = '06.05.07' and DATA_VYSELENIA is null;

END;

Автор: DimW 24.11.2009, 09:05
что то мне подсказывает что либо ты привел не полное задание лабы либо ты конкретно тупишь.

Цитата(Golovastik @  23.11.2009,  20:16 Найти цитируемый пост)
insert STUD_ADR(N_ZACHIOTKI, N_ROOMS,DATA_VYSELENIA) values(N_STUD,N_KOMN,'06.05.07');

откуда ты вообще взял значение  '06.05.07' в задании о нем ничего не сказано, к таму же это даже не является датой.
еще раз спрашиваю - как можно переселить студента в комнату не указав при этом общежитие? спросите об этом у препода.

Цитата(Golovastik @  23.11.2009,  20:16 Найти цитируемый пост)
update STUD_ADR set DATA_VYSELENIA=sysdate where N_ROOMS!=N_ROOMS and 
DATA_VSELENIA = '06.05.07' and DATA_VYSELENIA is null;

откуда опять взялась '06.05.07'? 
этим "N_ROOMS!=N_ROOMS" что хотел сказать? что комната в которую вселяют не может быть комнатой из которой выселяют, но тогда так - N_ROOMS!=N_KOMN.

жду пояснений.

Автор: Golovastik 24.11.2009, 15:52
Скорее всего я туплю, но не знаю как выйти из этого тупика, собрать всё правильно.  Когда мы были на начитке, он сазал следовать строго по условию задания. телефон не дал, на письма не отвечает по эл. почте, через 10 дней сессия, а 4 лаба не сделана. Вот задание моей лабы, которые необходимо сделать.

Вот условие  лабы №4
Цитата

Тема: Создание сохраненных процедур и функций, работа с курсорами.
План проведения работы
1.    Создать процедуры и функции, указанные в варианте;
2.    Определить курсоры с параметрами, построенных по любым 2 операторам Select из предыдущей работы;
3.    Для каждой таблицы, имеющей первичный ключ, генерируемый последовательностью, создать функцию, которая в качестве параметров принимает значения полей записи, кроме первичного ключа. Эта функция должна получать из последовательности новый первичный ключ и вставить новую запись с этим ключом и с указанными в виде параметров значениями полей. В результате функция должна возвращать первичный ключ вставленной записи или null, если запись не была вставлена.
4.    Отладить процедуры и функции (все подпрограммы должны предусматривать обработку аномальных ситуаций);
5.    Проверить корректность курсоров;
6.    Оформить отчет.
Содержание отчета
1.    Краткие теоретические сведения;
2.    Список аномалий для каждой подпрограммы;
3.    Распечатка содержимого таблиц после заполнения их информацией;
4.    Листинг создания процедур, функций и курсоров;
5.    Примеры, демонстрирующие их работу;
6.    Выводы по работе;

[/code]



[code=sql]
Вариант №8
Пакет должен включать:
1.    Процедуру, которая по номеру студента и комнаты переселяет его в новую комнату. При этом если имелась запись о его проживании в другой комнате с незаполненной датой выселение, то в это поле заносится текущая дата;
2.    Функцию по №комнаты, возвращающую строку, в которой через запятую перечислены фамилии проживающих там студентов (функция должна быть доступна для использования в SQL операторах);
3.    Процедура, которая удаляет все записи о переселениях студента за прошлый год.





Вот, я начал делать 1 -ое задание из этих 3-ёх. Да, номер общежития указать нужно, я так понял из таблиц брать нужно из тех 3-ёх, которые выше по условию.
2 -ую и 3-ую ещё не начинал, так как первую толком не сделал.
Вот ещё так попробовал 1-ую сделать, но там нужно ещё общежитие я так понял, не знаю как исправить.
Код

CREATE OR REPLACE PROCEDURE laba4 
(n_stud IN stud_adr.N_ZACHIOTKI%TYPE, n_komn IN stud_adr.N_ROOMS%TYPE)
AS
BEGIN
UPDATE stud_adr
SET data_vyselenia = SYSDATE
WHERE N_ZACHIOTKI = n_stud AND data_vyselenia IS NULL;
insert into stud_adr(N_ZACHIOTKI, n_rooms, data_vselenia)
values (n_stud, n_komn, sysdate); 
END;
/


Пробую вызывать так:
Код

begin
system.LABa('111-05', '225','XAI-7');
end;


Выдаёт, что номер общежития ещё нужно, вот запутался с этим.
Если знаете , подскажите как исправить, уже надоело парится.
Короче, как правильно сделать первое. По 2-ому и 3-му, подскажите пожалуйста тоже как примерно хоть реализовывать.

M
Zloxa
Отредактировал форматирование


Автор: DimW 24.11.2009, 17:09
Цитата(Golovastik @  24.11.2009,  15:52 Найти цитируемый пост)
Выдаёт, что номер общежития ещё нужно, вот запутался с этим.

тебе следует изменить условие задания(только преподу не забудь обьяснить почему ты это сделал), а именно добавить в качестве параметра в процедуру laba4 еще и № общежития и использовать его в insert. и первое задание можно закрывать.

по 3, тоже не совсем понятно на какую дату ориентироваться при вычислении прошлого года, на дату вселения или выселени, покажу примерный вариан, а там сам подгонишь когда определишься с датами:
Код

delete from stud_adr
where data_vselenia between trunc(trunc(sysdate, 'year')-1, 'year') /*начало прошлого года*/ and trunc(sysdate, 'year')-1  /*конецпрошлого года*/

здесь ориентируемся на дату вселения.

по 2, опять таки невозможно это сделать только по номеру комнаты, в функцию необходимо передовать еще и № общежития.
примерно так:
Код

declare
  result varchar2(2000);
begin
  for i in (select s.last_name, a.first_name, a.patronymic 
              from STUD_ADR a
                  ,STUDENTS s
              where a.n_rooms = p_n_rooms
                and a.n_obscheshitia = p_n_obscheshitia
                and s.n_zachotki = a.n_zachotki)
  loop -- бежим в цикле по запросу и формаруем строку со студентами через запятую
    result := result ||','|| i.last_name ||' '|| i.first_name ||' '|| i.patronymic;
  end loop;                
end;


где p_n_rooms - № комнаты, p_n_obscheshitia - № общежития
в функцию завернешь сам.


Автор: Golovastik 26.11.2009, 15:30
Вот 1 задание сделал так,наконец-то сработало.
Код

CREATE OR REPLACE PROCEDURE LABA4
(n_stud IN stud_adr.N_ZACHIOTKI%TYPE, n_komn IN stud_adr.N_ROOMS%TYPE,
n_obs IN stud_adr.N_OBSCHESHITIA%TYPE)
AS
BEGIN
UPDATE stud_adr
SET data_vyselenia = SYSDATE
WHERE N_ZACHIOTKI = n_stud AND data_vyselenia IS NULL;
insert into stud_adr(N_ZACHIOTKI, n_rooms, data_vselenia,N_OBSCHESHITIA )
values (n_stud, n_komn, sysdate, n_obs); 
END;
/


По поводу задания №2, чего-то не выходит, 
как здесь правильно объявить функцию, пробую выполнять запрос, вставляю ваш код, чего-то не идёт.
Выдаёт такую ошибку:
Код

ORA-06550: line 8, column 40:
PL/SQL: ORA-00904: "P_N_OBSCHESHITIA": invalid identifier
ORA-06550: line 4, column 12:
PL/SQL: SQL Statement ignored
ORA-06550: line 11, column 30:
PLS-00364: loop index variable 'I' use is invalid
ORA-06550: line 11, column 5:
PL/SQL: Statement ignored6.                   ,STUDENTS s
7.               where a.n_rooms = p_n_rooms
8.                 and a.n_obscheshitia = p_n_obscheshitia

9.                 and s.n_zachiotki = a.n_zachiotki)
10.   loop -- бежим в цикле по запросу и формаруем строку со студентами через запятую

Автор: Zloxa 26.11.2009, 15:50
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: DimW 26.11.2009, 16:40
Цитата(Golovastik @  26.11.2009,  15:30 Найти цитируемый пост)
Выдаёт такую ошибку:

p_n_obscheshitia и p_n_rooms это параметры функции котрую ты должен был реализовать самостоятельно на основе моего примера.

Цитата(Golovastik @  26.11.2009,  15:30 Найти цитируемый пост)
как здесь правильно объявить функцию

а как ты ее пытался объявить?

я примеры приводил не для того что бы ты их тупо переписывал, а для того что бы понимал о чем нужно почитать. 
к тому же в них 80% решения уже сделано, достаточно просто было включить мозги.
ты не удосужился ответить ни на один мною заданный вопрос, в которых я просил уточнить особенность задания, за сим удаляюсь, в роли попугая выступать не хочу.

Автор: Golovastik 30.11.2009, 17:39
Особенность задания я не могу уточнить так ,как до препода нельзя дозвонится и он не отвечает на емаил. Он сказал нам заочникам, как написанно  в условии, так и делать.
По поводу задания №2

Попробовал написать так:
Код


CREATE OR REPLACE FUNCTION LAB-4(p_n_obscheshitia in stud_adr.n_obscheshitia%TYPE,  p_n_rooms in room.n_rooms%TYPE )
return varchar2
declare
  result varchar2(2000);
begin
  for i in (select s.last_name, a.first_name, a.patronymic 
              from STUD_ADR a
                  ,STUDENTS s
              where a.n_rooms = p_n_rooms
                and a.n_obscheshitia = p_n_obscheshitia
                and s.n_zachiotki = a.n_zachiotki)
  loop -- бежим в цикле по запросу и формаруем строку со студентами через запятую
    result := result ||','|| i.last_name ||' '|| i.first_name ||' '|| i.patronymic;
  end loop;                
end;


А потом вызвать вот так:
Код

begin
system.LAB-4('XAI-7',404);
end;


Выдаёт ошибки:
Код

ORA-06550: line 2, column 11:
PLS-00103: Encountered the symbol "-" when expecting one of the following:

   := . ( @ % ;1. begin
2. system.LAB-4('XAI-7',404);

3. end;


Может так надо, но это вариант тоже не срабатывает:
Код

CREATE OR REPLACE FUNCTION L4(p_n_obscheshitia in stud_adr.n_obscheshitia%TYPE,  p_n_rooms in room.n_rooms%TYPE )
return varchar2
  result varchar2(2000)  is

begin
  for i in (select s.last_name, a.first_name, a.patronymic 
              from STUD_ADR a
                  ,STUDENTS s
              where a.n_rooms = p_n_rooms
                and a.n_obscheshitia = p_n_obscheshitia
                and s.n_zachiotki = a.n_zachiotki)
  loop -- бежим в цикле по запросу и формаруем строку со студентами через запятую
    result := result ||','|| i.last_name ||' '|| i.first_name ||' '|| i.patronymic;
  end loop;  
RETURN(result);          
end;

Подскажите пожалуйста, что не так в этом коде, может не так что-то делаю. Заранее благодарю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)