
- •Лабораторная работа № 3
- •1. Проанализируйте блок кода и ответьте на вопросы:
- •4. В этом задании вы будете работать с переменными подстановки, запрашивая их
- •Лабораторная работа № 4
- •3. С помощью инструкции update измените значение location_id, для вновь
- •4. Откройте скрипт lab_03_05b.Sql.
- •Лабораторная работа № 5
- •Лабораторная работа № 6
- •1. Напишите скрипт для распечатки информации о выбранной стране:
- •2. Напишите блок кода для выборки имени u1076 департамента из специальной структуры
- •3. Измените скрипт из второго пункта, таким образом, чтобы в индексированной таблице хранились записи (record), содержащие всю информацию об отделах.
- •Лабораторная работа № 7.
- •Лабораторная работа № 8.
- •1. Основная задача этого упражнения – продемонстрировать использование
- •3. Загрузите скрипт lab_07_04_soln.Sql.
Лабораторная работа № 6
1. Напишите скрипт для распечатки информации о выбранной стране:
a. Декларируйте переменную country_record типа countries%ROWTYPE.
b. С помощью директивы DEFINE определите переменную countryid и
присвойте ей значение CA по умолчанию. В исполняемой секции кода
присвойте ей значение через переменную подстановки.
c. Извлеките информацию из таблицы countries для страны с заданным
значением countryid в переменную, и выведите данные с помощью
переменной country_record.
DECLARE country_record countries%rowtype; BEGIN SELECT * INTO country_record FROM countries WHERE country_id = &countryid; DBMS_OUTPUT.ENABLE(); DBMS_OUTPUT.PUT_LINE(country_record.country_name); END; |
d. Результат должен выглядеть примерно так:
e. Протестируйте работу скрипта на странах с идентификаторами DE, UK, US.
2. Напишите блок кода для выборки имени u1076 департамента из специальной структуры
хранения INDEX BY … TABLE. Сохраните скрипт как lab_06_02_soln.sql.
a. Декларируйте тип INDEX BY TABLE с именем dept_table_type
предназначенный для хранения значений типа
departments.department_name%TYPE. Декларируйте переменную my_dept_table типа dept_table_type.
b. Декларируйте две переменные loop_count и deptno типа NUMBER. Присвойте им значения по умолчанию 10 и 0 соответственно.
c. С помощью цикла, получите из таблицы departments имена 10 отделов и сохраните их в my_dept_table. Начните с dept_id равного 10. Увеличивайте счетчик и номер отдела соответственно с шагом в 10 единиц. Номера и названия отделов, которые необходимо скопировать в индексированную таблицу, показаны на рисунке:
d. С помощью другого цикла, извлеките значения из индексированной таблицы и распечатайте их.
e. Сохраните скрипт под именем lab_06_02_soln.sql. Результат работы показан на рисунке:
DECLARE TYPE dept_table_type IS TABLE OF departments.department_name%type INDEX BY BINARY_INTEGER; my_dept_table dept_table_type; loop_count NUMBER(10):=10; deptno NUMBER(10):=0; BEGIN FOR i IN 1..10 LOOP SELECT department_name INTO my_dept_table(i) FROM departments WHERE department_id = i*10; END LOOP; DBMS_OUTPUT.ENABLE(); FOR i IN 1..10 LOOP DBMS_OUTPUT.PUT_LINE(my_dept_table(i)); END LOOP; END; / |
3. Измените скрипт из второго пункта, таким образом, чтобы в индексированной таблице хранились записи (record), содержащие всю информацию об отделах.
a. Продолжайте работать с предыдущим скриптом.
b. Измените декларирование типа dept_table_type так, чтобы теперь в
индексированной таблице хранились элементы типа
departments%ROWTYPE.
c. Измените инструкцию SELECT таким образом, чтобы извлекать все
колонки из таблицы departments для каждой записи.
d. Измените второй цикл, чтобы вывести все данные сохраненные в
индексированной таблице.
DECLARE TYPE dept_table_type IS TABLE OF departments%rowtype INDEX BY BINARY_INTEGER; my_dept_table dept_table_type; loop_count NUMBER(10):=10; deptno NUMBER(10):=0; BEGIN FOR i IN 1..10 LOOP SELECT * INTO my_dept_table(i) FROM departments WHERE department_id = i*10; END LOOP; DBMS_OUTPUT.ENABLE(); FOR i IN 1..10 LOOP DBMS_OUTPUT.PUT_LINE(my_dept_table(i).department_id || ' ' || my_dept_table(i).department_name || ' ' || my_dept_table(i).manager_id || ' ' || my_dept_table(i).location_id); END LOOP; END; / |
e. Сохраните скрипт под новым именем. Результат должен выглядеть
примерно так:
4. Загрузите скрипт lab_05_03_soln.sql.
a. Найдите комментарий “DECLARE AN INDEX BY TABLE OF TYPE
VARCHAR2(50)». Опишите ename_table_type в соответствии с
комментарием.
b. Найдите комментарий: “DECLARE A VARIABLE ename_table OF TYPE
ename_table_type”. Декларируйте соответствующую переменную.
SET SERVEROUTPUT ON SET VERIFY OFF ACCEPT emp_id PROMPT 'Please enter your employee number'; ACCEPT emp_deptid PROMPT 'Please enter the department number for which salary revision is being done';
DECLARE emp_authorization NUMBER(5); emp_id NUMBER(5):=&emp_id; emp_deptid NUMBER(6):=&emp_deptid; no_such_employee EXCEPTION; v_employee_id employee_details.employee_id%type;
-- INCLUDE EXECUTABLE SECTION OF OUTER BLOCK HERE BEGIN -- RAISE EXCEPTION HERE
-- INCLUDE SIMPLE IF STATEMENT HERE IF emp_authorization = emp_id THEN SELECT employee_id INTO v_employee_id FROM employee_details WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'Human Resources'); DECLARE emp_sal employee_details.salary%TYPE; emp_fname employee_details.first_name%TYPE; emp_lname employee_details.last_name%TYPE; i NUMBER:=1;
-- DECLARE AN INDEX BY TABLE OF TYPE VARCHAR2(50). CALL -- IT ename_table_type TYPE ename_table_type IS TABLE OF employee_details%rowtype INDEX BY VARCHAR2(50); ename_table ename_table_type; -- DECLARE A VARIABLE ename_table OF TYPE ename_table_type
c_hike1 constant real :=.20; c_hike2 constant real :=.15; c_hike3 constant real :=.08; c_hike4 constant real :=.03;
c_range1 constant number :=6500; c_range2 constant number :=9500; c_range3 constant number :=12000; BEGIN NULL; END; -- DECLARE A CURSOR CALLED emp_records TO HOLD salary, -- first_name, and last_name of employees
-- INCLUDE EXECUTABLE SECTION OF INNER BLOCK HERE
-- CLOSE THE INNER BLOCK
ELSE DBMS_OUTPUT.PUT_LINE ('SORRY YOU ARE NOT AUTHORIZED TO USE THIS APPLICATION'); END IF;
-- INCLUDE EXCEPTION SECTION FOR OUTER BLOCK EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Exception occured'); -- CLOSE THE OUTER BLOCK END; |
c. Сохраните скрипт под именем lab_06_03_soln.sql.