Выбрать главу

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

Выполнение SQL с использованием Java 571

многих других структур, в совокупности образующих базу данных. DDL состоит

из таких операторов, как CREATE, ALTER, DROP, TRUNCATE и RENAME.

Операторы DDL могут выполняться в JDBC с помощью метода execute()

класса Statement. В следующем примере для создания таблицы addresses,

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

оператор CREATE TABLE:

□ myStatement.execute(

“CREATE TABLE addresses(“ +

“ address_id INTEGER CONSTRAINT address_pk PRIMARY KEY," +

customer_id INTEGER CONSTRAINT addresses_fk_customers “ +

REFERENCES customers(customer_id),” +

“ street VARCHAR2(20) NOT NULL,” +

“ c ity VARCHAR2(20) NOT NULL,” +

" state CHAR(2) NOT NULL" +

);

Примечание Выполнение оператора DDL приводит к генерации неявного оператора фиксации.

Следовательно, если перед выполнением оператора DDL имелись незафиксированные

операторы DML, эти операторы также окажутся зафиксированными.

Обработка исключений

Когда в базе данных или в драйвере JDBC происходит ошибка, генерируется

исключение java. sql. SQLException. Класс java.sql.SQLException является

подклассом класса java. lang. Exception. В связи с этим нужно поместить

все ваши операторы JDBC внутрь оператора try/catch, чтобы ваш код не

генерировал исключения java.sql.SQLException. Когда возникнет соответствующая

ситуация, Java будет пытаться найти подходящий обработчик

для обработки этого исключения.

Если обработчик ситуации java.sql.SQLException включен во фразу

catch, то когда такая ситуация возникнет либо в базе данных, либо в драй-

BepeJDBC, Java переходит к обработчику ошибок и выполняет код, который

включен во фразу catch. В этом коде можно, например, выводить код

ошибки и сообщение об ошибке, которые помогают понять, что же произошло.

Следующий оператор try/catch содержит обработчик для исключительных

ситуаций типа java.sql.SQLException, которые могут произойти в операторе

try:

□ try {

} catch (SQLException e) {

} "

Примечание Предполагается что пакет java.sql.* был импортирован, так что можно просто

использовать SQLException в catch, а не ссылаться на java.sql.SQLException.

572 Глава 15

В операторе try будут содержаться те операторы JDBC, при выполнении

которых может возникнуть ситуация SQLException, которую необходимо

погасить, а в операторе catch будут содержаться операторы обработки

ошибочной ситуации.

Класс SQLException определяет четыре метода, которые могут оказаться

полезными при отыскании причины исключительной ситуации:

■ ge tErrorCode() Когда возникает ошибка в базе данных или в драйвере

JDBC, этот метод возвращает код ошибки Oracle, являющийся пятизначным

числом.

■ getMessage() Когда возникает ошибка в базе данных, этот метод выдает

сообщение об ошибке вместе с пятизначным кодом ошибки. Если

ошибка произошла в драйвере JDBC, метод возвращает только сообщение

об ошибке.

■ getSQLState() Когда возникает ошибка в базе данных, этот метод возвращает

пятизначный код ошибки, содержащий состояние SQL. Если

ошибка произошла в драйвере JDBC, метод не возвращает ничего

интересного.

■ p r in tS ta c k T ra c e ( ) Этот метод выводит содержимое стека на тот момент,

когда произошла исключительная ситуация. Эта информация

может помочь разобраться, что же именно пошло не так.

Следующий оператор try/catch иллюстрирует применение этих четырех

методов:

□ t r y {

} catch (SQLException е) {

S y s t em .o u t .p r in t ln ( “ E r ro r code = “ + e .ge tE rro rC od e ( ));

S y s t em .o u t .p r in t ln ( “ E r ro r message = “ + e.getMessageO);

S y s tem .o u t .p r in t ln ( “SQL s ta te = “ + e.getSQLState( ));

e .p r in tS ta c kT ra ce ( );

}

Если код просто сбрасывает ситуацию SQLExcept, а не обрабатывает ее

локально, как было только что показано, Java будет искать подходящий обработчик

в вызывающей процедуре или функции, пока он не будет найден.

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

ситуация будет обработана обработчиком по умолчанию, который выведет

код ошибки Oracle, сообщение об ошибке и трассировку стека.

Закрытие объектов JDBC

В показанных в этой главе примерах создан целый ряд объектов JDBC: объект

Connection по имени myConnection, объект Statement по имени myStatement

и два объекта ResultSet - productResultSet и customerResultSet. Объекты

ResultSet должны быть закрыты, когда они перестанут быть нужными, для чего

используется метод closeQ. Аналогично следует закрывать объекты

Statement и Connection, как только в них пропадает необходимость.

Выполнение SQL с использованием Java 573

В следующем примере с помощью метода close () закрываются объекты