Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практика. Часть 1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
238.08 Кб
Скачать

Лабораторная работа № 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.