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

Задача. Переименование столбцов.

С помощью команд переименования столбца вида

ALTER TABLE KK_TBL RENAME COLUMN ID TO ID2;

и с помощью динамического SQL переименовать все поля ID в таблицах текущей схемы, начинающихся с 'KK', в поля ID2.

При решении нужно не забыть, что в USER_TAB_COLUMNS есть не только нужная нам информация о таблицах, но и лишняя для нас информация о вьюшках. Кроме того, у нас не получится переименовать столбец ID в столбец ID2, если в таблице уже есть другой столбец ID2, в этом случае мы не будем ничего переименовывать.

Переименовываем:

BEGIN

FOR Z IN (SELECT UTC.TABLE_NAME

FROM USER_OBJECTS UO, USER_TAB_COLUMNS UTC

WHERE UO.OBJECT_TYPE = 'TABLE'

AND UO.OBJECT_NAME = UTC.TABLE_NAME

AND UTC.TABLE_NAME LIKE 'KK%'

AND UTC.COLUMN_NAME = 'ID'

MINUS

SELECT TABLE_NAME

FROM USER_TAB_COLUMNS

WHERE COLUMN_NAME = 'ID2') LOOP

EXECUTE IMMEDIATE 'ALTER TABLE ' || Z.TABLE_NAME ||

' RENAME COLUMN ID TO ID2';

END LOOP;

END;

Проверим:

SELECT UO.OBJECT_TYPE, UTC.TABLE_NAME, UTC.COLUMN_NAME

FROM USER_OBJECTS UO, USER_TAB_COLUMNS UTC

WHERE UO.OBJECT_NAME = UTC.TABLE_NAME

AND UTC.TABLE_NAME LIKE 'KK%'

AND UTC.COLUMN_NAME IN ('ID', 'ID2');

Переименовываем обратно ID2 в ID:

BEGIN

FOR Z IN (SELECT UTC.TABLE_NAME

FROM USER_OBJECTS UO, USER_TAB_COLUMNS UTC

WHERE UO.OBJECT_TYPE = 'TABLE'

AND UO.OBJECT_NAME = UTC.TABLE_NAME

AND UTC.TABLE_NAME LIKE 'KK%'

AND UTC.COLUMN_NAME = 'ID2'

MINUS

SELECT TABLE_NAME

FROM USER_TAB_COLUMNS

WHERE COLUMN_NAME = 'ID') LOOP

EXECUTE IMMEDIATE 'ALTER TABLE ' || Z.TABLE_NAME ||

' RENAME COLUMN ID2 TO ID';

END LOOP;

END;

Задача. Создание вьюшек.

Для всех таблиц данной схемы, в которых есть поле name типа varchar2 или char, создать view: vw_<имя таблицы>, запрашивающие список возможных значений NAMЕ в этих таблицах.

Создадим немного таблиц с полем NAME для теста:

create table kk_tbl1 (name varchar2(30));

create table kk_tbl2 (name char(30));

create table kk_tbl3 (name integer);

declare

stmt varchar2(4000);

begin

for z in (select tc.table_name

from user_tab_columns tc, user_objects o

where tc.column_name = 'NAME'

and tc.data_type in ('VARCHAR2', 'CHAR')

and tc.table_name = o.object_name

and o.object_type = 'TABLE') loop

stmt := 'create or replace view vw_' || z.table_name ||

' as select distinct name from ' || z.table_name;

-- создадим вьюшку

execute immediate stmt;

-- и выведем скрипт ее создания в dbms_output

dbms_output.put_line(stmt);

end loop;

end;

Триггеры.

Триггеры чаще всего "вешаются" на таблицы. В триггерах пишут, какие действия нужно совершить перед изменением данных в таблице или после изменения данных в таблице. По этому признаку триггеры бывают BEFORE и AFTER. Триггеры можно "вешать" на события INSERT, UPDATE, DELETE. В триггерах можно проверять, какое именно из действий совершается (IF inserting THEN ..., IF updating THEN ..., IF deleting THEN ..., ), а также обращаться к предыдущим и новым значениям полей (например, v_old_id := :old.ID; :new.ID := v_new_id).

Подробности мы разберем в задачах ниже.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]