🗊Презентация Oracle 12с. Курсоры (PL/SQL, лекция 10)

Категория: Информатика
Нажмите для полного просмотра!
Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №1Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №2Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №3Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №4Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №5Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №6Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №7Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №8Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №9Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №10Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №11Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №12Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №13Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №14Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №15Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №16Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №17Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №18Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №19Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №20Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №21Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №22Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №23Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №24Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №25Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №26Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №27Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №28Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №29Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №30Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №31Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №32Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №33Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №34Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №35Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №36Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №37Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №38Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №39Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №40Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №41Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №42Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №43Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №44Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №45Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №46Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №47Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №48Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №49Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №50Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №51Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №52Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №53Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №54Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №55Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №56Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №57Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №58Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №59Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №60Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №61Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №62Oracle 12с. Курсоры (PL/SQL, лекция 10), слайд №63

Содержание

Вы можете ознакомиться и скачать презентацию на тему Oracle 12с. Курсоры (PL/SQL, лекция 10). Доклад-сообщение содержит 63 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





ORACLE 12с
Описание слайда:
ORACLE 12с

Слайд 2





Курсоры
Курсор — объект БД, который позволяет приложениям работать с записями построчно.
Поддерживаются два типа курсоров:
явный — объявляется разработчиком;
неявный — не требует объявления.
Курсор может возвращать одну строку, несколько строк или ни одной строки. 
Для повторного создания результирующего набора для других значений параметров курсор следует закрыть, а затем повторно открыть.
Описание слайда:
Курсоры Курсор — объект БД, который позволяет приложениям работать с записями построчно. Поддерживаются два типа курсоров: явный — объявляется разработчиком; неявный — не требует объявления. Курсор может возвращать одну строку, несколько строк или ни одной строки. Для повторного создания результирующего набора для других значений параметров курсор следует закрыть, а затем повторно открыть.

Слайд 3





Операторы управления явным курсором
DECLARE — выполняет объявление явного курсора.
OPEN — открывает курсор, создавая новый результирующий набор на базе указанного запроса.
FETCH — выполняет последовательное извлечение строк из результирующего набора от начала до конца.
CLOSE — закрывает курсор и освобождает занимаемые им ресурсы.
Описание слайда:
Операторы управления явным курсором DECLARE — выполняет объявление явного курсора. OPEN — открывает курсор, создавая новый результирующий набор на базе указанного запроса. FETCH — выполняет последовательное извлечение строк из результирующего набора от начала до конца. CLOSE — закрывает курсор и освобождает занимаемые им ресурсы.

Слайд 4





Атрибуты курсора
 %ISOPEN — возвращает значение TRUE, если курсор открыт.
 %FOUND — определяет, найдена ли строка, удовлетворяющая условию.
 %NOTFOUND — возвращает TRUE, если строка не найдена.
 %ROWCOUNT — возвращает номер текущей строки.
Описание слайда:
Атрибуты курсора  %ISOPEN — возвращает значение TRUE, если курсор открыт.  %FOUND — определяет, найдена ли строка, удовлетворяющая условию.  %NOTFOUND — возвращает TRUE, если строка не найдена.  %ROWCOUNT — возвращает номер текущей строки.

Слайд 5





Курсоры
Курсор Oracle – указатель на область в PGA, в которой хранится: 
1)строки запроса, 
2)число строк, 
3)указатель на разобранный запрос в общем пуле.  
Открытие курсора – создание контекстной области PGA  – создается моментальный снимок (snapshot) данных запроса.
Описание слайда:
Курсоры Курсор Oracle – указатель на область в PGA, в которой хранится: 1)строки запроса, 2)число строк, 3)указатель на разобранный запрос в общем пуле. Открытие курсора – создание контекстной области PGA – создается моментальный снимок (snapshot) данных запроса.

Слайд 6





Курсоры
PL/SQL позволяет создавать 2 вида курсоров: 
1) Статические курсоры, SQL выражение для которых определяется на этапе компиляции:
Используются для DML команд
Могут быть явно объявлены и именованы
2) Динамические курсоры, SQL выражение для которых определяется на этапе выполнения:
Могут использоваться для любых SQL выражений, включая DDL и DCL команды
Реализуются с помощью оператора EXECUTE IMMEDIATE или пакета dbms_sql
Описание слайда:
Курсоры PL/SQL позволяет создавать 2 вида курсоров: 1) Статические курсоры, SQL выражение для которых определяется на этапе компиляции: Используются для DML команд Могут быть явно объявлены и именованы 2) Динамические курсоры, SQL выражение для которых определяется на этапе выполнения: Могут использоваться для любых SQL выражений, включая DDL и DCL команды Реализуются с помощью оператора EXECUTE IMMEDIATE или пакета dbms_sql

Слайд 7





Неявные курсоры
Неявные курсор – выполнение SQL выражения в секции исполнения или в секции исключений блока
Операторы INSERT, UPDATE, DELETE, MERGE, SELECT INTO 
Не требуют объявления
Не требуют OPEN, FETCH, CLOSE
Описание слайда:
Неявные курсоры Неявные курсор – выполнение SQL выражения в секции исполнения или в секции исключений блока Операторы INSERT, UPDATE, DELETE, MERGE, SELECT INTO Не требуют объявления Не требуют OPEN, FETCH, CLOSE

Слайд 8





Неявные курсоры
Когда неявный курсор не возвращает строк вообще, PL/SQL генерирует исключение NO_DATA_FOUND и передает управление в секцию исключений. 
Когда SELECT возвращает более одной строки, PL/SQL генерирует исключение TOO_MANY_ROWS и также передает управление в секцию исключений. 
SELECT INTO предназначен исключительно для того, чтобы возвращать ровно 1 строку – точную выборку
Описание слайда:
Неявные курсоры Когда неявный курсор не возвращает строк вообще, PL/SQL генерирует исключение NO_DATA_FOUND и передает управление в секцию исключений. Когда SELECT возвращает более одной строки, PL/SQL генерирует исключение TOO_MANY_ROWS и также передает управление в секцию исключений. SELECT INTO предназначен исключительно для того, чтобы возвращать ровно 1 строку – точную выборку

Слайд 9





Неявные курсоры
Описание слайда:
Неявные курсоры

Слайд 10





Неявные курсоры
Описание слайда:
Неявные курсоры

Слайд 11





Неявные курсоры
Описание слайда:
Неявные курсоры

Слайд 12





PRAGMA
Ключевое слово PRAGMA используется для того, чтобы указать директиву компилятору PL/SQL;
PRAGMA instruction;
Не транслируется в исполняемый код;
Разрешается использовать в секции декларации текущего блока;
Описание слайда:
PRAGMA Ключевое слово PRAGMA используется для того, чтобы указать директиву компилятору PL/SQL; PRAGMA instruction; Не транслируется в исполняемый код; Разрешается использовать в секции декларации текущего блока;

Слайд 13





PRAGMA
Описание слайда:
PRAGMA

Слайд 14





Неявные курсоры – исключения
Описание слайда:
Неявные курсоры – исключения

Слайд 15





Неявные курсоры – исключения
Описание слайда:
Неявные курсоры – исключения

Слайд 16





Неявные курсоры – атрибуты курсора
Описание слайда:
Неявные курсоры – атрибуты курсора

Слайд 17





Неявные курсоры
Описание слайда:
Неявные курсоры

Слайд 18





Неявные курсоры – UPDATE
Описание слайда:
Неявные курсоры – UPDATE

Слайд 19





Неявные курсоры – UPDATE
Описание слайда:
Неявные курсоры – UPDATE

Слайд 20





Неявные курсоры –INSERT
Описание слайда:
Неявные курсоры –INSERT

Слайд 21





Неявные курсоры –INSERT
Описание слайда:
Неявные курсоры –INSERT

Слайд 22





Неявные курсоры –INSERT
Описание слайда:
Неявные курсоры –INSERT

Слайд 23





Неявные курсоры – DELETE
Описание слайда:
Неявные курсоры – DELETE

Слайд 24





Неявные курсоры – DELETE
Описание слайда:
Неявные курсоры – DELETE

Слайд 25





Неявные курсоры – RETURNING
RETURNING в выражениях INSERT, UPDATE, DELETE используется для получения данных, измененных соответствующим выражением. 
Позволяет избежать дополнительного SELECT для уточнения результатов.
Описание слайда:
Неявные курсоры – RETURNING RETURNING в выражениях INSERT, UPDATE, DELETE используется для получения данных, измененных соответствующим выражением. Позволяет избежать дополнительного SELECT для уточнения результатов.

Слайд 26





Неявные курсоры – RETURNING
Описание слайда:
Неявные курсоры – RETURNING

Слайд 27





Неявные курсоры – RETURNING
Описание слайда:
Неявные курсоры – RETURNING

Слайд 28





Неявные курсоры – RETURNING
Описание слайда:
Неявные курсоры – RETURNING

Слайд 29





Явные курсоры
Этапы открытия явного курсора:
разбор [parse] 
связывание переменных [bind] 
выполнение [execute] 
построение плана выполнения запроса [determining execution plan]
связывание внешних переменных [associating host variables] и курсорных параметров
определение набора данных
выставление указателя текущей строки на первую строку в результирующем наборе данных
Описание слайда:
Явные курсоры Этапы открытия явного курсора: разбор [parse] связывание переменных [bind] выполнение [execute] построение плана выполнения запроса [determining execution plan] связывание внешних переменных [associating host variables] и курсорных параметров определение набора данных выставление указателя текущей строки на первую строку в результирующем наборе данных

Слайд 30





Явные курсоры
Открытие явного курсора:
OPEN cursor_name [(argument [,argument ...])];
Выборка из явного курсора:
FETCH cursor_name INTO record or variable_list;
Закрытие явного курсора:
CLOSE cursor_name;
Описание слайда:
Явные курсоры Открытие явного курсора: OPEN cursor_name [(argument [,argument ...])]; Выборка из явного курсора: FETCH cursor_name INTO record or variable_list; Закрытие явного курсора: CLOSE cursor_name;

Слайд 31





Курсоры
Описание слайда:
Курсоры

Слайд 32





Явные курсоры
Объявляются явно в секции декларации блока или в спецификации пакета.
Объявления явного курсора:
Курсор без параметров
CURSOR company_cur  IS  SELECT company_id  FROM  company; 
Курсор, который принимает параметры через список
CURSOR company__cur (id_in IN NUMBER) IS 
SELECT name FROM company  WHERE  company_id  = id_in;
Курcор, который содержит выражение RETURN вместо SELECT
CURSOR  company_cur  (id_in IN NUMBER)  RETURN  company%ROWTYPE;
Описание слайда:
Явные курсоры Объявляются явно в секции декларации блока или в спецификации пакета. Объявления явного курсора: Курсор без параметров CURSOR company_cur IS SELECT company_id FROM company; Курсор, который принимает параметры через список CURSOR company__cur (id_in IN NUMBER) IS SELECT name FROM company WHERE company_id = id_in; Курcор, который содержит выражение RETURN вместо SELECT CURSOR company_cur (id_in IN NUMBER) RETURN company%ROWTYPE;

Слайд 33





 
Явные курсоры
Описание слайда:
  Явные курсоры

Слайд 34





Явные курсоры
Описание слайда:
Явные курсоры

Слайд 35





Явные курсоры
Описание слайда:
Явные курсоры

Слайд 36





Явные курсоры
Описание слайда:
Явные курсоры

Слайд 37





Явные курсоры с параметрами
Описание слайда:
Явные курсоры с параметрами

Слайд 38





Явные курсоры с параметрами
Описание слайда:
Явные курсоры с параметрами

Слайд 39





Явные курсоры с RETURN
Описание слайда:
Явные курсоры с RETURN

Слайд 40





Явные курсоры
Описание слайда:
Явные курсоры

Слайд 41





WHERE CURRENT OF
Можно изменять текущую строку курсора FOR UPDATE:
DECLARE
CURSOR wip_cur IS
SELECT acct_no,  enter_date  FROM  wip 
WHERE enter_date < SYSDATE - 7 FOR UPDATE;
BEGIN
FOR wip_rec IN wip_cur 
LOOP
INSERT INTO acct_log (acct_no, order_date) 
VALUES (wip_rec . acct_no, wip__rec . enter_ date); 
DELETE FROM wip
WHERE CURRENT OF wip__cur; 
END LOOP; 
END;
Описание слайда:
WHERE CURRENT OF Можно изменять текущую строку курсора FOR UPDATE: DECLARE CURSOR wip_cur IS SELECT acct_no, enter_date FROM wip WHERE enter_date < SYSDATE - 7 FOR UPDATE; BEGIN FOR wip_rec IN wip_cur LOOP INSERT INTO acct_log (acct_no, order_date) VALUES (wip_rec . acct_no, wip__rec . enter_ date); DELETE FROM wip WHERE CURRENT OF wip__cur; END LOOP; END;

Слайд 42





WHERE CURRENT OF
Описание слайда:
WHERE CURRENT OF

Слайд 43





WHERE CURRENT OF
Описание слайда:
WHERE CURRENT OF

Слайд 44





Использование ROWID
Описание слайда:
Использование ROWID

Слайд 45





Использование ROWID
Описание слайда:
Использование ROWID

Слайд 46





Использование ROWNUM
ROWNUM - логический номер записи в запросе
Описание слайда:
Использование ROWNUM ROWNUM - логический номер записи в запросе

Слайд 47





SELECT FOR UPDATE
FOR UPDATE используется для блокировки строк в результирующем наборе.
Использование FOR UPDATE не требует действительного изменения данных.
Блокировки освобождаются по завершению транзакции. 
Синтаксис:
SELECT ... FROM ... FOR UPDATE [OF column_reference] [NOWAIT];
NOWAIT – не ожидать освобождения других блокировок.
Описание слайда:
SELECT FOR UPDATE FOR UPDATE используется для блокировки строк в результирующем наборе. Использование FOR UPDATE не требует действительного изменения данных. Блокировки освобождаются по завершению транзакции. Синтаксис: SELECT ... FROM ... FOR UPDATE [OF column_reference] [NOWAIT]; NOWAIT – не ожидать освобождения других блокировок.

Слайд 48





SELECT FOR UPDATE
DECLARE
CURSOR hounds_in_stock_cur IS
SELECT pet.stock_no, pet.breeder, dog.size 
FROM dog_breeds dog, inventory pet 
WHERE dog.breed = pet.breed AND dog.class = ‘HOUND’
FOR UPDATE OF pet.stock_no, pet.breeder;
Описание слайда:
SELECT FOR UPDATE DECLARE CURSOR hounds_in_stock_cur IS SELECT pet.stock_no, pet.breeder, dog.size FROM dog_breeds dog, inventory pet WHERE dog.breed = pet.breed AND dog.class = ‘HOUND’ FOR UPDATE OF pet.stock_no, pet.breeder;

Слайд 49





Курсорные переменные 
Курсорные переменные - это структуры данных, которые указывают на курсорный объект.
Используются для:
Передачи курсора в качестве параметра,
Чтобы отложить связь курсора с SELECT-запросом до выполнения команды OPEN
Описание слайда:
Курсорные переменные Курсорные переменные - это структуры данных, которые указывают на курсорный объект. Используются для: Передачи курсора в качестве параметра, Чтобы отложить связь курсора с SELECT-запросом до выполнения команды OPEN

Слайд 50





Курсорные переменные
Описание слайда:
Курсорные переменные

Слайд 51





Курсорные переменные 
Курсорная переменная, объявленная с помощью REF CURSOR без указания RETURN может быть связана с любым запросом. 
Курсорная переменная, объявленная с помощью REF CURSOR с указанием RETURN может быть связана только с запросом, который возвращает результат точно соответствующий числу и типам данных в записи после фразы RETURN во время выполнения.
Описание слайда:
Курсорные переменные Курсорная переменная, объявленная с помощью REF CURSOR без указания RETURN может быть связана с любым запросом. Курсорная переменная, объявленная с помощью REF CURSOR с указанием RETURN может быть связана только с запросом, который возвращает результат точно соответствующий числу и типам данных в записи после фразы RETURN во время выполнения.

Слайд 52





Курсорные переменные
Описание слайда:
Курсорные переменные

Слайд 53





Курсорные переменные
Описание слайда:
Курсорные переменные

Слайд 54





Курсорные переменные
Описание слайда:
Курсорные переменные

Слайд 55





Курсорные подзапросы
Описание слайда:
Курсорные подзапросы

Слайд 56





Динамические курсоры
EXECUTE IMMEDIATE - однострочные запросы и DDL команды, 
OPEN FOR, FETCH и CLOSE - динамические многострочные запросы. 
Синтаксис EXECUTE IMMEDIATE:
EXECUTE IMMEDIATE sql_statement
[INTO {variable [,variable ...] | record}] [USING [IN | OUT | IN OUT] bind_argument
[, [IN | OUT | IN OUT] bind_argument . ..] ] [{RETURNING | RETURN} INTO bind_argument [,bind_argument]...];
Описание слайда:
Динамические курсоры EXECUTE IMMEDIATE - однострочные запросы и DDL команды, OPEN FOR, FETCH и CLOSE - динамические многострочные запросы. Синтаксис EXECUTE IMMEDIATE: EXECUTE IMMEDIATE sql_statement [INTO {variable [,variable ...] | record}] [USING [IN | OUT | IN OUT] bind_argument [, [IN | OUT | IN OUT] bind_argument . ..] ] [{RETURNING | RETURN} INTO bind_argument [,bind_argument]...];

Слайд 57





Динамические курсоры
Описание слайда:
Динамические курсоры

Слайд 58





Динамические курсоры
Описание слайда:
Динамические курсоры

Слайд 59





Динамические курсоры
Для улучшения производительности выполнения SQL выражений можно использовать динамические курсоры со связанными переменными. 
Это позволяет серверу Oracle повторно использовать разобранные SQL выражения из разделяемого пула.
EXECUTE IMMEDIATE ‘INSERT INTO 
dept (deptno, dname, loc) VALUES (:deptno, :dname, :loc)' USING deptno_in, dname_in, loc_in;
Описание слайда:
Динамические курсоры Для улучшения производительности выполнения SQL выражений можно использовать динамические курсоры со связанными переменными. Это позволяет серверу Oracle повторно использовать разобранные SQL выражения из разделяемого пула. EXECUTE IMMEDIATE ‘INSERT INTO dept (deptno, dname, loc) VALUES (:deptno, :dname, :loc)' USING deptno_in, dname_in, loc_in;

Слайд 60





Динамические курсоры - OPEN FOR 
DECLARE
	TYPE cv_typ IS REF CURSOR; 
	CV cv_typ; 
	laccount_no NUMBER; 
	Ibalance NUMBER; 
BEGIN
	OPEN cv FOR
		'SELECT account_no, balance FROM accounts 
			WHERE balance < 500';
	LOOP
		FETCH cv INTO laccount_no, Ibalance; 
		EXIT WHEN cv%NOTFOUND; 
		-- Process the row. 
	END LOOP; 
	CLOSE cv; 
END;
Описание слайда:
Динамические курсоры - OPEN FOR DECLARE TYPE cv_typ IS REF CURSOR; CV cv_typ; laccount_no NUMBER; Ibalance NUMBER; BEGIN OPEN cv FOR 'SELECT account_no, balance FROM accounts WHERE balance < 500'; LOOP FETCH cv INTO laccount_no, Ibalance; EXIT WHEN cv%NOTFOUND; -- Process the row. END LOOP; CLOSE cv; END;

Слайд 61





Параметры Oracle, связанные с курсорами 
cursor_space_for_time = {TRUE|FALSE} – больший объем памяти для курсоров и никогда не освобождается.  Применяется для увеличения скорости работы курсоров при наличии памяти для  разделяемого пула.    
cursor_sharing = {EXACT|SIMILAR|FORCE}
open_cursors  - максимальное количество открытых курсоров. 
session_cached_cursors – максимальное количество кэшируемых  курсоров для сессии.
Описание слайда:
Параметры Oracle, связанные с курсорами cursor_space_for_time = {TRUE|FALSE} – больший объем памяти для курсоров и никогда не освобождается. Применяется для увеличения скорости работы курсоров при наличии памяти для разделяемого пула. cursor_sharing = {EXACT|SIMILAR|FORCE} open_cursors - максимальное количество открытых курсоров. session_cached_cursors – максимальное количество кэшируемых курсоров для сессии.

Слайд 62





Параметры Oracle, связанные с курсорами
Описание слайда:
Параметры Oracle, связанные с курсорами

Слайд 63





Вопросы?
Описание слайда:
Вопросы?



Похожие презентации
Mypresentation.ru
Загрузить презентацию