Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

стандарта языка SQL разработанное фирмой Orcle

Работа добавлена на сайт samzan.net:


МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО ВЫПОЛНЕНИЮ ЛАБОРАТОРНЫХ РАБОТ № 1, 2

по дисциплине “АИС”

Язык PL/SQL

Процедурный язык запросов PL/SQL представляет собой процедурное расширение ANSI-стандарта языка SQL, разработанное фирмой Oracle. В отличие от стандартного язык PL/SQL, как и любой другой процедурный язык третьего поколения (3GL), требует задания пошаговых инструкций по выполнению требуемых действий.

Подобно другим стандартным языкам, PL/SQL имеет языковые элементы для объявления переменных, присвоения значений, проверки условий и ветвления, а также для построения итеративных конструкций. Как С и Pascal язык PL/SQL в значительной степени блочно-ориентирован. Он имеет строгие правила, касающиеся областей видимости переменных, поддерживает параметризованные вызовы. PL/SQL предусматривает строгий контроль типов; ошибки несовместимости типов контролируются на этапах компиляции и выполнения. Выполняются также явное и неявное преобразования типов. В языке поддерживаются определенные пользователем сложные структуры данных. В нем также допустима перегрузка подпрограмм для создания гибкой среды прикладного программирования.

Поскольку язык PL/SQL является процедурной оболочкой языка SQL, он хорошо интегрирован с SQL. Различные возможности языка позволяют ему взаимодействовать с СУБД Oracle, выполняя операции над наборами и отдельными строками таблиц.

Язык PL/SQL имеет элемент Exception Handler (обработчик исключительных ситуаций) для синхронной обработки ошибок и исключительных ситуаций, которые могут возникнуть во время выполнения. Далее будет описано, как использовать обработчики исключительных ситуаций в коде программы.

Язык PL/SQL не является объектно-ориентированным и имеет некоторые общие черты с языками Pascal и Ada, его изучение не будет проблемой для того, кто знает синтаксис языка Pascal. В отличие от С и Pascal, в языке PL/SQL не поддерживаются указатели. Язык PL/SQL является, в первую очередь, средством разработки программ, имеющих дело непосредственно с таблицами и другими объектами баз данных. Взаимодействие с операционной системой и внешними программными компонентами осуществляется через поставляемые пакеты управления базами данных.

Язык PL/SQL является переносимым. Стандартизован для всех серверов фирмы Oracle на различных платформах. Так как его типы данных базируются на типах данных серверов, язык является полностью машинно-независимым.

1. Основные операторы языка.

Создать таблицу можно с помощью оператора CREATE TABLE

CREATE TABLE <имя_таблицы>

({<имя_колонки> <тип_колонки> [DEFAULT <выражение>]})

[TABLESPACE <имя_табличного_пространства>]

[PCTFREE < процент при_заполнении ниже_которого_блок_считается свободным>]

[PCTUSED <процент заполнения блока>]

STARAGE  (INITIAL <размер_начального_экстента>)

 NEXT <размер_следующего_экстента>

 PCTINCREASE <процент_увеличения_таблиц_передающих_экстентов>

 MINEXTENTS <число_экстентов_при_создании>

 MAXEXTENTS <максимальное_число_экстентов>

 FREELISTS <число_списков_свободного_пространства>

PCTFREE - процент свободного пространства. Если свободное пространство занимает меньший процент, чем PCTFREE, то считается, что блок полностью свободен. Оставшееся свободное пространство резервируется для поддержки расширения имеющихся в блоке записей, без изменения их размера. По умолчанию 10 %.

PCTUSED - процент заполнения блока. Если после полного заполнения (нет свободных строк (записей)), блок будет  заполнен менее, чем на PCTUSED, то считается, что блок содержит свободные субблоки, и он (блок) возвращается в список FREELIST. По умолчанию 40 %.

Пример: CREATE TABLE  Grup (id int pkey, name char, kurs char)

Получить выборку информации можно с помощью оператора SELECT

SELECT [ ALL | DISTINCT [ ON ( выражение [. ...] ) ] ] цель [ AS имя ] [. ...] [ FROM источник [. ... ] ]  [ [ NATURAL ] тип_обьединения источник  [ ON условие \ USING ( список_полей ) ] ]

[. ...]

[ WHERE условие ] [ GROUP BY критерий [. ...] ] [ HAVING  условие [. ...] ]  [ { UNION | INTERSECT | EXCEPT } [ ALL ] подзапрос ] [ ORDER BY выражение  [ ASC | DESC | USING оператор ] [. ...] ]

[ FOR UPDATE [ OF таблица [. ...]]] [ LIMIT { число | ALL } [ { OFFSET | . } начало ] ]

В этом описании источник представляет собой имя таблицы или подзапрос. Эти общие формы имеют следующий синтаксис:

FROM { [ ONLY ] таблица [ [ AS ] синоним [ ( синоним_поля [....])]]] ( запрос )

[ AS ] синоним [ ( синоним_поля [. ...] ) ] }

ALL. Необязательное ключевое слово ALL указывает на то, что в выборку включаются все найденные записи.

DISTINCT [ ON ( выражение [, ...] ) ]. Секция DISTINCT определяет поле или выражение, значения которого должны входить в итоговый набор не более одного раза.

цель [ AS имя ] [, ...]. В качестве цели обычно указывается имя поля, хотя цель также может быть константой, идентификатором, функцией или общим выражением. Перечисляемые цели разделяются запятыми, существует возможность присвоения псевдонимов именам целей в секции AS. Звездочка (*) является сокращенным обозначением всех несистемных полей, вместе с ней в списке могут присутствовать и другие цели.

FROM источник [. ... ]. В секции FROM указывается источник, в котором SQL ищет заданные цели. В данном случае источник является именем таблицы или подзапроса. Допускается перечисление нескольких источников, разделенных запятыми (примерный аналог перекрестного запроса). Синтаксис секции FROM подробно описан ниже.

[ NATURAL ] тип_объединения источник [ ON условие \ USING ( список_полей ) ]. Источники FROM могут группироваться в секции JOIN с указанием типа объединения (INNER, FULL, OUTER, CROSS). В зависимости от типа объединения также может потребоваться уточняющее условие или список полей.

WHERE условие. Секция WHERE ограничивает итоговый набор заданными критериями. Условие должно возвращать простое логическое значение (true или false), но оно может состоять из нескольких внутренних условий, объединенных логическими операторами (например, AND или OR).

GROUP BY критерий [, ... ]. Секция GROUP BY обеспечивает группировку записей по заданному критерию. Причем критерий может быть простым именем поля или произвольным выражением, примененным к значениям итогового набора.

HAVING условие [. ... ]. Секция HAVING похожа на секцию WHERE, но условие проверяется на уровне целых групп, а не отдельных записей.

{ UNION | INTERSECT | EXCEPT } [ ALL ] подзапрос. Выполнение одной из трех операций, в которых участвуют два запроса (исходный и дополнительный);

итоговые данные возвращаются в виде набора с обобщенной структурой, из которого удаляются дубликаты записей (если не было задано ключевое слово ALL):

UNION — объединение (записи, присутствующие в любом из двух наборов);

INTERSECT — пересечение (записи, присутствующие одновременно в двух наборах);

EXCEPT — исключение (записи, присутствующие в основном наборе SELECT, но не входящие в дополнительный).

ORDER BY выражение. Сортировка результатов команды SELECT по заданному выражению.

[ ASC | DESC | USING оператор ]. Порядок сортировки, определяемой секцией ORDER BY выражение: по возрастанию (ASC) или по убыванию (DESC). С ключевым словом USING может задаваться оператор, определяющий порядок сортировки (например, < или >).

FOR UPDATE [ OF таблица [. ... ] ]. Возможность монопольной блокировки возвращаемых записей. В транзакционных блоках FOR UPDATE блокирует записи указанной таблицы до завершения транзакции. Заблокированные записи не могут обновляться другими транзакциями.
LIMIT
{ число | ALL }. Ограничение максимального количества возвращаемых записей или возвращение всей выборки (ALL).

{ OFFSET | ,} начало. Точка отсчета записей для секции LIMIT. Например, если в секции LIMIT установлено ограничение в 100 записей, а в секции OFFSET — 50, запрос вернет записи с номерами 50-150 (если в итоговом наборе найдется столько записей).

Ниже описаны компоненты секции FROM.

[ ONLY ] таблица. Имя таблицы, используемой в качестве источника для команды SELECT. Ключевое слово ONLY исключает из запроса записи всех таблиц-потомков.

[ AS ] псевдоним. Источникам FROM могут назначаться необязательные псевдонимы, упрощающие запрос (например, на таблицу books можно ссылаться по псевдониму). Ключевое слово AS является необязательным.

( запрос ) [ AS ] псевдоним. В круглых скобках находится любая синтаксически правильная команда SELECT. Итоговый набор, созданный запросом, используется в качестве источника FROM так, словно выборка производится из статической таблицы. При выборке из подзапроса обязательно должен назначаться псевдоним.

( псевдоним_поля [. ...] ). Псевдонимы могут назначаться не только всему источнику, но и его отдельным полям. Перечисляемые псевдонимы полей разделяются запятыми и группируются в круглых скобках за псевдонимом источника FROM. Псевдонимы перечисляются в порядке следования полей в таблице, к которой они относятся. При выборке информации имя объекта и свойства объекта разделяются точкой.

Например: SELECT name,p.home FROM people p WHERE  id=0

Удаление кортежей может быть произведено командой DELETE

Команда DELETE посылает запрос на удаление записей из таблицы.

Синтаксис:

DELETE [Таблица.*] FROM Таблица WHERE ...;

   Таблица - имя таблицы, из которой удаляются записи.

Использование предложения WHERE аналогично его использованию в команде SELECT.

Аргумент команды DELETE можно не указывать, поскольку он фактически дублируется в предложении FROM.

Пример:

DELETE FROM Buyers WHERE ID=8;

Этот запрос удаляет из таблицы Buyers запись, в которой ID равно 8.

Для удаления не всей записи, а только ее поля, следует воспользоваться запросом на изменение записи (команда UPDATE) и поменять значения нужных полей на Null.

Вставка новых записей осуществляется командой INSERT INTO

Команда INSERT INTO предназначена для добавления одной или нескольких записей в таблицу. Возможны 2 варианта использования этой команды. Первый вариант добавляет одну запись в таблицу, а второй вариант добавляет в таблицу результат выполнения SELECT выражения.

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

INSERT INTO ТаблицаНазначения [(Поля)] VALUES (Значения);

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

INSERT INTO ТаблицаНазначения [(Поля)] [IN БазаДанных] SELECT…;

ТаблицаНазначения - таблица, в которую добавляются записи.

Поля - названия полей.

Таблица - имя таблицы, источника данных.

База данных - путь и имя внешней базы данных, в которой содержатся таблицы. Если таблицы находятся в текущей базе данных, то этот аргумент необязателен.

Значения - значения полей добавляемой записи.

Все поля записи и соответствующие им значения должны быть определены, иначе им будут присвоены значения Null.

Если таблица, в которую добавляются записи, имеет ключевое поле, то в него должны добавляться уникальные, непустые значения. Иначе запись не будет добавлена.

Пример:

INSERT INTO Orders (ID, Name, Email, Order) VALUES (12, 'Вася Пупкин', 'vasya@pupkin.ru', 'Pentium II 450 MHz');

Добавляется новая запись, в которой полям ID, Name, Email, Order соответствуют значения 12, 'Вася Пупкин', 'vasya@pupkin.ru', 'Pentium II 450 MHz'.

INSERT INTO Orders2001 (ID, Name, Email, Order) SELECT ID, Name, Email, Order FROM Orders2000;

Этот запрос добавляет все записи из таблицы Orders2000 в таблицу Orders2001.

2. Основные конструкции языка

2.1.Процедуры

Для создания процедур и триггеров необходимо, чтобы у пользователя были права на создание этих объектов, для этого возможно будет необходимо «дать» эти права.

Пример: execute immediate 'grant create any table to system'; - дали права на создание любой таблице пользователю system.

Создание процедуры

CREATE OR REPLACE PROCEDURE <имя_процедуры> (параметр1  <тип параметра>  <тип данных>, параметр2 <тип параметра> <тип данных> ….)

--тип параметра in – только входной параметр, out - только выходной параметр, inout – и то и другое

as (is)

-- после as(is) описание переменных без DECLARE

begin

тело процедуры

end;

Для вызова процедуры ее имя должно быть помещено в программе  между операторами begin и end.

Чтобы выводить результаты, возможно, будет необходимо подключить пакет  DBMS_OUTPUT.PUT_LINE(значение)

2.2. Стандартные функции работы со строками.

LENGTH(строка) – возвращает длину строки в символах

LOWER(строка) – преобразует все буквы в нижний регистр

UPPER(строка) – преобразует все буквы в верхний регистр

ASCII(символ) – возвращает код символа

CHR(код) – возвращает символ по ascii-коду

INSTR(строка, подстрока[, n[, m]]) – возвращает позицию m-го включения подстроки в строку начиная с позиции n.

CONCAT(строка1, строка2) – возвращает соединенние двух строк (эквивалентно строка1 || строка2)

SUBSTR(строка, m, n) – возвращает подстроку длиной n, начиная с m-позиции

2.3. Курсоры.

Курсор – объект, обеспечивающий операции на уровне строк предложения языка PL/SQL.

Объявление курсора – указатель на область памяти, которая используется при применении курсора.

Курсор может быть любым допустимым предложением SELECT языка PL/SQL. Обычно курсор – основной блок предложений языка PL/SQL.

Они обеспечивают цикличный механизм оперирования данными в базе, при этом возможно обновление данных с помощью FOR UPDATE.

При использовании FOR UPDATE осуществляется блокировка всех строк, участвующих в запросе, она сохраняется до закрытия курсора. Курсор может возвращать: одну строку, массив строк, или пустое значение.

Определение курсора:

CURSOR <имя> IS < оператор SQL>

Пример:DECLARE

CURSOR get_order IS SELECT * FROM orders;

Определение и использование курсоров

2 основных подхода для работы с курсорами:

1. Курсору можно передать параметры. Параметры задаются в момент открытия курсора.

2. Можно определять или не определять тип возвращаемого значения. Возможный тип: указанная запись, строка БД, отдельная переменная.

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

После объявления курсор может быть открыт, строки выбраны, состояние проверено и он может быть закрыт. Курсор может иметь любое имя, рекомендуется использовать префикс get_ или постфиксы _cur, _loop.

В имени курсора рекомендуется использовать имя таблицы или как-то по-другому ссылаться на нее.

Список параметров только принимает значения, но не возвращает их. Входные параметры открытия курсора: вычисляется SQL- код и вычисляется соответствующий набор данных, но строки набора программе не возвращаются. Чтобы получить строки одну за другой используется оператор FETCH: выбранная строка остается текущей, пока не будет выбрана следующая. Выбор строк производится только в прямом направлении.

Пример:

  1.  Выборка всех записей из таблицы.

CURSOR get_order IS SELECT * FROM orders;

  1.  Выборка некоторых столбцов для одного заказа.

CURSOR get_orders_1 (p_ord_num orders.ord_num %TYPE) IS

 SELECT <имена столбцов> FROM orders WHERE ord_num = p_ord_num;

  1.  Получение полной строки для определения номера

CURSOR get_items (p_item_no items.item_no %TYPE) IS SELECT * FROM items  WHERE  item.no=p_item_no; RETUN items % ROWTYPE;

  1.  Выборка строк возвращается значение одного столбца

CURSOR get_items_1 (p_item_no items.item_no %TYPE) RETUN items.item_name % TYPE IS SELECT item_name FROM items WHERE item.no=p_item_no;

Возвращается таблица из одной записи с одним полем

Методы курсора

Метод

Возвращаемое значение

Описание

IS OPEN

True/false

Открыт ли курсор

FOUND

True/false

True, если строка найдена

NOTFOUND

True/false

True, если строка не найдена

ROWCOUNT

NUMBER

Порядковый номер полученной строки (начиная с 1

Пример:

IF orders_cur % FOUND THEN

OPEN items_cur (orders_cur.order_no),

LOOP

 EXIT WHEN items_cur % NOTFOUND;

 <…>

END LOOP;

END IF;

Пример: IF items_cur % ISOPEN THEN CLOSE items_cur;

     END IF;

Циклическая обработка курсоров

Простейший способ использования – циклы FOR. При этом открытие, выборка и закрытие курсора происходит автоматически в области видимости цикла FOR.

Возвращаемая переменная – строка определяется неявно, на нее нельзя сослаться вне области цикла. Курсор может принимать параметры. Допускается объявление курсора в разделе DECLARE или в теле цикла.

Использование неявных курсоров

Предназначены для получения первой строки, если же будут найдены несколько строк, следовательно должна произойти обработка исключений (exception TOO_MANY_ROWS). Если в SELECT организовать чтение в переменную типа столбца, то это будет неявный курсор.

Пример:

DECLARE

get_tables_rec all_tables%ROWTYPE;

local_owner all_tables.owner%TYPE:=”DEMO”;

local_table all_tables.name%TYPE:=”COSTOMER”;

BEGIN

SELECT * INTO get_tables_rec FROM all_tables WHERE owner=local.owner AND name=local.table;

<действия>

END;

При этом, если функция поиска в неявном курсоре возвратит больше одной строки, то будет выдана ошибка. Если необходимо получить одну строку, то эффективнее применять явный курсор.

2.4. Исключительные ситуации.

Исключительная ситуация – событие, не приводящее к возникновению непоправимой ошибки, но прерывающее нормальное выполнение программы и вызывающее безусловный переход на обработку исключительной ситуации текущего блока.

Некоторые исключительные ситуации (ROW_NO_FOUND) являются событиями нормальной обработки. Исключительные ситуации типа VALUE_ERROR – программная ошибка или неожиданное событие.

Если не установлен обработчик исключительной ситуации управление передается блоку верхнего уровня.

Исключительная ситуация поднимается вверх по вложенным блокам, пока не встретит обработчик, иначе передается управление вызывающему контексту (SQL PLUS)

Если ожидаемая исключительная ситуация не включена в список или неизвестна какая исключительная ситуация может возникнуть, либо необходимо обработать все исключительные ситуации, тогда применяют выражение: WHEN OTHERS THEN 

Обработчик исключительных ситуаций будет обрабатывать любую возникнувшую ошибку. Можно применить любую комбинацию имен исключительных ситуаций, указав OTHERS в качестве последней.

Предотвращение зацикливания в обработчике исключительных ситуаций

Иногда внутри обработчика выполняется действие, которое само по себе может вызвать исключительную ситуацию. Может возникнуть бесконечный цикл.

Чтобы предотвратить зацикливание, сам обработчик заключают в блок и устанавливают обработчик для обработчика. Второй обработчик не должен выполнять никаких действий.

EXCEPTION 

 WHEN OTHERS THEN 

BEGIN

if get_cursor%TYPE isopen then close get_cursor;

end if;

EXCEPTION

WHEN OTHERS THEN NULL

END;

END;

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

Пользовательские исключительные ситуации

Если программисту не хватает списка стандартных исключительных ситуаций, то можно определить другие исключительные ситуации, присвоив им имена (это необходимое условие). После этого можно ссылаться на исключительные ситуации, используя их имена.

При определении исключительной ситуации используется специальная конструкция – прагма – это директива компилятора, которая обрабатывается во время компиляции.

Пример: использования директивы

SET SERVEROUTPUT ON

DECLARE

invalid_num_format exception;

PRAGMA exception_init (invalid_num_format, -1481)

num_fmt constant varchar(3):=”aaa”;

x number(10);

BEGIN

dbms.output.enable;

SELECT to_number (‘999’, num, fmt) INTO x FROM dnal;

 EXCEPTION

  WHEN invalid_num_format THEN

dbms_output.put_line (“Вы идиот”);

WHEN OTHERS THEN

 Dbms_output.put_line(“Все равно вы идиот”);

END;

 END;

Обработка исключительных ситуаций внутри программы

Рекомендуется программировать блоки с обработчиками исключительных ситуаций для всех выражений PL/SQL. Это позволит продолжить обработку и выполнение PL/SQL оператора в случае возникновения ошибки. Особо важно это для циклов. Если обработку не предусмотреть, то всякое исключение приведет к немедленному завершению цикла и передаче управления обработчику исключительной ситуации охватывающего блока.

LOOP //

FETCH master_cursor INTO master_rec;

EXIT WHEN master_cursor%NOTFOUND;

BEGIN

 DELETE FROM child_table WHERE

 master_f_key=master_rec.master_p_key;

EXCEPTION WHEN OTHERS THEN

 status:=SQLCODE;

 вывод сообщения об ошибке;

END;

END LOOP;

Лабораторная работа № 1.

«Знакомство с языком PL/SQL. Базовые операции и команды.»

Цель работы: Познакомиться с базовыми командами языка SQL (CREATE TABLE, INSERT INTO, UPDATE, DELETE, SELECT) на примере построения модели университета.

Задание:

Рассматриваемые объекты: факультеты, кафедры, группы, студенты.

Объект «Факультет» содержит следующую информацию:

  •  идентификатор
  •  наименование факультета
  •  декан факультета

Объект «Кафедра» содержит следующую информацию:

  •  идентификатор
  •  наименование кафедры
  •  заведующий кафедрой

Объект «Группа» содержит следующую информацию:

  •  идентификатор
  •  наименование группы
  •  специальность
  •  курс

Объект «Студент» содержит следующую информацию:

  •  ФИО студента(ки)
  •  студенческая группа
  •  номер студенческого билета

Практическая часть

  1.  Провести анализ вышеперечисленных объектов, их свойств и связей согласно теории нормализации. Создать для них таблицы. Заполнить таблицы информацией (5-10 строк).
  2.  Продемонстрировать работу с данными (добавление, изменение, удаление данных).
  3.  Продемонстрировать примеры выбора информации из СУБД по заданию преподавателя (например, показать всех студентов такой-то группы, кафедры, факультета; показать все группы такой-то кафедры, факультета; показать всех студентов такого-то курса и т.п.).

Лабораторная работа № 2

«Знакомство с языком SQL. Управляющие конструкции. Использование курсоров.»

Цель работы: Познакомиться с управляющими конструкциями языка PL/SQL на примере моделирования процессов университета, научится использованию процедур и курсоров.

При выполнении лабораторной работы принять допущение: считаем, что имя введенной новой группы корректно.

Задание:

Рассматриваемые объекты: студенты, учебные курсы, журнал успеваемости.

Таблица «Студенты» содержит следующую информацию:

  •  Код   число
  •  ФИО   строка
  •  Группа  строка

Таблица «Учебные курсы» содержит следующую информацию:

  •  Код   число
  •  Наименование  строка

Таблица «Журнал успеваемости» содержит следующую информацию:

  •  Код студента(ки) число
  •  Код предмета  число
  •  Оценка   число

Практическая часть

  1.  Написать процедуру перевода студента в другую группу.

процедура_перевода (код_студента, новая_группа);

Процедура должна проверять, чтобы группы были одинакового курса, иначе выводить ошибку.

  1.  Написать процедуру перевода всех студентов на следующий курс. При каждом вызове курс группы увеличивается на единицу. Для студентов 5-го курса наименование группы становится пустым.
  2.  Написать процедуру выводящую на экран фамилии задолжников в данной группе, имеющих количество двоек больше заданного. процедура(группа, количество_двоек).

Лабораторные работы оценивается, исходя из следующих параметров:

Общие требования:

  1.  Нормализация таблиц, описание связей.
  2.  Выбранные типы данных для описания свойств объектов и наложенные ограничения для поддержания целостности структуры.
  3.  Качество построенных запросов, процедур, курсоров, обработок исключительных ситуаций.

17




1. варианта Студенты шифр т
2. Ба~ухаус нем
3. Методические рекомендации по подготовке и защите курсовых работ по учебной дисциплине Конституционн
4. Реферат- Современные возможности патогенетического лечения железодефицитной анемии у больных с миомой матки
5. Брейнринг а также определяет некоторые общепринятые термины
6. Экономическая политика Витте
7. . Общая характеристика лизинга основные понятия 1
8. История изобретения транзистора
9. 15 лиц имеющие эту патологию обращаются за медпомощью
10. 2012г
11. Общая характеристика искусства Древней Руси
12. ти труда нынешнего поколения и источником роста фонда потребления и фонда накопления в обществе
13. процессуального закона выразившееся в отсутствии перевода на чеченский язык копии обвинительного заключе
14. Методика искусственной вентиляции легки
15. сбыт употребляется в двух аспектах- в узком смысле ~ продажа в широком ~ целостный процесс доведения товар
16. Тема. Пам~ять. Правила запам~ятовування
17. Вопросы к экзамену по философии
18. Правовые основы судебно-медицинской деятельности в уголовном судопроизводстве
19. бытовая и профессиональная
20. I.. SSLMO 'L KHLEELILLHE W NJEEBEHI SSLMO 'L SFIYYILLHE WBN SFIYYEHI SSLMO 'LL HUSYNIL MZLOOMISH SHHEEDE SLMO 'L SEERIL KOROBTE W QTEELIL 'BRTE LLHUMM INNEE SHHDO NNHU WLIYYOK WBNO