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

Троичная логика, конструкция with, функции nvl, coalesce, case, decode.

В Oracle для неопределенного/пустого значения в полях используется NULL. NULL может быть и результатом логического выражения. В Oracle имеет место троичная логика:

TRUE AND TRUE -> TRUE

TRUE AND FALSE -> FALSE

FALSE AND FALSE -> FALSE

TRUE AND NULL -> NULL

FALSE AND NULL -> FALSE

TRUE OR TRUE -> TRUE

TRUE OR FALSE -> TRUE

FALSE OR FALSE -> FALSE

TRUE OR NULL -> TRUE

FALSE OR NULL -> NULL

Подзапросы в Oracle можно именовать с помощью конструкции WITH и выносить в начало запроса.

Этот запрос демонстрирует использование функций nvl, coalesce, case, decode:

with a as

(select null f1, null f2, 1 f3, 2 f4, 3 f5 from dual)

select nvl(f1, f3), -- выдать первый аргумент, а, если он IS NULL, то второй аргумент

nvl(f4, f5),

coalesce(f1, f2, f3, f4), -- выдать первый NOT NULL аргумент из списка

case

when f2 is null then

f3

when f4 = 2 then

f5

else

0

end, -- выдача результата по первому совпавшему условию

decode(f1, null, 7, 8, 9, 0) -- упрощенная запись case when f1 is null then 7 when f1 = 8 then 9 else 0 end

from a;

Основы pl/sql.

Помимо SQL команд, таких как select, insert, update, delete, в Oracle есть возможность писать блоки кода, которые выполняют целый ряд действий. Такие блоки кода пишутся на языке PL/SQL и называются PL/SQL блоками. Приведем примеры.

Вот анонимный блок. Он состоит из трех частей: объявление переменных, выполняемый код и обработка исключений:

declare

i integer;

begin

select count(1) into i from dual;

exception when others then

null;

end;

Вот пример простейшей функции, написанной на PL/SQL:

create or replace function kk_dual_count return integer as

i integer;

begin

select count(1) into i from dual;

return i;

end kk_dual_count;

Выборка значения функции:

select kk_dual_count from dual;

Задача. Факториал.

Реализовать pl/sql функцию, считающую факториал числа.

Решим задачу двумя способами, заодно познакомимся с понятием функции и увидим синтаксис простейших функций:

create or replace function kk_factorial(n in integer) return integer is

f integer := 1;

begin

for i in 1 .. n loop

f := f * i;

end loop;

return f;

end kk_factorial;

create or replace function kk_factorial_recursive(n in integer)

return integer is

begin

if n = 0 then

return 1;

else

return n * kk_factorial_recursive(n - 1);

end if;

end kk_factorial_recursive;

Проверим результаты:

select kk_factorial(0),

kk_factorial_recursive(0),

kk_factorial(1),

kk_factorial_recursive(1),

kk_factorial(3),

kk_factorial_recursive(3),

kk_factorial(5),

kk_factorial_recursive(5)

from dual;

Задача. Подсчет числа вхождений символа в строку.

С помощью substr и instr написать pl/sql функцию, которая считает число вхождений буквы 'A' в строку.

Решим задачу разными способами:

Сканирование строки:

create or replace function kk_kol(a in varchar2) return integer is

res integer;

begin

res := 0;

for i in 1 .. length(a) loop

if substr(a, i, 1) = 'A' then

res := res + 1;

end if;

end loop;

return res;

end kk_kol;

Постепенное отсекание строки:

create or replace function kk_kol(a in varchar2) return integer is

res integer;

b varchar2(4000);

begin

res := 0;

b := a;

while instr(b, 'A') > 0 loop

res := res + 1;

b := substr(b, instr(b, 'A') + 1);

end loop;

return res;

end kk_kol;

Вычисление разности длины заданной строки и заданной строки с исключенными символами ‘A’:

create or replace function kk_kol(a in varchar2) return integer is

begin

return nvl(length(a), 0) - nvl(length(replace(a, 'A')), 0);

end kk_kol;

Возможны и многие другие способы.

Вызываем и проверяем:

select kk_kol('232'),

kk_kol('A232'),

kk_kol('2A32'),

kk_kol('232A'),

kk_kol('2AA32'),

kk_kol('2AA3A2'),

kk_kol('2AA3AA2'),

kk_kol('AA232'),

kk_kol('AA2AAfasdgfAAAAAAAdfsadg32'),

kk_kol('Adfsdf234123AA232AAA'),

kk_kol('232AAA'),

kk_kol('2A3A2'),

kk_kol('AAAA'),

kk_kol('2AA2')

from dual;

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