![]() |
|
Программирование >> Oracle
Загрузка данных Это объявления ряда глобальн1х переменных, которые используются в пакете. Глобальный курсор открывается один раз, при первом обращении к пакету, и остается открытым до завершения сеанса. Это избавляет от необходимости открывать курсор при каждом обращении к пакету. G DESCTBL - это PL/SQL-таблица, в которую будут попадать результаты вызова DBMS SQL.DESCR1BE. G NL - это последовательность, представляющая новую строку. Мы будем использовать ее в строках, где надо оставить встроенные символы перевода строк. Для работы в Windows ничего настраивать не надо - подпрограммы пакета UTLFILE распознают символ CHR(10) в переданной строке и автоматически преобразуют его в последовательность возврат каретки/перевод строки. Далее идет простая функция, используемая для преобразования символа в шестнад-цатеричный вид. Для этого используются встроенные функции: 9 10 11 12 13 14 15 function to hex(p str is begin return to char(ascii(p str), end; in varchar2) return varchar2 fm0x); Ниже представлена процедура создания управляющего файла для загрузки выгруженных данных. Она использует для этого таблицу DESCRIBE, генерируемую вызовом dbms sql.describe columns. Процедура учитывает особенности ОС, в частности то, использует ли ОС последовательность возврат каретки/перевод строки (это учитывается при задании атрибута STR) и какой символ является разделителем каталогов в именах файлов: \ или /. Для этого просматривается переданное при вызове имя каталога. Если это имя содержит символ \, значит, мы работаем в ОС Windows, иначе - в ОС UNIX:
Глава 9 36 if (p dir not like %\ AND p filename not like \%) 37 then 38 l path := \; 39 end if; 40 else 41 l str := chr(10); 42 if (p dir not like %/ AND p filename not like /%) 43 then 44 l path := /; 45 end if; 46 end if; 48 l output := utl file.fopen(p dir, p filename .ctl, w); 50 utl file.put line(l output, load data); 51 utl file.put line(l output, infile p dir l path 52 p filename .dat str x 53 utl raw.cast to raw(p terminator 54 l str ) ); 55 utl file.put line(l output, into table p tname); 56 utl file.put line(l output, p mode); 57 utl file.put line(l output, fields terminated by x 58 to hex(p separator) 59 enclosed by X 60 to hex (p enclosure) ) ; 61 utl file.put line(l output, () ; 63 for i in 1 . . g descTbl.count 64 loop 65 if (g descTbl(i).col type = 12 ) 66 then 67 utl file.put(l output, l sep g descTbl(i).col name 68 date ddmmyyyyhh24miss ) ; 69 else 70 utl file.put(l output, l sep g descTbl(i).col name 71 charC 72 to char(g descTbl(i).col max len*2) )); 73 end if; 74 l sep := , g nl; 75 end loop; 76 utl file.put line(l output, g nl ) ) ; 77 utl file.fclose(l output); 78 end; Вот простая функция, в]дающая переданную строку в заданных кавычках . Обратите внимание, что она не просто берет строку в кавычки, но и удваивает все символы кавычек, входящие в строку, так что они сохраняются при загрузке: 80 function quote(p str in varchar2, p enclosure in varchar2) 81 return varchar2 82 is Загрузка данных 83 84 85 86 87 begin return p enclosure replace(p str, pendosure; penclosure, penolosure penclosure) end; Теперь переходим к основной функции, RUN. Поскольку она достаточно большая, комментарии будут делаться по ходу: REPLACE,
) return number Текущий формат даты мы сохраним в переменной, чтобы можно было заменить его форматом, сохраняющим дату и время при сбросе данных на диск. Таким образом, мы будем сохранять время суток при выдаче дат. Затем зададим обработчик исключительных ситуаций, чтобы восстанавливать значение NLS DATE FORMAT в случае ошиб- 107 108 109 110 111 113 114 116 117 118 119 120 121 122 123 select value into l datefmt from nls session parameters where parameter = NLS DATE FORM1AT; Устанавливает формат даты а виде большой строки цифр. Тем самим снимаются все проблемы NLS и сохраняется не только дата, но и время. execute immediate alter session set nls date format=ddmmyyyyhh24miss; Создаем блок с обработчиком исключительных ситуаций, случае ошибки можно было восстановить формат даты. begin чтобы в
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |