Как преобразовать фрагмент кода в блок кода?
Для работы с БД я держу в системе отдельный файл с расширением .sql. В файле хранится код, который создаёт таблицы, процедуры и т.д.
В процессе написания всех упомянутых выше объектов, наткнулся на одну неприятную деталь: по мере роста кода, стало надоедать скролить по 100 строк вверх ради изменения структуры таблиц.
Кода, как мне кажется, не так уж и много, а потому я ещё помню где и что находится. Для удобства я даже описал все создания однообразных структур в отдельные группы, но хотелось бы как-нибудь упростить работу с кодом.
Вопрос:
Есть-ли какая-то возможность сворачивать отдельные фрагменты кода в сворачиваемые блоки кода? Например, две процедуры в один блок кода.
Есть-ли какие-то хитрости, советы по сжатию кода в компактные фрагменты? Стоит-ли разбивать строки кода на файлы?
Пример кода, который хотелось бы как-нибудь "сжать":
create table y_table_property(
prop_gs_num_max number(3),
prop_gs_ls_num_max number(3),
prop_ls_loc_num_max number(3),
prop_prof_avatar_num_max number(1)
);
create table y_table_profile(
profile_id number(8) not null,
profile_name varchar(100) not null,
profile_mail varchar2(100) not null,
profile_avatarNum number(1) not null,
profile_lastDateActive varchar2(10) not null,
constraint profile_id_pk primary key(profile_id)
);
create table y_table_programmer(
programmer_id number(8) not null,
programmer_name varchar2(100) not null,
programmer_nick varchar2(100) not null,
programmer_profile_id number(8),
constraint programmer_id_pk primary key(programmer_id),
constraint programmer_profile_id_fk
foreign key(programmer_id) references y_table_profile(profile_id)
);
Ответы (1 шт):
Чтобы обьединить отдельные DDL запросы на создание объектов БД: таблиц, последовательностей, представлений, типов данных итд, можно воспользоваться анонимным блоком. Он позволит сгрупировать все создаваемые в нём объекты в одну синтаксическую единицу.
Вот простейший пример для выше сказанного. Создйте сначала вспомогательный пакет:
create or replace package ddlutils as
type sqlcoderec is record (message varchar2(96), ignoreflag boolean);
type sqlcodetab is table of sqlcoderec index by pls_integer;
sqlcodes sqlcodetab := sqlcodetab();
procedure exec (stmt varchar2);
end;
/
create or replace package body ddlutils as
procedure exec (stmt varchar2) is
begin
execute immediate stmt;
dbms_output.put_line ('>'||stmt||'< result='||sql%rowcount);
exception when others then
dbms_output.put ('>'||stmt||'< result='||sqlerrm);
if sqlcodes.exists (sqlcode) and sqlcodes(sqlcode).ignoreflag then
dbms_output.put_line ('>>> ignored');
else
raise;
end if;
end;
end;
/
Определитесь, какие ошибки можно пропустить, например, объект был уже создан, а какие нет и надо прекратить выполнение. Занесите их в словарик sqlcodes.
Упрощённый пример использования:
whenever sqlerror exit failure rollback
set serveroutput on
<<"create orders">> declare
begin
ddlutils.sqlcodes := ddlutils.sqlcodetab (
-942 => ddlutils.sqlcoderec ('table does not exist', false),
-955 => ddlutils.sqlcoderec ('object alredy exists', true));
ddlutils.exec (q'[create table item (id int primary key, name varchar2 (96))]');
ddlutils.exec (q'[insert into item values (0, 'template item')]');
ddlutils.exec (q'[create table orderitem (orderid int, itemid int, qty int)]');
end "create orders";
/
Так примерно будет выглядеть результат:
>create table item (id int primary key, name varchar2 (96))<
result=ORA-00955: name is already used by an existing object>>> ignored
>insert into item values (0, 'template item')< result=1
>create table orderitem (orderid int, itemid int, qty int)< result=0
Все функции и процедуры следует объединить в пакеты по их логическим областям применения, что создаст также отдельные синтаксические единицы.
Почти любое IDE имеет функционал по сворачиванию/разварачиванию (Collapse/Expand) синтаксических конструкций. Обратитесь к документации используемой IDE.