powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вопрос по студенческой задаче . DB2
3 сообщений из 3, страница 1 из 1
Вопрос по студенческой задаче . DB2
    #40005533
voodysy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как лучше использовать ITERATE ? SQL. DB2
1) создайте две таблицы для хранения мужчин и женщин отдельно, заполните таблицы на основе данных о сотрудниках, используйте оператор for для итерации записей, используйте оператор if, чтобы понять, куда вставить запись (в мужскую или женскую таблицу)
2) сделайте то же самое, используя оператор while
3) сделайте то же самое только для десяти строк, используйте оператор leave для выхода из цикла
4) сделайте то же самое только для женщин, используйте оператор iterate, чтобы ничего не делать с мужчинами

Нужна помощь с 4ым пунктом
Код: sql
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.
@delimiter $;
CREATE OR REPLACE PROCEDURE proc3()
specific proc3
BEGIN
  DECLARE c1 CHAR(6);
  DECLARE c2 VARCHAR(12);
  DECLARE c3 VARCHAR(12);
  DECLARE c4 CHAR(3);
  DECLARE c5 DECIMAL(9,2);
  DECLARE c6 CHAR(1);
  DECLARE sqlstate CHAR(5);
  DECLARE cr cursor FOR
    SELECT empno,firstnme,lastname,workdept,salary,sex FROM employee;
  OPEN cr;
  fetch FROM cr INTO c1,c2,c3,c4,c5,c6;
  whileloop:
  while sqlstate='00000' do
    IF c6='F' THEN 
       INSERT INTO females(empno,firstnme,lastname,workdept,salary,sex) VALUES(c1,c2,c3,c4,c5,c6);
    ELSE
       fetch FROM cr INTO c1,c2,c3,c4,c5,c6;
       ITERATE whileloop; 
       INSERT INTO males(empno,firstnme,lastname,workdept,salary,sex) VALUES(c1,c2,c3,c4,c5,c6);
    END IF;
    fetch FROM cr INTO c1,c2,c3,c4,c5,c6;
  END while;
  close cr;
END$
@delimiter ;$
CALL proc3();
SELECT * FROM males;
SELECT * FROM females;



Этот блок кода плохой, нужно найти более осмысленное использование ITERATE для этого элемента:
Код: sql
1.
2.
3.
4.
5.
6.
7.
IF c6='F' THEN 
           INSERT INTO females(empno,firstnme,lastname,workdept,salary,sex) VALUES(c1,c2,c3,c4,c5,c6);
        ELSE
           fetch FROM cr INTO c1,c2,c3,c4,c5,c6;
           ITERATE whileloop; 
           INSERT INTO males(empno,firstnme,lastname,workdept,salary,sex) VALUES(c1,c2,c3,c4,c5,c6);
        END IF;



В этом случае мы добавили Iterate, в котором не было необходимости, и чтобы оправдать его наличие, мы также добавили вставку после него.

в итоге никакой выгоды и две лишние строчки кода
...
Рейтинг: 0 / 0
Вопрос по студенческой задаче . DB2
    #40005535
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
voodysy,

Вы даже не попытались сами попробовать сделать так, как вам посоветовали на сайте SO, где вы задали этот же вопрос?
Если попытались, то покажите, что получилось.
...
Рейтинг: 0 / 0
Вопрос по студенческой задаче . DB2
    #40005583
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BTW Конечно же, лучше вообще ITERATE не использовать...
...а переложить работу с, как бы там ни было, тормознутой PVM непосредственно на движок СУБД. Ну и не бомбить базу кучей мелких запросов.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
ALTER TABLE males   add constraint IS_MALE   CHECK (sex = 'M');  -- (если ещё нет такого)
ALTER TABLE females add constraint IS_FEMALE CHECK (sex = 'F');  -- (если ещё нет такого)

CREATE VIEW population AS
select empno,firstnme,lastname,workdept,salary,sex from males
uniun all
select empno,firstnme,lastname,workdept,salary,sex from females;

insert into population
  select empno,firstnme,lastname,workdept,salary,sex from employee;

-- 3) insert into population  select empno,firstnme,lastname,workdept,salary,sex from employee fetch first 10 rows only;
-- 4) insert into population  select empno,firstnme,lastname,workdept,salary,sex from employee where sex='F';


Удивительным образом за счёт констраинтов получаемое вью будет не только deletable/updatable (с ограничением на смену пола), но и insertable.


А если количество и тип колонок в таблицах males и females совпадает, то пол менять можно, добавив к вью опцию "WITH ROW MOVEMENT":
Код: sql
1.
2.
3.
4.
5.
CREATE VIEW population AS
select empno,firstnme,lastname,workdept,salary,sex from males
uniun all
select empno,firstnme,lastname,workdept,salary,sex from females
WITH ROW MOVEMENT;

По изменению пола запись будет мигрировать между таблицами.


Т.е. понятно, что задание "не о том", но...
Впрочем
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
  while sqlstate='00000' do
    IF c6 <> 'F' THEN 
       fetch FROM cr INTO c1,c2,c3,c4,c5,c6;
       ITERATE whileloop; 
    END IF;

    INSERT INTO females(empno,firstnme,lastname,workdept,salary,sex) VALUES(c1,c2,c3,c4,c5,c6);
    fetch FROM cr INTO c1,c2,c3,c4,c5,c6;
  END while;
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вопрос по студенческой задаче . DB2
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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