Как преобразовать фрагмент кода в блок кода?

Для работы с БД я держу в системе отдельный файл с расширением .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 шт):

Автор решения: 0xdb

Чтобы обьединить отдельные 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.

→ Ссылка