powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / хранимая процедура
18 сообщений из 18, страница 1 из 1
хранимая процедура
    #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
хранимая процедура
    #39508044
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NadzeyaЕсть 2 таблицы - дороги и мосты.


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

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

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

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

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


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

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

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

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

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

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

SY.

Не в этом суть. Необходимо написать процедуру. Задание абстрактное, на практике это применять никто не будет.
...
Рейтинг: 0 / 0
хранимая процедура
    #39508108
проходил мимо...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nadzeyaна практике это применять никто не будет.
может быть, его тогда и писать не нужно?
или вы хотите избавиться от надоедливого препода чужими руками?
...
Рейтинг: 0 / 0
хранимая процедура
    #39508117
Фотография 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
хранимая процедура
    #39508146
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NadzeyaОбъясните пожалуйста, как передать в процедуру список дорог?

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

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

По факту сейчас этим Утенком выступает форум
Вот мой Вам вопрос: А зачем Вам передавать в процедуру список дорог? Вы не можете его получить всредине процедуры или Вам его должны навязать извне?
...
Рейтинг: 0 / 0
хранимая процедура
    #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
хранимая процедура
    #39508248
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

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

.....
stax
...
Рейтинг: 0 / 0
хранимая процедура
    #39508447
Фотография 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
хранимая процедура
    #39508455
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYStaxне проснулся

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

SY.

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

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


....
stax
...
Рейтинг: 0 / 0
хранимая процедура
    #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
хранимая процедура
    #39508528
Фотография 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
18 сообщений из 18, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / хранимая процедура
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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