Skip to content

Первая программа на PL/SQL

Итак, напишем нашу первую программу на PL/SQL. Но перед этим создадим простую таблицу users, в которой будем хранить список пользователей некой системы:

sql
create table users(
    id number primary key,
    login varchar2(60) not null,
    sign_date date default sysdate not null,
    is_active number(1) default 1 not null
);

insert into users
values(1, 'UserA', to_date('21.01.2019', 'dd.mm.yyyy'), 1);

insert into users
values(2, 'UserB', to_date('15.07.2017', 'dd.mm.yyyy'), 1);

insert into users
values(3, 'UserC', to_date('02.10.2015', 'dd.mm.yyyy'), 1);
create table users(
    id number primary key,
    login varchar2(60) not null,
    sign_date date default sysdate not null,
    is_active number(1) default 1 not null
);

insert into users
values(1, 'UserA', to_date('21.01.2019', 'dd.mm.yyyy'), 1);

insert into users
values(2, 'UserB', to_date('15.07.2017', 'dd.mm.yyyy'), 1);

insert into users
values(3, 'UserC', to_date('02.10.2015', 'dd.mm.yyyy'), 1);

Теперь приведем текст программы:

plsql
begin
    update users
    set is_active = 0
    where sign_date < to_date('01.01.2016', 'dd.mm.yyyy'); 
end;
/
begin
    update users
    set is_active = 0
    where sign_date < to_date('01.01.2016', 'dd.mm.yyyy'); 
end;
/

Данный код делает неактивными всех пользователей, которые были зарегистрированы ранее, чем первое января 2016 года.

Программа очень простая, но зато она наглядно демонстрирует важнейшую особенность PL/SQL - тесную интеграцию с SQL. Любой SQL запрос может быть вызван из PL/SQL, и это абсллютно нормально и естественно. На самом деле, большую часть кода PL/SQL, как правило, составляют именно SQL-запросы.

Здесь важно понимать, почему это PL/SQL программа, а не простой SQL-запрос. Причиной является тот факт, что запрос заключен в анонимный блок.

Внутри блока может находиться сколько угодно запросов. Например, следующая программа делает неактивными пользователей, зарегистрировавшихся раньше 2016 года, и добавляет нового пользователя:

plsql
begin
    update users
    set is_active = 0
    where sign_date < to_date('01.01.2016', 'dd.mm.yyyy');

    insert into users
    values(4, 'UserD', SYSDATE);
end;
/
begin
    update users
    set is_active = 0
    where sign_date < to_date('01.01.2016', 'dd.mm.yyyy');

    insert into users
    values(4, 'UserD', SYSDATE);
end;
/