Какой тип цикла(Loop, For, While) лучше всего подходит для задачи:
1) Установить статус каждой компании в "closed", у которой ИД записан в PL/SQL таблицу.
2) Вывести имя и год рождения каждого сотрудника, которых возвращает курсор.
Monday, December 15, 2008
Раздел 1.2 Задача 3
Как можно улучшить каждый из следующих фрагментов кода:
a.
OPEN emp_cur;
FETCH emp_cur INTO emp_rec;
WHILE emp_cur%FOUND
LOOP
calc_totals (emp_rec.salary);
FETCH emp_cur INTO emp_rec;
EXIT WHEN emp_rec.salary > 100000;
END LOOP;
CLOSE emp_cur;
b.
FOR a_counter IN lo_val .. hi_val
LOOP
IF a_counter > lo_val * 2
THEN
hi_val := lo_val;
END IF;
END LOOP;
c.
DECLARE
CURSOR emp_cur IS SELECT salary FROM em
emp_rec emp_cur%ROWTYPE
BEGIN
OPEN emp_cur;
LOOP
FETCH emp_cur INTO emp_rec;
EXIT WHEN emp_cur%NOTFOUND;
calc_totals (emp_rec.salary);
END LOOP;
CLOSE emp_cur;
END;
d.
WHILE no_more_data
LOOP
read_next_line (text);
no_more_data := text IS NULL;
EXIT WHEN no_more_data;
END LOOP;
e.
FOR month_index IN 1 .. 12
LOOP
UPDATE monthly_sales
SET pct_of_sales = 100
WHERE company_id = 10006
f.
FOR i IN 1 .. 100
LOOP
calc_totals (i);
IF i > 75
THEN
EXIT;
END IF;
END LOOP;
a.
OPEN emp_cur;
FETCH emp_cur INTO emp_rec;
WHILE emp_cur%FOUND
LOOP
calc_totals (emp_rec.salary);
FETCH emp_cur INTO emp_rec;
EXIT WHEN emp_rec.salary > 100000;
END LOOP;
CLOSE emp_cur;
b.
FOR a_counter IN lo_val .. hi_val
LOOP
IF a_counter > lo_val * 2
THEN
hi_val := lo_val;
END IF;
END LOOP;
c.
DECLARE
CURSOR emp_cur IS SELECT salary FROM em
emp_rec emp_cur%ROWTYPE
BEGIN
OPEN emp_cur;
LOOP
FETCH emp_cur INTO emp_rec;
EXIT WHEN emp_cur%NOTFOUND;
calc_totals (emp_rec.salary);
END LOOP;
CLOSE emp_cur;
END;
d.
WHILE no_more_data
LOOP
read_next_line (text);
no_more_data := text IS NULL;
EXIT WHEN no_more_data;
END LOOP;
e.
FOR month_index IN 1 .. 12
LOOP
UPDATE monthly_sales
SET pct_of_sales = 100
WHERE company_id = 10006
f.
FOR i IN 1 .. 100
LOOP
calc_totals (i);
IF i > 75
THEN
EXIT;
END IF;
END LOOP;
Раздел 1.2 Задача 1
Сколько раз выполнится цикл:
FOR year_index IN REVERSE 12 .. 1
LOOP
calc_sales (year_index);
END LOOP;
FOR year_index IN REVERSE 12 .. 1
LOOP
calc_sales (year_index);
END LOOP;
Sunday, December 14, 2008
Раздел 1.1 Задача 4
Какое условие никогда не выполнится :
IF (order_date > SYSDATE) AND order_total >= min_order_total
THEN
fill_order (order_id, 'HIGH PRIORITY');
ELSIF (order_date < SYSDATE) OR
(order_date = SYSDATE)
THEN
fill_order (order_id, 'LOW PRIORITY');
ELSIF order_date <= SYSDATE AND order_total < min_order_total
THEN
queue_order_for_addtl_parts (order_id);
ELSIF order_total = 0
THEN
disp_message (' No items have been placed in this order!');
END IF;
IF (order_date > SYSDATE) AND order_total >= min_order_total
THEN
fill_order (order_id, 'HIGH PRIORITY');
ELSIF (order_date < SYSDATE) OR
(order_date = SYSDATE)
THEN
fill_order (order_id, 'LOW PRIORITY');
ELSIF order_date <= SYSDATE AND order_total < min_order_total
THEN
queue_order_for_addtl_parts (order_id);
ELSIF order_total = 0
THEN
disp_message (' No items have been placed in this order!');
END IF;
Раздел 1.1 Задача 3
Необходимо переписать следующий фрагмент кода , что-бы избавиться от ненужных вложенных циклов:
IF salary < 10000
THEN
bonus := 2000;
ELSE
IF salary < 20000
THEN
bonus := 1500;
ELSE
IF salary < 40000
THEN
bonus := 1000;
ELSE
bonus := 500;
END IF;
END IF;
END IF;
IF salary < 10000
THEN
bonus := 2000;
ELSE
IF salary < 20000
THEN
bonus := 1500;
ELSE
IF salary < 40000
THEN
bonus := 1000;
ELSE
bonus := 500;
END IF;
END IF;
END IF;
Раздел 1.1 Задача 2
Известно что функция calc_totals() выполняется около 3х минут, тогда как время работы функции overdue_balance() занимает меньше одной секунды. Необходимо переписать следующий фрагмент кода, так что бы он выполнялся максимально быстро:
IF calc_totals (1994, company_id_in => 1005) AND
NOT overdue_balance (company_id_in => 1005)
THEN
display_sales_figures (1005);
ELSE
contact_vendor;
END IF;
IF calc_totals (1994, company_id_in => 1005) AND
NOT overdue_balance (company_id_in => 1005)
THEN
display_sales_figures (1005);
ELSE
contact_vendor;
END IF;
Раздел 1.1 Задача 1
Необходимо переписать следующий фрагмент кода , так что бы значение no_revenue можно было установить без условных операторов IF. В чём отличие первого фрагмента кода от второго?
1)
IF total_sales <= 0 THEN
no_revenue := TRUE;
ELSE
no_revenue := FALSE;
END IF;
2)
IF total_sales <= 0 THEN
no_revenue := TRUE;
ELSIF total_sales > 0 THEN
no_revenue := FALSE;
END IF;
1)
IF total_sales <= 0 THEN
no_revenue := TRUE;
ELSE
no_revenue := FALSE;
END IF;
2)
IF total_sales <= 0 THEN
no_revenue := TRUE;
ELSIF total_sales > 0 THEN
no_revenue := FALSE;
END IF;
Subscribe to:
Posts (Atom)