Основы программирования в СУБД Oracle. SQL+PL/SQL.

Текст
4
Отзывы
Читать фрагмент
Отметить прочитанной
Как читать книгу после покупки
Основы программирования в СУБД Oracle. SQL+PL/SQL.
Шрифт:Меньше АаБольше Аа

© О. А. Ткачев, 2020

ISBN 978-5-0051-8673-7

Создано в интеллектуальной издательской системе Ridero

Предисловие

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

Я преподаю дисциплину «Базы данных» в Московском авиационном институте уже почти 30 лет. Начинал в 90-х с использования СУБД dBase III, которая работала под управлением операционной системы DOS.

В начале 2000-х было принято решение использовать в учебном процессе СУБД с архитектурой «клиент – сервер» и уделять больше внимания вопросам программирования.

Выбор осуществлялся между СУБД Microsoft SQL Server и СУБД Oracle. Предпочтение было отдано продукту фирмы Microsoft по следующим причинам:

• Существовала официально бесплатная версия этой СУБД, также в то время мы могли бесплатно использовать в учебном процессе промышленные версии этой программы.

• СУБД Microsoft SQL Server позволяла использовать кириллицу в названиях таблиц и столбцов, и в ней была локализована среда разработки программ Management Studio. В СУБД Oracle в то время использовался режим командной строки, который менее эффективен.

• Имелось много книг на русском языке, в которых рассматривались принципы работы с СУБД Microsoft SQL Server и разработка программ с ее использованием. Здесь я имею в виду SQL и его расширение Transact SQL. Подобной литературы на русском языке для СУБД Oracle практически не было.

Но тем не менее в 2015 году было принято решение перейти на использование в учебном процессе СУБД Oracle. Одной из причин такого перехода стало то, что знание и умение работать с СУБД Oracle на рынке труда оценивается выше. Также к этому времени появилась бесплатная версия Oracle Database Express Edition и стала использоваться визуальная среда разработки программ Oracle SQL Developer.

Но положение с литературой на русском языке, которую можно использовать при изучении СУБД Oracle, существенным образом не изменилось. Особенно это касается изучения PL/SQL.

Правда, здесь нельзя не отметить великолепную книгу «Oracle PL/SQL. Для профессионалов», авторами которой являются Стивен Фейерштейн и Билл Прибыл. Эта книга неоднократно переиздавалась и пользуется всеобщим и заслуженным уважением в среде программистов. Но ее сложно использовать при первоначальном изучении этого языка, так как можно легко «захлебнуться» от обилия содержащейся в ней информации.

Положение с литературой, которую можно использовать для изучения SQL, не столь критично. Во-первых, потому что для этого языка созданы стандарты, которых придерживаются производители СУБД; во-вторых, есть книги на русском языке, в которых рассматривается Oracle-версия SQL. Данные об этих книгах содержатся в списке литературы.

Так что первая причина, по которой я решил написать эту книгу, состоит в том, чтобы в ограниченном объеме рассмотреть синтаксис всех основных элементов SQL и PL/SQL и проиллюстрировать правила их использования интересными и функциональными примерами. Функциональными я называю примеры, которые позволяют понять, при решении каких задач целесообразно использовать рассматриваемый элемент языка.

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

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

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

И если по SQL можно легко найти задачи, предлагаемые для самостоятельного решения, то по PL/SQL я не нашел ни одного источника, который можно было бы использовать в качестве задачника.

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

Надеюсь, что освоение материала, изложенного в этой книге, заложит хорошие основы для дальнейшего изучения СУБД Oracle и ее практического пользования.

Введение

Одним из определяющих факторов успеха в любой сфере деятельности современного общества является наличие эффективных средств хранения и обработки данных. Для решения этой проблемы создаются информационные системы различного назначения. В подавляющем большинстве случаев для хранения информации в этих системах используются базы данных.

Концепция баз данных предполагает применение специального программного обеспечения для создания, манипулирования и управления объектами базы данных. Программное обеспечение, предназначенное для решения этих задач, получило название системы управления базами данных (СУБД).

Создание СУБД является великим изобретением в сфере обработки информации, которое позволило многократно повысить эффективность обработки данных.

Большинство современных СУБД используют реляционную модель данных. Однако известно, что автор реляционной модели, Эдгар Кодд, был недоволен использованием термина «реляционная модель» в названии существующих СУБД, так как считал, что правила хранения и обработки данных в этих СУБД не полностью соответствуют требованиям реляционной модели. Он называл такие СУБД псевдореляционными и считал, что нужно использовать более эффективные, истинно реляционные СУБД.

Но на практике этого не произошло, наоборот, в настоящее время считается общепризнанным факт, что только часть данных, которые необходимо обрабатывать, являются структурированными. Поэтому сейчас разрабатываются – и уже разработаны – СУБД, способные обрабатывать различные виды данных. Однако и в этих СУБД обработка структурированных данных играет важнейшую роль.

К настоящему времени создано и используется значительное количество СУБД. Однако ответить на вопрос, какая СУБД является наилучшей, вряд ли возможно. Для каждой области применения существует своя «оптимальная» СУБД, и выбор является многокритериальной задачей. При выборе СУБД следует в первую очередь учитывать следующие критерии: быстродействие, надежность, стоимость, сложность эксплуатации, наличие эффективных средств разработки приложений.

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

Почти все современные СУБД используют для создания, управления и манипулирования данными язык структурированных запросов – Structured Query Language (SQL). Однако возможности, которые предоставляет SQL, недостаточны для решения ряда сложных задач. Поэтому большинство СУБД используют языковые расширения SQL, которые позволяют использовать средства процедурных языков программирования – переменные, условные операторы, операторы циклов – совместно с операторами SQL

В СУБД Oracle для этого используется процедурный язык программирования PL/SQL. Это сокращение от «Procedural Language extensions to the Structured Query Language», что в переводе с английского языка означает «процедурные языковые расширения для структурированного языка запросов».

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

В процессе работы над книгой была использована Oracle Database 18c Express Edition. Эта версия бесплатна, но обладает широкими функциональными возможностями. Разработка, отладка и выполнение SQL-запросов и программ PL/SQL осуществлялись средствами визуальной среды Oracle SQL Developer версии 19.1.0.

ЧАСТЬ 1. ОПИСАНИЕ ИСПОЛЬЗУЕМОЙ БАЗЫ ДАННЫХ И СРЕДСТВ РАЗРАБОТКИ

Глава 1. Схема базы данных и среда разработки Oracle SQL Developer

Схема базы данных

Схема базы данных представляет собой графическое представление таблиц базы данных и связей, существующих между таблицами. По своему функциональному назначению схема базы данных является чем-то средним между блок-схемой алгоритма и чертежами архитектора. Они часто являются частью технического задания и элементом выходной документации. Поэтому программист, работающий с базой данных, должен понимать условные обозначения, используемые в этих схемах.

В этой книге для создания схемы базы данных использовалась программа Oracle SQL Developer Data Modeler. На рисунке 1.1 показан фрагмент схемы, созданной с помощью этой программы.

 

Рисунок 1.1. Фрагмент схемы базы данных


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

Например, в приведенном фрагменте связь между таблицами Employees и Departments установлена путем определения ограничения внешнего ключа для столбца department_id в таблице Employees. Это означает что значение столбца department_id в таблице Employees должно совпадать с одним из значений одноименного столбца в таблице Departments или иметь значение NULL. За соблюдением этого ограничения будет следить СУБД и не допустит его нарушения. Буква U означает, что для этого столбца установлено ограничение уникальности значения. Это значит, что значение столбца не может повторяться. Символом * отмечены столбцы, которые не могут иметь значения NULL.

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

Основу используемой в этой книге базы данных составляют таблицы демонстрационной базы СУБД Oracle Human Resources (HR). Human Resources – база данных, в которой хранятся данные отдела кадров некоторой компании. На рисунке 1.2 представлены основные таблицы этой базы данных и показаны связи между ними.



Рисунок 1.2. Основные таблицы базы данных Human Resources


Рассмотрим назначение этих таблиц и свойства некоторых столбцов. В таблице Employees содержатся данные о сотрудниках. Каждый сотрудник компании имеет уникальный идентификационный номер (employee_id), идентификационный номер должности (job_id), ставку заработной платы (salary) и менеджера (manager_id). Некоторые сотрудники в дополнение к зарплате получают комиссионные (commission_pct). Размер комиссионных определяется как часть от заработной платы. Столбец job_id используется для установления связи с таблицей Jobs, и для него определено ограничение внешнего ключа. Следствием этого является то, что значение данного столбца должно совпадать с одним из значений столбца job_id в таблице Jobs или иметь неопределенное значение NULL. Это ограничение обеспечивается средствами СУБД. Аналогичными свойствами обладает столбец department_id, который используется для установления связи с таблицей Departments.

В таблице Jobs содержится информация обо всех возможных должностях в организации. Каждая должность имеет уникальный идентификационный номер (job_id), наименование (job_title), минимальную (min_salary) и максимальную ставку заработной платы (max_salary).

Данные об отделах содержатся в таблице Departments. Каждый отдел имеет уникальный код (department_id), руководителя (manager_id), наименование (department_name), а также одно место расположения (location_id). Значение столбца manager_id должно совпадать со значением столбца employee_id в таблице Employees.

Эта компания имеет распределенную структуру, поэтому в таблице Locations хранятся данные о местонахождении отделов, которые состоят из адреса (street_address), почтового индекса (postal_code), названия города (city), названия штата (state_province) и кода страны (country_id). В таблице Locations также содержатся данные о населенных пунктах, в которых пока нет отделов.

Для того чтобы расширить спектр рассматриваемых задач, к уже рассмотренным таблицам были добавлены таблицы: Products, Orders, Customers Эти таблицы используются во многих демонстрационных базах. После добавления этих таблиц была получена схема базы данных HR_POC, используемая в этой книге, рисунок 1.3. Неиспользуемые таблицы были удалены. Ссылка для скачивания этой схемы: HR_POC (https://yadi.sk/d/_cFzi0CMazFIdg).

При решении некоторых задач, рассматриваемых в этой книге, в базу данных были добавлены вспомогательные таблицы. Ссылка для скачивания схемы, которая содержит вспомогательные таблицы:HR_POC_T (https://yadi.sk/d/a3XxApDuj2Ksxw).



Рисунок 1.3. Схема базы данных HR_POC


Разберем назначение некоторых столбцов в таблицах Products, Orders, Customers и сформулируем бизнес-правила, которые могут быть определены с их использованием.

Столбец status в таблице Orders определяет состояние заказа и может принимать следующие значения: Pending – «в ожидании», Shipped – «отправлен», Canceled – «отменен». Используя этот столбец, сформулируем следующее бизнес-правило: можно изменить содержимое заказа, который находится в состоянии Pending, но нельзя изменить содержимое заказа, который находится в состоянии Shipped

Столбец credit_limit в таблице Customers содержит значение кредитного лимита клиента. Используя этот столбец можно сформулировать следующее правило: запретить оформление заказа, если общая сумма заказов клиента, находящихся в состоянии Pending, превышает его кредитный лимит. В этих таблицах отсутствуют данные об оплате заказов, поэтому будем считать, что заказы, находящиеся в состоянии Shipped, оплачены, а заказы, находящиеся в состоянии Pending, – нет.

Столбец price в таблице Products содержит текущую цену товара, а столбец unit_price в таблице Order_Items – цену, по которой он был продан. Разница между этими значениями может возникать из-за того, что клиенту предоставлена скидка. Также со временем значение price может измениться, а значение unit_price – нет.

В таблицу Employees был добавлен столбец rating_e. Значение элементов этого столбца целочисленные и должны лежать в диапазоне от 1 до 5. Будем считать, что значение столбца rating_e отражает квалификацию сотрудника.

В таблице Products содержится столбец rating_p. Значения элементов этого столбца также должны лежать в диапазоне от 1 до 5 и отражают сложность товара.

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

Oracle SQL Developer

Oracle SQL Developer – это визуальная среда для создания, отладки и выполнения SQL-запросов и программ PL/SQL. Oracle SQL Developer позволяет создавать и редактировать объекты базы данных, управлять ими, импортировать и экспортировать данные, а также создавать всевозможные отчеты.

После запуска Oracle SQL Developer на экране появляется главное окно, представленное на рисунке 1.4.

Окно SQL Developer содержит три основные области:

– область Connections («Соединения») предназначена для создания соединений с базой данных;

– область Worksheet («Рабочее пространство») используется для ввода, редактирования и запуска запросов SQL и программ PL/SQL;

– область Reports («Отчеты») позволяет запускать предварительно определенные отчеты или создавать и добавлять собственные отчеты.



Рисунок 1.4. Главное окно Oracle SQL Developer


Для того чтобы приступить к работе с базой данных, необходимо создать соединение с ней. При запуске SQL Developer в области Connections отображаются все доступные соединения. Установить соединение можно только с существующей базой данных (схемой). Изначально после установки СУБД существует только схема администратора базы данных – system. Остальные схемы создает администратор. Имя схемы совпадает с именем пользователя. Команды создания пользователей и предоставления им привилегий будут рассмотрены позже.

Для создания нового соединения следует нажать кнопку New Connections, которая расположена на панели инструментов в области Connections. На экране появится диалоговое окно для создания подключений к базе данных (рисунок 1.5).

Имя соединения (Name) может быть произвольным, а имя пользователя и пароль должны быть предварительно заданы администратором. Имя пользователя должно начинаться с символов c##. Для одного пользователя (схемы базы данных) можно создать несколько соединений. При входе по любому из этих соединений вы будете работать с одной и той же базой данных. Значения Hostname и SID или Servce_name следует взять из файла tnsnames. ora в папке c:\app\user\product\18.0.0\dbhomexe\network\admin.



Рисунок 1.5. Окно для создания подключений к базе данных


После ввода всех параметров рекомендуется сначала нажать кнопку Test. Если проверка пройдет успешно, то в строке Status появится сообщение Success. В противном случае будет выведено сообщение об ошибке. Если ошибок не будет обнаружено, то следует нажать кнопку Connect и приступить к работе с базой данных.

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

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

Рассмотрим основные операции, которые можно выполнить, используя Oracle SQL Developer. Разберем случай, когда база данных уже создана, созданы таблицы и они заполнены данными. Нажав кнопку + рядом с именем соединения мы увидим объекты базы данных, для которой создано это соединение.

Самыми важными объектами базы данных являются таблицы. Для того чтобы увидеть список таблиц, существующих в базе данных, и получить возможность выполнять с таблицами различные действия, следует нажать кнопку + рядом с узлом Tables. Если после этого сделать двойной щелчок на имени таблицы, то в рабочей области появится окно, которое содержит несколько вкладок. Используя эти вкладки, можно просматривать данные о таблице и вносить в нее изменения.

На рисунке 1.6 показана вкладка Columns, в которой отображены столбцы таблицы Customers. Операции, которые вы можете выполнить с таблицей, содержатся в раскрывающемся списке Actions (рисунок 1.7).



Рисунок 1.6. Вкладка Columns



Рисунок 1.7. Раскрывающийся список Actions


На вкладке Data (рисунок 1.9), где отображается содержимое таблицы, можно просматривать и редактировать данные, содержащиеся в таблице.



Рисунок 1.9. Вкладка Data


На вкладке Model (рисунок 1.10) в графическом виде отображаются структура таблицы и ее связи с другими таблицами.



Рисунок 1.10. Вкладка Model


Использование рабочей области (SQL Worksheet)


При установлении соединения с базой данных автоматически открывается окно рабочей области (SQL Worksheet) для этого соединения. Это окно можно использовать для ввода, редактирования и выполнения операторов SQL и программ PL/SQL.

Для одного соединения можно создать несколько рабочих областей. Новую рабочую область можно создать, используя кнопку SQL Worksheet на панели инструментов или комбинацию клавиш Alt—F10. При создании новой рабочей области нужно выбрать соединение, для которого она будет использована. Рабочая область имеет собственную панель инструментов (рисунок 1.11).



Рисунок 1.11. Панель инструментов SQL Worksheet


Эта панель содержит значки, предназначенные для решения следующих задач:

– Run Statement: выполняет оператор, в котором находится курсор «переменные».

 

– Run Script: выполняет все операторы в рабочей области.

– Explain Plan: создает план выполнения. План выполнения – это последовательность операций, которые будут выполнены при выполнении оператора. План выполнения показывает исходное дерево строк с иерархией операций, составляющих оператор.

– Autotrace: генерирует информацию трассировки для оператора. Эта информация может помочь определить операторы SQL, которые выиграют от настройки.

– SQL Tuning Advisory: анализирует объемные операторы SQL и предлагает рекомендации по настройке.

– Commit: записывает любые изменения в базу данных и завершает транзакцию.

– Rollback: отменяет любые изменения в базе данных, не записывая их в базу данных, и завершает транзакцию.

– Unshared SQL Worksheet: создает новую рабочую область для соединения.

– To Upper / Lower / InitCap: изменяет выделенный текст на прописные, строчные или initcap соответственно.

– Clear: стирает оператор или операторы в поле «Ввести оператор SQL».

– SQL History: отображает диалоговое окно с информацией о выполненных операторах SQL.


Для выполнения оператора SQL, размещенного в рабочей обрасти, следует нажать кнопку Run Statement на панели инструментов, или функциональную клавишу F9. На рисунке 1.12 показан пример выполнения оператора SQL.

Если рабочая область содержит несколько операторов SQL или PL/SQL, то их можно выполнить, нажав кнопку Run Script на панели инструментов или функциональную клавишу F5. На рисунке 1.13 показан пример выполнения нескольких операторов SQL. Следует обратить внимание на то, что вешний вид результатов при использовании кнопки Run Script отличается от внешнего вида результатов при использовании кнопки Run Statement.

Примечание: кнопка Run Script обычно используется для запуска операторов PL/SQL.



Рисунок 1.12. Пример выполнения одного оператора SQL



Рисунок 1.13. Пример выполнения нескольких операторов SQL


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


Если для запуска оператора SQL использовалась кнопка Run Statement, то результаты выполнения запроса можно сохранить в определенном формате для дальнейшего использования и обработки. Для того чтобы выполнить эту операцию, нужно щелкнуть правой кнопкой и в появившемся контекстном меню (рисунок 1.14) выбрать команду Export.

В результате этих действий будет запушен мастер экспорта. В первом окне (рисунок 1.15) нужно выбрать формат, месторасположение и имя файла. На рисунке 1.16 показано содержимое файла export. xls, который содержит результат выполнения запроса.



Рисунок.1.14. Выбор команды Export



Рисунок 1.15. Выбор формата, месторасположения и имени файла



Рисунок 1.16. Результат экспорта – файл в формате xls


Сохранение операторов SQL


Для того чтобы сохранить операторы SQL в текстовом файле, следует нажать кнопку Save на панели инструментов или выбрать команду меню File – Save. На экране появится диалоговое окно Save (рисунок 1.17), в котором можно выбрать место сохранения и ввести имя файла.



Рисунок 1.17. Диалоговое окно Save


Выполнить сохраненные операторы SQL можно двумя способами:


Первый способ. Используя команду меню File – Open, открыть сохраненный файл, содержащий операторы SQL, и выполнить эти операторы кнопками Run Statement или Run Script (рисунок 1.18.



Рисунок 1.18. Первый способ выполнения операторов SQL


Второй способ. В рабочую область ввести команду, которая начинается с символа @ и содержит путь к файлу, и выполнить эту команду, используя кнопку Run Script. На рисунке 1.19 показан пример применения этого способа выполнения сохраненных операторов SQL.



Рисунок 1.19. Второй способ выполнения операторов SQL


Экспорт базы данных


Используя Oracle SQL Developer, можно осуществить экспорт базы данных в файл, который будет содержать DDL-операторы создания таблиц и существующих ограничений и операторы INSERT для заполнения таблиц данными. Этот способ позволяет легко копировать небольшие базы данных с одного компьютера на другой.

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

Для осуществления экспорта нужно выбрать команду Tools —Database Export. В результате на экране появится окно (рисунок 1.20), в котором нужно выбрать экспортируемую схему, имя и расположение файла, куда будут экспортироваться данные. Рекомендуется снять флажок Show Schema. Если этого не сделать, то все операторы будут содержать имя экспортируемой схемы, что усложнит процесс копирования. На компьютере, куда копируется база, нужно будет обязательно создать схему, имя которой должно совпадать с именем копируемой схемы.



Рисунок 1.20. Окно экспорта


Полученный в результате экспорта файл можно использовать для графического отображения таблиц базы данных и связей между ними. Для этого данный файл нужно импортировать в программу Oracle SQL Developer Data Modeler. Так были получены схемы баз данных, которые рассматривались в предыдущем разделе.

Можно настроить многие параметры SQL Developer в соответствии со своими предпочтениями и потребностями. Для этого нужно выбрать в меню Tools команду Preferences. В качестве примера рассмотрим настройки параметров Database: NLS (рисунок 1.21).

Здесь указываются значения для параметров поддержки глобализации, такие как язык, территория, предпочтения сортировки и формат даты. Эти значения параметров используются для операций сеанса SQL Developer. Указанные на этой панели настройки не влияют на настройки СУБД. Чтобы изменить настройки СУБД, необходимо изменить соответствующие параметры, используя специальные команды, и перезапустить базу данных.



Рисунок 1.21. Настройка параметров Database: NLS

Купите 3 книги одновременно и выберите четвёртую в подарок!

Чтобы воспользоваться акцией, добавьте нужные книги в корзину. Сделать это можно на странице каждой книги, либо в общем списке:

  1. Нажмите на многоточие
    рядом с книгой
  2. Выберите пункт
    «Добавить в корзину»