Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
При добавлении данных во внешний файл внешняя функция ASCII_CHAR (десятичный- код-ASCII) из библиотеки функций ib udf может быть использована для передачи в
оператор SQL непечатаемых символов в виде выражения для столбцов разделителей строк. Например, следующий оператор добавляет символы возврата каретки и перевода строки в столбец:
INSERT INTO MY_EXT_TABLE (
столбцы . . .,
CRIIF)
VALUES (
Значение-столбца. . .,
ASCII_CHAR(13) и ASCII_CHAR(10));
Альтернативой этому является создание таблицы специально для хранения непечатаемых символов, которые могут понадобиться вашим
45
Создание спецификаций для чтения/записи во внешний файл может потребовать гораздо больше детальных знаний о формате, чем здесь обсуждается. Наборы символов и размеры в байтах могут оказаться проблемой. Во многих случаях использование в качестве набора символов нейтрального набора символов OCTETS в определении внешней таблицы может решить некоторые проблемы. Импорт и экспорт данных не подчиняется принципу "один размер подходит всем".
Только операции INSERT и SELECT могут быть выполнены над строками внешней таблицы. Попытки изменить или удалить строки вернут ошибки.
Поскольку такие данные располагаются вне базы данных, операции с внешней таблицей не находятся под управлением версиями записей сервера Firebird. Поэтому добавления имеют немедленный эффект и не могут быть отменены (rolled back).
! ! !
СОВЕТ. Если вы хотите, чтобы ваша таблица находилась под управлением транзакции, создайте другую, внутреннюю таблицу Firebird и добавьте данные из внешней таблицы во внутреннюю.
. ! .
Если вы используете DROP DATABASE для удаления базы данных, вы должны также удалить внешний файл - он не будет автоматически удален как результат выполнения DROP DATABASE.
Импорт внешних файлов в таблицы Firebird
Для импорта внешних файлов в таблицы Firebird вначале убедитесь, что у вас установлены соответствующие условия доступа. См. разд. "Конфигурирование внешних размещений"главы 36 относительно параметра сервера ExternairiieAccess.
1. Создайте таблицу Firebird, которая позволит вам просматривать внешние данные. Объявите все столбцы как CHAR. Текстовый файл, содержащий данные, должен находиться на сервере. В следующем примере внешний файл существует в системе UNIX, следовательно, символ EOL занимает 1 байт.
CREATE TABLE EXT_TBL EXTERNAL FILE 'file.txt' (
FNAME CHAR (10) ,
LNAME CHAR(20),
HDATE CHAR(10),
NEWLINE CHAR(1));
COMMIT;
2. Создайте другую таблицу Firebird, которая в итоге будет вашей рабочей таблицей. Включите столбец для символа EOL, если вы позже собираетесь экспортировать данные из внутренней таблицы назад во внешний файл:
CREATE TABLE PERSONNEL (
FIRST_NAME VARCHAR(10),
LAST_NAME VARCHAR(20) ,
HIRE_DATE DATE,
NEW_LINE CHAR(1));
COMMIT;
3. Используя текстовый редактор или
Количество символов в строке EOL зависит от платформы - см. предыдущие замечания.
Следующий пример иллюстрирует запись фиксированной длины в 41 символ, b представляет пробел, a n - EOL:
12345678901234567890123456789012345678901
fname. . . . . lname. . . . . . . hdate n
JamesbbbbbStarkeybbbbbbbbbbbbb2004-12-10n
ClaudiobbbValderramabbbbbbbbbb2003-10-01n
4. Оператор SELECT для таблицы EXT_TLB возвращает записи из внешнего файла:
SELECT FNAME, LNAME, HDATE FROM EXT_TBL;
FNAME | LNAME | HDATE |
===== | ===== | ===== |
James | Starkey | 2004-12-10 |
Claudio | Valderrama | 2003-10-01 |
5. Добавьте данные в таблицу назначения:
INSERT INTO PERSONNAL
SELECT FNAME, LNAME, CAST( HDATE AS DATE),
NEWLINE FROM EXT_TBL;
COMMIT;
! ! !
ПРИМЕЧАНИЕ. Если вы пытаетесь обратиться к файлу, в то время как он еще открыт другим приложением, эта попытка даст сбой. Обратное также верно, и более того: когда ваше приложение откроет файл как таблицу, он будет недоступен для других приложений, пока ваше приложение не отсоединится от базы данных [46] .
46
Внешний файл должен быть освобожден, когда завершатся выполняющиеся с ним операции. Для сервера некорректно оставлять его заблокированным, поскольку внешние данные не менялись. Это программная ошибка, по поводу которой читатель может запросить исправле-
. ! .
Теперь, когда вы выполните SELECT для PERSONNEL, данные из вашей внешней таблицы появятся в конвертированной форме:
SELECT FIRST_NAME, LAST_NAME, HIRE_DATE
FROM PERSONNEL;
FIRST NAME LAST NAME HIRE DATE
James Starkey 10-DEC-2004
Claudio Valderrama 01-OCT-2003
Экспорт таблиц Firebird во внешние файлы
Вернемся к примеру в предыдущем разделе. Шаги по экспорту данных в нашу внешнюю таблицу похожи:
1. Откройте внешний файл в текстовом редакторе и удалите в нем все. Выйдите из текстового редактора и снова выполните запрос SELECT к таблице EXT_TBL. Она должна быть пустой.
2. Используйте оператор INSERT для копирования записей Firebird из PERSONNEL во внешний файл file.txt:
INSERT INTO EXT_TBL
SELECT FIRST_NAME, LAST_NAME,
cast (HIRE_DATE AS VARCHAR(ll),
ASCII_CHAR(10) FROM PERSONNEL
WHERE FIRST_NAME LIKE 'Clau%';
3. Теперь выберите данные из внешней таблицы: