Разработка c помощью Apache Derby -- тройной выигрыш: Разработка баз данных при помощи Apache Derby, Часть 3

Выполнение сценариев и вставка данных

Научитесь создавать самодокументируемый командный файл SQL, который может выполняться неограниченное количество раз, путем размещения команд SQL вместе с полезными комментариями в текстовом файле. Затем будут кратко рассмотрены принципы вставки данных в таблицу при помощи предложения SQL INSERT; приводятся примеры вставки десяти новых записей разными способами.

Роберт Бруннер , ученый-исследователь NCSA, старший преподаватель астрономии, Университет штата Иллинойс, г. Урбана-Шампейн

Роберт Дж.  Бруннер (Robert J. Brunner)Роберт Дж. Бруннер (Robert J. Brunner) занимается научными исследованиями в Национальном центре по приложениям для суперкомпьютеров и является старшим преподавателем астрономии в университете штата Иллинойс, город Урбана-Шампейн. Автор нескольких книг и множества статей и практических руководств на различные темы.



12.05.2006

Сценарии SQL

В предыдущей статье этого цикла, "Database development with Apache Derby, Part 2: Schemas" (Разработка баз данных при помощи Apache Derby, часть 2 (сайт developerWorks, апрель 2006 г.), рассматривалось выполнение команд SQL прямо из командной строки инструмента ij. При помощи инструмента ij можно поэкспериментировать с различными командами SQL или Derby. Тем не менее, довольно часто требуется выполнить составные, сложные команды. Чтобы упростить отладку набора сложных команд SQL, как правило, проще сохранить их в текстовый файл, а затем запустить на выполнение сразу все команды из этого файла. Эта операция называется выполнение сценария SQL, и ее совсем несложно использовать в среде Apache Derby. Сохраняя команды SQL в файле сценария, вы получаете дополнительное преимущество - возможность выполнять эти команды столько раз, сколько потребуется.

Работать с файлами сценария совсем не сложно, что демонстрирует первый из примеров сценария Derby SQL в листинге 1.

Листинг 1. Пример 1. Файл сценария Derby SQL
-- Ignore the database not created warning if present
connect 'jdbc:derby:test;create=true' ;

-- First delete the tables if they exist. 
-- Ignore the table does not exist error if present
DROP TABLE bigdog.products ;
DROP TABLE bigdog.vendors ;

-- CREATE the products table for bigdog's Surf Shop
CREATE TABLE bigdog.products (
itemNumber INT NOT NULL,
price DECIMAL(5, 2),
stockDate DATE,
description VARCHAR(128)
) ;

-- CREATE the products table for bigdog's Surf Shop
CREATE TABLE bigdog.vendors (
itemNumber INT NOT NULL,
vendornumber INT NOT NULL,
vendorName CHAR(64)
) ;

exit ;

Сценарий, представленный в листинге 1 повторно создает схему bigdog и две таблицы (products и vendors), о которых шла речь в предыдущей статье данного цикла. Если вам что-либо непонятно, перейдите по ссылке и ознакомьтесь с предыдущей статьей, и только после этого вернитесь к этой. Поскольку в нашей статье мы изучаем принципы вставки данных в таблицу, сначала необходимо создать такие таблицы.

Редактирование сценариев Derby SQL

Файл сценария - это обычный текстовый файл, содержащий комбинацию команд SQL и Apache Derby, которые можно выполнить прямо в окне инструмента Apache Derby ij. Файлы сценария упрощают разработку и поддержку баз данных Apache Derby и предоставляют возможность использовать такую технику создания баз данных, как самодокументирование. Эти файлы следует сохранять в виде текстовых файлов ASCII, а не в формате RTF (или в любом другом формате), чтобы избежать ошибок перекодировки. Некоторые текстовые процессоры (например, Wordpad, входящий в состав операционной системы Microsoft® Windows),® могут по умолчанию сохранить ваш файл в формате RTF. Не допускайте этого, так как в противном случае у вас могут возникнуть проблемы с выполнением файла сценария.

Вместо того, чтобы вводить команды создания таблиц непосредственно в командной строке инструмента Derby ij, вы можете сохранить их в текстовом файле, при этом инструмент ij запустит команды прямо из файла. К статье прилагается файл .zip (см. раздел Download ), в котором находятся два файла сценария; один из них, derby.create.sql, показан в листинге 1. При чтении описания строк файла сценария можно работать с кодом в листинге 1 либо открыть файл сценария в текстовом редакторе, к которому вы привыкли.

В файле сценария несколько строк начинаются с двух тире(--). Эти строки представляют собой комментарии SQL; их необходимо использовать для описания основной задачи каждого компонента файла сценария. Первая команда в файле сценария - это команда Derby connect, представляющая собой инструкцию для инструмента ij установить соединение с базой данных test и создать базу данных, если это необходимо. Далее следуют команды SQL, представляющие собой предложения DROP, которые удаляют таблицы products и vendors из схемы bigdog. Если такие таблицы не существуют (что возможно, если база данных была только что создана), то отображается сообщение об ошибке, но, как показывают предшествующие комментарии SQL, на такие сообщения можно просто не обращать внимания.

Если таблицы существуют, то их следует сначала удалить, чтобы можно было создать новые таблицы с таким описанием столбцов, которое вам необходимо. Следующие два предложения SQL как раз и создают таблицы products и vendors в схеме bigdog. Сценарий завершается командой exit , которая разрывает соединение с базой данных и позволяет красиво покинуть инструмент ij. Далее мы научимся выполнять файл сценария Derby.

Выполнение сценария в ij

Файл сценария полезен только в том случае, если вы можете использовать его для выполнения содержащихся в нем команд. Самый простой способ выполнить команды в файле сценария SQL - это запустить файл сценария через интерфейс инструмента ij. Однако перед этим необходимо создать каталог test и распаковать в этот каталог файл derby4.zip file, который можно загрузить вместе с этой статьей (см. раздел Download). Этот процесс показан в листинге 2.

Листинг 2. Запуск сценария SQL через ij
rb$ mkdir test
rb$ cp derby4.zip test/
rb$ cd test/
rb$ unzip derby4.zip 
Archive:  derby4.zip
  inflating: derby.create.sql       
  inflating: derby.insert.sql             
rb$ ls
derby.create.sql      derby.insert.sql      derby4.zip
rb$ java org.apache.derby.tools.ij             
ij version 10.1
ij> run 'derby.create.sql' ;
ij> -- Ignore the database not created warning if present
connect 'jdbc:derby:test;create=true' ;
ij> -- First delete the tables if they exist. 
-- Ignore the table does not exist error if present
DROP TABLE bigdog.products ;
ERROR 42Y07: Schema 'BIGDOG' does not exist
ij> DROP TABLE bigdog.vendors ;
ERROR 42Y07: Schema 'BIGDOG' does not exist
ij> -- CREATE the products table for Bigdog's Surf Shop
CREATE TABLE bigdog.products (
itemNumber INT NOT NULL,
price DECIMAL(5, 2),
stockDate DATE,
description VARCHAR(128)
) ;
0 rows inserted/updated/deleted
ij> -- CREATE the products table for Bigdog's Surf Shop
CREATE TABLE bigdog.vendors (
itemNumber INT NOT NULL,
vendornumber INT NOT NULL,
vendorName CHAR(64)
) ;
0 rows inserted/updated/deleted
ij> exit ;

Хотя может сложиться впечатление, что листинг 2 слишком сложный для кода выполнения сценария Derby, сам процесс не отличается сложностью. Для данного примера предполагается, что открыт терминал (или окно процесса Command Winows -- обратите внимание на то, что некоторые шаги в этом примере предназначены для UNIX),® и каталог, в котором был сохранен файл derby4.zip, содержащий два файла сценария, прилагающиеся к этой статье. Чтобы уменьшить вероятность возникновения ошибки, следует создать новый каталог, скопировать в этот каталог файл derby4.zip, а затем перейти в этот новый каталог. После этого распакуйте файл примера. Как показывает листинг, в новом каталоге теперь находятся три файла: derby4.zip, derby.create.sql, и derby.insert.sql. Сейчас мы будем работать только с файлом сценария create; сценарий insert будет рассмотрен в конце данной статьи.

Что делать, если что-то не получается?

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

  • Убедитесь, что инструмент ij запущен и работает. Если это не так, возможно, у вас проблемы с переменной CLASSPATH этого инструмента;
  • Убедитесь, что на диске достаточно места для создания новой базы данных;
  • Убедитесь, что обладаете необходимыми правами (на чтение файла сценария и на создание новой базы данных) для того каталога, из которого должен выполняться файл сценария;
  • Убедитесь, что файл сценария представляет собой текстовый файл ASCII.

В случае других ошибок обращайтесь к документации Derby, которая находится в свободном доступе на Web-сайте Apache Derby (см. ссылку в разделе Ресурсы ), или задайте вопрос в списке рассылки Derby.

Остальной код в листинге 2 демонстрирует выполнение файла сценария derby.create.sql через инструмент Derby ij. Сначала запускаем инструмент ij. Если при запуске возникают проблемы, можно попробовать проверить правильность установки Derby, как описано в первой статье данного цикла. После появления приглашения ij> можно приступать к выполнению соответствующего файла сценария. Это делается при помощи команды run, принимающей единственный аргумент: имя файла сценария, которое заключается в простые кавычки.

В процессе выполнения сценария можно наблюдать появление новых приглашений ij> , команд, сообщений об ошибках и предупреждений. Такой вывод может показаться неудобным, но команда run выполняет файл сценария так, как если бы вы набирали команды прямо в окне инструмента ij. В конце обрабатывается команда exit, и сценарий завершается; одновременно закрывается окно инструмента ij. Если вывод вашего первого файла сценария соответствует коду, показанному в листинге 2, поздравляем: теперь у вас есть новая база данных test с двумя новыми таблицами, в которых можно хранить данные.

Хотя методика выполнения сценария через инструмент ij может быть эффективной, иногда проще применить дополнительную автоматизацию. В следующем разделе рассматривается, как можно выполнить файл сценария Derby непосредственно из командной строки.

Запуск сценария из командной строки

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

Листинг 3. Запуск сценария SQL из командной строки
rb$ java org.apache.derby.tools.ij derby.create.sql
ij version 10.1
ij> -- Ignore the database not created warning if present
connect 'jdbc:derby:test;create=true' ;
WARNING 01J01: Database 'test' not created, 
connection made to existing database instead.
ij> -- First delete the tables if they exist. 
-- Ignore the table does not exist error if present
DROP TABLE bigdog.products ;
0 rows inserted/updated/deleted
ij> DROP TABLE bigdog.vendors ;
0 rows inserted/updated/deleted
ij> -- CREATE the products table for Bigdog's Surf Shop
CREATE TABLE bigdog.products (
itemNumber INT NOT NULL,
price DECIMAL(5, 2),
stockDate DATE,
description VARCHAR(128)
) ;
0 rows inserted/updated/deleted
ij> -- CREATE the products table for Bigdog's Surf Shop
CREATE TABLE bigdog.vendors (
itemNumber INT NOT NULL,
vendornumber INT NOT NULL,
vendorName CHAR(64)
) ;
0 rows inserted/updated/deleted
ij> exit ;

В листинге 3 демонстрируется первый способ выполнения файла сценария прямо из командной строки. В этом случае имя файла сценария указывается в качестве аргумента командной строки инструмента ij. Строки файла сценария читаются, как и в предыдущем варианте, и обрабатываются последовательно. Если вы сначала выполнили сценарий derby.create.sql через интерфейс инструмента ij, а теперь выполняете тот же файл сценария в том же каталоге из командной строки, то вы должны наблюдать вывод, аналогичный приведенному в листинге 3 (все строки кода после первой строки). Как показано в листинге, вы получаете предупреждающее сообщение о том, что база данных test не была создана, поскольку уже существовала ранее. Однако вы не получаете сообщение об ошибке, уведомляющее о том, что две таблицы не могут быть удалены, так как вы уже создали их (как показано в листинге 2). После удаления таблиц products и vendors вы повторно создаете их, и выполнение сценария завершается.

Существует еще один способ запуска сценария Derby: перенаправление потока стандартного ввода инструмента ij на чтение из файла сценария. В UNIX-подобных операционных системах это легче всего осуществить при помощи символа перенаправления STDIN, соответствующего данной оболочке, например, знак "меньше" (<) для оболочки Bash. Этот способ, который показан в листинге 4, имеет преимущество, заключающееся в уменьшении объема вывода на экран.

Листинг 4. Запуск сценария SQL из командной строки (часть 2)
rb$ java org.apache.derby.tools.ij < derby.create.sql
ij version 10.1
ij> WARNING 01J01: Database 'test' not created, 
connection made to existing database instead.
ij> 0 rows inserted/updated/deleted
ij> 0 rows inserted/updated/deleted
ij> 0 rows inserted/updated/deleted
ij> 0 rows inserted/updated/deleted
ij>
rb$

Как видно из листинга 4, если сценарий выполняется путем перенаправления стандартного потока ввода инструмента ij , то в вывод включаются только сообщения инструмента ij, в том числе информационные сообщения, например, 0 rows inserted/updated/deleted, а также предупреждения или сообщения об ошибках. Если вы хотите избавиться от таких сообщений, можно перенаправить стандартный поток вывода и стандартный поток сообщений об ошибках инструмента ij. Например, если вы работаете в среде Bash, можно использовать следующую строку:

java org.apache.derby.tools.ij < derby.create.sql > derby.create.out 2> derby.create.err

Этот код выполняет файл сценария derby.create.sql script file, сохраняет выводимые сообщения в файл derby.create.out, а все сообщения об ошибках ij в файл derby.create.err.

Теперь перейдем к рассмотрению процесса вставки данных в таблицу при помощи Apache Derby. Для продолжения необходима база данных Derby с таблицей products. Если это еще не было сделано, необходимо выполнить файл сценария derby.create.sql.


Вставка данных в Apache Derby

Одна из наиболее важных задач при создании приложения базы данных - это вставка данных в базу данных. Не имеет значения, насколько хорошо программное обеспечение базы данных, если вы некорректно введете данные в базу данных, все остальное уже неважно. Существует несколько разных способов вставки данных, но далее в нашей статье мы рассмотрим вставку данных в базу Apache Derby при помощи предложения SQL INSERT.

Предложение SQL INSERT

Чтобы вставить данные в базу данных Apache Derby при помощи предложения SQL INSERT, вам необходимо знать, как правильно пользоваться этим предложением. В листинге 5 приводится синтаксис предложения SQL INSERT в Apache Derby.

Листинг 5. Синтаксис SQL INSERT
INSERT INTO table-Name
    [ (Simple-column-Name [ , Simple-column-Name]* ) ]
	  Expression

Этот синтаксис должен показаться вам знакомым. Как говорилось в предыдущей статье данного цикла, в квадратные скобки ([]) заключаются дополнительные параметры. Единственный компонент, задача которого не становится ясной сразу, это Expression; но насколько сложной может быть эта простая фраза? Безусловно, внешний вид может быть обманчивым, термин Expression можно расширить до одной из четырех структур:

  • Однострочный список VALUES;
  • Многострочный список VALUES;
  • Выражение SELECT;
  • Выражение UNION.

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

Порядок столбцов добавляемых в таблицу значений можно задать при помощи дополнительной части выражения SQL INSERT. По умолчанию данные вставляются в столбцы таблицы в том же порядке, в котором столбцы были перечислены при создании таблицы. Иногда у вас может возникнуть желание изменить этот порядок или просто задать значения для столбцов, которые имеют ограничение NOT NULL. Явно перечисляя столбцы в предложении SQL INSERT , вы получите больше контроля над операцией и сможете проще обрабатывать эти конкретные случаи использования выражения.

Синтаксис выражения SQL VALUES достаточно прост, как показано в листинге 6.

Листинг 6. Синтаксис SQL VALUES
{
    VALUES ( Value {, Value }* )
        [ , ( Value {, Value }* ) ]* |
    VALUES Value [ , Value ]*
 }

В этом описании синтаксиса сначала показан многострочный, а затем однострочный формат (запомните, что символ вертикальной черты, |, означает или, а символ звездочки, *, означает один или больше). Термин value заменяется значением, которое вы хотите вставить в заданный столбец. Чтобы вставить данные в несколько столбцов, вам следует данные для каждой записи заключить в круглые скобки, разделяя отдельные записи запятыми.

Следующие два примера демонстрируют реализацию данного синтаксиса.

Вставка данных при помощи SQL

Как показано в листинге 7, чтобы вставить данные в таблицу, сначала необходимо запустить инструмент ij и установить соединение с базой данных. Вспомните: для того, чтобы в таблицу можно было вставить данные, таблица должна существовать. Если вы до сих пор этого не сделали, запустите сценарий создания таблицы, как описано выше в этой статье.

Листинг 7. Вставка отдельных записей
rb$ java org.apache.derby.tools.ij           
ij version 10.1
ij> connect 'jdbc:derby:test' ;
ij> INSERT INTO bigdog.products 
    VALUES(1, 19.95, '2006-03-31', 'Hooded sweatshirt') ;
1 row inserted/updated/deleted
ij> INSERT INTO bigdog.products
(itemNumber, price, stockDate, description) 
    VALUES(2, 99.99, '2006-03-29', 'Beach umbrella') ;
1 row inserted/updated/deleted
ij> INSERT INTO bigdog.products
(itemNumber, price, stockDate) 
    VALUES(3, 0.99, '2006-02-28') ;
1 row inserted/updated/deleted
ij> exit ;

Этот пример представляет три однострочных вставки в таблицу bigdog.products. Первое предложение SQL INSERT не задает список столбцов; оно вставляет записи itemNumber, price, stockDate и description. Обратите внимание, что данные, вставляемые в столбцы stockDatedescription заключены в простые кавычки. Столбец description - это строка символов переменной длины, поэтому допустимое значение для него - строка (что вы показываете, заключая данные в простые кавычки). Напротив, столбец stockDate представляет собой столбец данных; он требует заключать данные в простые кавычки, чтобы правильно анализировать информацию о дне, месяце и годе. (дополнительную информацию о форматировании данных в процессе операции SQL INSERT можно найти в документации, размещенной в сети интернет или в предыдущей статье данного цикла.)

Второе предложение SQL INSERT явно перечисляет все четыре столбца и соответственно вставляет новые значения. Последнее предложение SQL INSERT перечисляет только три столбца и вставляет только три значения. Столбец description остается пустым; это означает, что он имеет значение NULL.

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

Листинг 8. Вставка нескольких записей
rb$ java org.apache.derby.tools.ij           
ij version 10.1
ij> connect 'jdbc:derby:test' ;
ij> INSERT INTO bigdog.products
(itemNumber, price, stockDate, description)
    VALUES (4, 29.95, '2006-02-10', 'Male bathing suit, blue'),
           (5, 49.95, '2006-02-20', 'Female bathing suit, one piece, aqua'),
           (6, 9.95, '2006-01-15', 'Child sand toy set'),
           (7, 24.95, '2005-12-20', 'White beach towel'),
           (8, 32.95, '2005-12-22', 'Blue-striped beach towel'),
           (9, 12.95, '2006-03-12', 'Flip-flop'),
           (10, 34.95, '2006-01-24', 'Open-toed sandal') ;
7 rows inserted/updated/deleted
ij> exit ;

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

Вставка данных в Apache Derby

Многострочная вставка предпочтительна для вставки нескольких отдельных записей; но еще лучше поместить в файл сценария выражения SQL INSERT и запустить сценарий для вставки данных. Такой подход позволяет легче исправлять ошибки или повторно вставлять данные при необходимости, не создавая повторно нужные предложения SQL INSERT. Файл с расширением .zip, который можно загрузить вместе с этой статьей, содержит два файла сценариев SQL, описанных выше. Второй файл сценария (derby.insert.sql) вставляет в базу данных десять записей, представленных в предыдущем разделе, и выполняет простой запрос на вывод результатов, подтверждая тем самым операцию вставки. Механизм выполнения операции запроса будет подробно рассмотрен в следующей статье, но вам не нужно понимать принцип создания и выполнения запроса для запуска сценария вставки.

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

Листинг 9. Подтверждение операции вставки
$ 
java org.apache.derby.tools.ij < derby.insert.sql
ij version 10.1
ij> ij> 10 rows inserted/updated/deleted
ij> ITEMNUMBER |PRICE   |STOCKDATE
 |DESCRIPTION                              
------------------------------------------------------------
-------------------
1          |19.95   |2006-03-31|Hooded sweatshirt                             
2          |99.99   |2006-03-29|Beach umbrella                                 
3          |0.99    |2006-02-28|                                               
4          |29.95   |2006-02-10|Male bathing suit, blue                        
5          |49.95   |2006-02-20|Female bathing suit, one piece, aqua           
6          |9.95    |2006-01-15|Child sand toy set                             
7          |24.95   |2005-12-20|White beach towel                              
8          |32.95   |2005-12-22|Blue-striped beach towel                        
9          |12.95   |2006-03-12|Flip-flop                                      
10         |34.95   |2006-01-24|Open-toed sandal                               

10 rows selected
ij> ij> rb$

Заключение

В этой статье были рассмотрены две основные темы. Сначала мы объяснили идею файлов сценариев, которые можно использовать для автоматического выполнения нескольких команд SQL (или Derby): файл сценария SQL можно запустить при помощи инструмента Apache Derby ij тремя способами: через интерфейс инструмента, при помощи команды run или одним из двух способов прямо из командной строки. Далее вы ознакомились с синтаксисом предложения SQL INSERT и с примерами использования этих предложений для вставки данных в базу данных Derby. В следующих статьях эти принципы будут использоваться для запроса, изменения и удаления данных из базы данных Apache Derby.


Загрузка

ОписаниеИмяРазмер
Derby SQL scripts for this articlederby4.zip1KB

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Information Management
ArticleID=172046
ArticleTitle=Разработка c помощью Apache Derby -- тройной выигрыш: Разработка баз данных при помощи Apache Derby, Часть 3
publish-date=05122006