Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Базы данных] Переселение студентов 
:(
    Опции темы
Golovastik
Дата 20.11.2009, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: нет
Всего: 0



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

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


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

Код

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


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

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  TABLE.doc 186,00 Kb
PM MAIL   Вверх
DimW
Дата 23.11.2009, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: нет
Всего: 44



что конкретно не понятно? как сделать update даты выселения и insert новой записи?

Код

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


это что касается изменения даты выселения. 
а в какую комнату заселять вообще не понятно из задания т.к. в приведенных вами таблицах есть ее и связь с общежитием - по этому № комнаты в качестве параметра в процедуре будет не достаточно.
PM MAIL ICQ   Вверх
Golovastik
Дата 23.11.2009, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: нет
Всего: 0



Вот я попробовал где-то так, но мне кажется что это наверно не верно. Помогите исправить, чтоб соответствовало условию.
Это первый из 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;


Это сообщение отредактировал(а) Golovastik - 23.11.2009, 20:17
PM MAIL   Вверх
DimW
Дата 24.11.2009, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: нет
Всего: 44



что то мне подсказывает что либо ты привел не полное задание лабы либо ты конкретно тупишь.

Цитата(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.

жду пояснений.
PM MAIL ICQ   Вверх
Golovastik
Дата 24.11.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: нет
Всего: 0



Скорее всего я туплю, но не знаю как выйти из этого тупика, собрать всё правильно.  Когда мы были на начитке, он сазал следовать строго по условию задания. телефон не дал, на письма не отвечает по эл. почте, через 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
Отредактировал форматирование



Это сообщение отредактировал(а) Zloxa - 24.11.2009, 17:06
PM MAIL   Вверх
DimW
Дата 24.11.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: нет
Всего: 44



Цитата(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 - № общежития
в функцию завернешь сам.


PM MAIL ICQ   Вверх
Golovastik
Дата 26.11.2009, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: нет
Всего: 0



Вот 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 -- бежим в цикле по запросу и формаруем строку со студентами через запятую


Это сообщение отредактировал(а) Golovastik - 26.11.2009, 15:38
PM MAIL   Вверх
Zloxa
Дата 26.11.2009, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: нет
Всего: 161



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

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


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DimW
Дата 26.11.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: нет
Всего: 44



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

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

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

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

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


Это сообщение отредактировал(а) DimW - 26.11.2009, 16:41
PM MAIL ICQ   Вверх
Golovastik
Дата 30.11.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: нет
Всего: 0



Особенность задания я не могу уточнить так ,как до препода нельзя дозвонится и он не отвечает на емаил. Он сказал нам заочникам, как написанно  в условии, так и делать.
По поводу задания №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;

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

Это сообщение отредактировал(а) Golovastik - 30.11.2009, 21:27
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.