Программирование >>  Oracle 

1 ... 150 151 152 [ 153 ] 154 155 156 ... 469


Загрузка данных

Это объявления ряда глобальн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:

procedure dump ctl(p dir

in varchar2 ,

p filename

in varchar2,

p tname

in varchar2,

p mode

in varchar2,

p separator

in varchar2,

p enclosure

in varchar2,

p terminator

in varchar2)

l output

utl file.file type;

l sep

varchar2(5);

l str

varchar2(5);

l path

varchar2(5);

begin

if (p dir

like %\%)

then

- Windows platforms -

l str

:= chr(13) chr(10);



Глава 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,

function run(p query

in varchar2,

p tnaroe

in varchar2,

p mode

in varchar2 default

p dir

in varchar2,

p filename

in varchar2,

p separator

in varchar2 default

p enclosure

in varchar2 default

p terminator

in varchar2 default

l output utl file.file type;

l columnValue varchar2 (4000) ;

l colCnt number default 0;

l separator varchar2(10)

default ;

l cnt number default 0;

l line long;

l datefmt varchar2(255) ;

l descTbl dbms sql.desc tab;

begin

) 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

чтобы в



1 ... 150 151 152 [ 153 ] 154 155 156 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика