Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / хранимая процедура / 18 сообщений из 18, страница 1 из 1
20.08.2017, 14:25
    #39508019
Nadzeya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хранимая процедура
Всем привет. Есть 2 таблицы - дороги и мосты.

create table road
(idroad number NOT NULL CONSTRAINT road_p PRIMARY KEY,
road_name varchar2(250) NOT NULL,
road_beg_km number(8,3),
road_end_km number(8,3),
cortime date)

create table bridge
(idbridge number NOT NULL CONSTRAINT bridge_p PRIMARY KEY,
bridge_name varchar2(250) not null,
idroad number constraint bridge_r$rd references road(idroad) on delete cascade,
road_km number(8,3),
length_of_bridge (5,2),
cortime date)

Нужно написать процедуру добавления мостов на дорогах длиной более 10 километров, у которых отсутствуют мосты:
идентификатор моста генерируется как максимальное значение первичного ключа плюс 1,
имя моста "новый мост", километр моста равен половине длины дороги, длина моста = количеству символов наименования дороги

1. Получаем список дорог:

select idroad from road
where (road_end_km-road_beg_km)>10
and not exists
(select * from bridge
where bridge.idroad=road.idroad)

2. Добавление моста:

create or replace procedure add_bridge (id_road in int)
is

id_bridge int;
km number (8,3);
length_bridge number (8,3);

begin

select (max(idbridge)+1) into id_bridge from bridge;
select (road_end_km-road_beg_km)/2 into km from road where idroad=id_road;
select length (road_name) into length_bridge from road where idroad=id_road;

insert into bridge (idbridge, bridge_name, idroad, road_km, length_of_bridge, cortime)
values (id_bridge, 'новый мост', id_road, km, length_bridge, sysdate);

end;

Объясните пожалуйста, как передать в процедуру список дорог? Создать массив? И как для каждой дороги из этого списка создать мост? Использовать курсоры, цикл?
В общем, я не совсем представляю, как "связать" между собой список дорог и добавление мостов.

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
20.08.2017, 16:10
    #39508044
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хранимая процедура
NadzeyaЕсть 2 таблицы - дороги и мосты.


Вариация извечной темы "дураки и дороги"? Зачем нужен мост на всех дорогам длиной более 10 километров, у которых отсутствуют мосты даже если нет рек, оврагов, ущелий, пересечений с другими дорогами и.т.д.? Для распила бюджета? Ну а "идентификатор моста генерируется как максимальное значение первичного ключа плюс 1" отдельная песня .

SY.
...
Рейтинг: 0 / 0
20.08.2017, 16:39
    #39508059
хранимая процедура
SY,

Ты просто давно в университете не учился. Там ещё и не такой бред задают....
...
Рейтинг: 0 / 0
20.08.2017, 16:46
    #39508064
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хранимая процедура
Добрый Э - ЭхТы просто давно в университете не учился. Там ещё и не такой бред задают....

Надеюсь хоть не на физтехе.

SY.
...
Рейтинг: 0 / 0
20.08.2017, 16:50
    #39508066
Nadzeya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хранимая процедура
Это задание на SQL. Если не можете помочь, лучше уж тогда ничего не пишите, пожалуйста.
...
Рейтинг: 0 / 0
20.08.2017, 16:52
    #39508067
Nadzeya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хранимая процедура
SYNadzeyaЕсть 2 таблицы - дороги и мосты.


Ну а "идентификатор моста генерируется как максимальное значение первичного ключа плюс 1" отдельная песня .

SY.
А что тут смешного, по-вашему? То, что поле без автоинкремента?
...
Рейтинг: 0 / 0
20.08.2017, 17:32
    #39508071
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хранимая процедура
NadzeyaЭто задание на SQL. Если не можете помочь, лучше уж тогда ничего не пишите, пожалуйста.

А задание на этом форуме дали ?
...
Рейтинг: 0 / 0
20.08.2017, 17:44
    #39508074
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хранимая процедура
NadzeyaА что тут смешного, по-вашему? То, что поле без автоинкремента?

Ну и как это будет работать в много-сессионной среде?

SY.
...
Рейтинг: 0 / 0
20.08.2017, 18:54
    #39508096
Nadzeya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хранимая процедура
SYNadzeyaА что тут смешного, по-вашему? То, что поле без автоинкремента?

Ну и как это будет работать в много-сессионной среде?

SY.

Не в этом суть. Необходимо написать процедуру. Задание абстрактное, на практике это применять никто не будет.
...
Рейтинг: 0 / 0
20.08.2017, 19:26
    #39508108
проходил мимо...
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хранимая процедура
Nadzeyaна практике это применять никто не будет.
может быть, его тогда и писать не нужно?
или вы хотите избавиться от надоедливого препода чужими руками?
...
Рейтинг: 0 / 0
20.08.2017, 19:46
    #39508117
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хранимая процедура
NadzeyaОбъясните пожалуйста, как передать в процедуру список дорог?

Ну так убери параметр из процедуры и измени INSERT VALUES на INSERT SELECT на базе

Код: plsql
1.
2.
3.
4.
5.
select idroad from road
where (road_end_km-road_beg_km)>10
and not exists
(select * from bridge
where bridge.idroad=road.idroad)



SY.
...
Рейтинг: 0 / 0
20.08.2017, 21:02
    #39508146
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хранимая процедура
NadzeyaОбъясните пожалуйста, как передать в процедуру список дорог?

Попробуйте метод Rubber duck debugging - на русском аналог ... даже не знаю, наверно разговор с зеркалом

Посадите напротив себя резинового Утенка
Начинайте задавать Утенку теже самые вопросы.
Потом получите (от Утенка) на них ответ - А тебе зачем?
А дальше ответьте ему зачем Вам это и чем оно Вам поможет.

По факту сейчас этим Утенком выступает форум
Вот мой Вам вопрос: А зачем Вам передавать в процедуру список дорог? Вы не можете его получить всредине процедуры или Вам его должны навязать извне?
...
Рейтинг: 0 / 0
21.08.2017, 09:06
    #39508240
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хранимая процедура
Nadzeya,

однопользовательский режим
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
SQL> select  * from road;

    IDROAD ROAD_NAME            ROAD_BEG_KM ROAD_END_KM CORTIME
---------- -------------------- ----------- ----------- --------
         1 Lviv                          10         110 21.08.17
         2 Nadzeya                       10          15 21.08.17
         3 kiev                         100         700 21.08.17
         4 Samara                         0        3000 21.08.17

SQL> select * from bridge;

  IDBRIDGE BRIDGE_NAME              IDROAD    ROAD_KM LENGTH_OF_BRIDGE CORTIME
---------- -------------------- ---------- ---------- ---------------- --------
       100 Sm                            4        200             40,5 21.08.17

SQL> select idroad from road
  2  where (road_end_km-road_beg_km)>10
  3  and not exists
  4  (select * from bridge
  5  where bridge.idroad=road.idroad);

    IDROAD
----------
         3
         1

SQL> declare
  2   procedure   add_month(p_idroad number,p_length_road number,p_road_name varchar2) is
  3   begin
  4     insert into bridge (idbridge,bridge_name,idroad,road_km,length_of_bridge,cortime)
  5     values
  6     ((select nvl(max(idbridge),0)+1 from bridge),'Новий міст'
  7       ,p_idroad,p_length_road/2,length(p_road_name),sysdate);
  8   end;
  9  begin
 10   for r in (select idroad,road_name,(road_end_km-road_beg_km) length_road from road
 11             where (road_end_km-road_beg_km)>10
 12                    and not exists
 13                      (select * from bridge where bridge.idroad=road.idroad)) loop
 14    add_month(r.idroad,r.length_road,r.road_name);
 15   end loop;
 16   --commit;
 17  end;
 18  /

PL/SQL procedure successfully completed.

SQL> select * from bridge;

  IDBRIDGE BRIDGE_NAME              IDROAD    ROAD_KM LENGTH_OF_BRIDGE CORTIME
---------- -------------------- ---------- ---------- ---------------- --------
       100 Sm                            4        200             40,5 21.08.17
       101 Новий міст                    3        300                4 21.08.17
       102 Новий міст                    1         50                4 21.08.17

SQL> rollback;

Rollback complete.



....
stax
...
Рейтинг: 0 / 0
21.08.2017, 09:24
    #39508248
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хранимая процедура
Stax,

не проснулся add_month - add_bridge

.....
stax
...
Рейтинг: 0 / 0
21.08.2017, 15:17
    #39508447
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хранимая процедура
Staxне проснулся

А почему не одним INSERTом?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
create or replace
  procedure add_bridge
  is
      id_bridge int;
  begin
      select  max(idbridge)
        into  id_bridge
        from  bridge;
      select  (road_end_km - road_beg_km) / 2,
              length(road_name)
        into  km,
              length_bridge
        from  road
        where idroad = id_road;
        insert
          into bridge(
                      idbridge,
                      bridge_name,
                      idroad,
                      road_km,
                      length_of_bridge,
                      cortime
                     )
          select  id_bridge + rownum,
                  'новый мост',
                  idroad,
                  (road_end_km - road_beg_km) / 2,
                  length(road_name),
                  sysdate
            from  road
            where road_end_km - road_beg_km > 10
              and not exists(
                             select  1
                               from  bridge
                               where bridge.idroad = road.idroad
                            );
end;
/



SY.
...
Рейтинг: 0 / 0
21.08.2017, 15:26
    #39508455
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хранимая процедура
SYStaxне проснулся

А почему не одним INSERTом?

SY.

можно/надо одним и возможно без процедуры

чет запало в душу "как передать в процедуру список дорог"


....
stax
...
Рейтинг: 0 / 0
21.08.2017, 15:39
    #39508466
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хранимая процедура
SY,

Код: plsql
1.
2.
3.
4.
5.
6.
      select  (road_end_km - road_beg_km) / 2,
              length(road_name)
        into  km,
              length_bridge
        from  road
        where idroad = id_road;



очепятка

.....
stax
...
Рейтинг: 0 / 0
21.08.2017, 17:19
    #39508528
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хранимая процедура
Staxочепятка
stax

Спасибо. Забыл убрать:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
create or replace
  procedure add_bridge
  is
      id_bridge int;
  begin
      select  max(idbridge)
        into  id_bridge
        from  bridge;
        insert
          into bridge(
                      idbridge,
                      bridge_name,
                      idroad,
                      road_km,
                      length_of_bridge,
                      cortime
                     )
          select  id_bridge + rownum,
                  'новый мост',
                  idroad,
                  (road_end_km - road_beg_km) / 2,
                  length(road_name),
                  sysdate
            from  road
            where road_end_km - road_beg_km > 10
              and not exists(
                             select  1
                               from  bridge
                               where bridge.idroad = road.idroad
                            );
end;
/



SY.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / хранимая процедура / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]