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

Задача. Простой пакет.

Создать пакет с функцией и процедурой из задачи “Процедура с OUT параметрами”.

Пакеты в Oracle создаются для группировки объектов по тематике использования.

Создадим заголовок пакета:

CREATE OR REPLACE PACKAGE KK_PKG1 IS

FUNCTION KK_F(IN_STR IN VARCHAR2, IN_CHAR IN CHAR) RETURN INTEGER;

PROCEDURE KK_P(IN_LASTNAME IN VARCHAR2,

IN_FIRSTNAME IN VARCHAR2,

OUT_NUM_A_IN_LASTNAME OUT INTEGER,

OUT_NUM_B_IN_FIRSTNAME OUT INTEGER);

END KK_PKG1;

Создадим тело пакета:

CREATE OR REPLACE PACKAGE BODY KK_PKG1 IS

FUNCTION KK_F(IN_STR IN VARCHAR2, IN_CHAR IN CHAR) RETURN INTEGER IS

RES INTEGER;

BEGIN

RES := 0;

FOR I IN 1 .. LENGTH(IN_STR) LOOP

IF SUBSTR(IN_STR, I, 1) = IN_CHAR THEN

RES := RES + 1;

END IF;

END LOOP;

RETURN RES;

END KK_F;

PROCEDURE KK_P(IN_LASTNAME IN VARCHAR2,

IN_FIRSTNAME IN VARCHAR2,

OUT_NUM_A_IN_LASTNAME OUT INTEGER,

OUT_NUM_B_IN_FIRSTNAME OUT INTEGER) IS

BEGIN

OUT_NUM_A_IN_LASTNAME := KK_PKG1.KK_F(UPPER(IN_LASTNAME), 'А');

OUT_NUM_B_IN_FIRSTNAME := KK_PKG1.KK_F(UPPER(IN_FIRSTNAME), 'Б');

END KK_P;

END KK_PKG1;

Проверим работу:

declare

n1 integer := 0;

n2 integer := 0;

begin

DBMS_OUTPUT.enable;

KK_PKG1.kk_p('Анатольев', 'Борис', n1, n2);

DBMS_OUTPUT.put_line('Анатольев Борис ' || n1 || ' ' || n2);

KK_PKG1.kk_p('Робин', 'Барабек', n1, n2);

DBMS_OUTPUT.put_line('Робин Барабек ' || n1 || ' ' || n2);

KK_PKG1.kk_p('Атанбаев', 'Ибрагим', n1, n2);

DBMS_OUTPUT.put_line('Атанбаев Ибрагим ' || n1 || ' ' || n2);

end;

Задача. Разные виды Count.

По виртуальной таблице, заданной в подзапросе WITH, выполнить различные виды функции count().

Напишем такой запрос, чтобы продемонстрировать, чем отличаются count(c), count(*), count(1) и count(distinct c):

with cc as

(select null c

from dual

union all

select null c

from dual

union all

select 1 c

from dual

union all

select 1 c

from dual

union all

select 2 c from dual)

select count(c), count(*), count(1), count(distinct c) from cc;

Итак, при явном указании имени поля в count() пустые поля в расчет не принимаются.

Database links.

Для связи между базами используются database link-и:

Создадим database link. Здесь STORAGE - пользователь(схема), 'ora' - база данных, "здесь_пароль_не_скажу_какой" - пароль:

create database link QUORUM_LINK connect to STORAGE identified by "здесь_пароль_не_скажу_какой" using 'ora';

Вот таким образом можно извлекать данные из таблицы на удаленном сервере, доступном через database link:

select * from quorum.pro@quorum_link;

Задача. Получение скрипта заполнения таблицы имеющимися данными.

Получить по таблице с полями типов Number, Varchar2 и Date скрипт, который заполняет ее уже имеющимися в ней данными.

Cоздадим таблицу:

CREATE TABLE KK_TST (ID INTEGER, VAL VARCHAR2(100), DT DATE);

Заполним ее тестовыми строками:

insert into kk_tst(id, val, dt) values(11, 'aaa', to_date('23.01.2012','dd.mm.yyyy'));

insert into kk_tst(id, val, dt) values(23, 'dsk', to_date('21.02.2012','dd.mm.yyyy'));

insert into kk_tst(id, val, dt) values(46, 'u8i', to_date('03.03.2012','dd.mm.yyyy'));

Этот запрос решает задачу:

select 'insert into kk_tst(id, val, dt) values(' || id || ', ''' || val ||

''', ' || 'to_date(''' || to_char(dt, 'dd.mm.yyyy') ||

''', ''dd.mm.yyyy''));' as res

from kk_tst;

Теперь чуть усложним задачу - вставим в таблицу несколько пустых значений NULL:

insert into kk_tst(id, val, dt) values(null, 'dsk', to_date('21.02.2012','dd.mm.yyyy'));

insert into kk_tst(id, val, dt) values(46, null, to_date('03.03.2012','dd.mm.yyyy'));

insert into kk_tst(id, val, dt) values(67, '23d', null);

Этот запрос решает задачу с учетом возможных NULL-значений:

select 'insert into ' || 'kk_tst(id, val, dt) values(' ||

decode(id, null, 'null', id) || ',' ||

decode(val, null, 'null', '''' || val || '''') || ',' ||

decode(dt,

null,

'null',

'to_date(''' || to_char(dt, 'dd.mm.yyyy') ||

''', ''dd.mm.yyyy'')') || ');' as res

from kk_tst;

Подобные запросы полезны, если надо скопировать табличку с данными на другой сервер, к которому нет database link-а.

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