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

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


Глава 9

Теперь разберем и опишем запрос. Присваивание переменной G DESCTBL значения L DESCTBL делается для сброса глобальной таблицы, иначе, кроме данных текущего запроса, она может содержать результаты предыдущего вызова DESCRIBE. После этого вызываем процедуру DUMP CTL для создания управляющего файла:

141 142 143 144

Разбираем и описываем запрос. Присваиваем descTbl пустую таблицу, так что ее атрибут давать правильное значение.

.count будет

dbms sql.parse(g theCursor, p query, g descTbl := l desoTbl;

dms sql.describe columns(g theCursor,

dbms sql.native);

l colCnt, g descTbl);

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

для загрузки этих данных

dump ctl(p dir, p filename( ptname, p mode, pseparator, pendosure, pterminator);

Связываем каждый столбец с varchar2(4000) . Нас не интересует, выбирается ли число, дата или данные другого типа. Все может быть неявно преобразовано в строку.

Теперь все готово для сброса данных на диск. Начнем с объявления каждого выбираемого столбца как имеющего тип VARCHAR2(4000). Данные типа NUMBER, DATE, RAW и всех остальных типов будут преобразовываться в VARCHAR2. Сразу после этого выполним запрос, чтобы подготовиться к выборке данных:

145 146 147 148

150 151

for i in 1 . . l colCnt loop

dbms sql.define column(g theCursor, end loop;

i, l columnValue, 4000) ;

Выполняем запрос, игнорируя результаты вызова execute. Они имеют смысл только для операторов вставки, изменения или удаления.

Открываем файл данных для записи, выбираем все строки результатов запроса и выдаем их в файл данных:

l cnt := dbms sql.execute(g theCursor);

153 154

Открываем файл для записи результатов и выдаем их туда через разделитель.

l output := utl file.fopen(p dir, p filename .dat, w



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

160 161 162 163 164 165 166 167

169 170 171 172 173

175 176

loop

32760) ;

exit when (dbms sql.fetch rows(g theCursor) <= 0) ; l separator := ;

l line := null;

for i in 1 .. l colCnt loop

dbms sql.column value(g theCursor, i,

l columnValue);

l line := l line l separator quote(l columnValue, l separator := p separator; end loop;

l line := l line p terminator; utl file.put line(l output, l line) ; l cnt := l cnt + l; end loop;

utl file.fclose(l output);

p enclosure);

Наконец, мы восстанавливаем формат даты (обработчик исключительных ситуаций сделает то же самое, если в представленном выше коде будет любая ошибка) и завершаем работу:

177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

Теперь восстанавливаем формат даты и возвращаем

nls date format= l datefmt

количество строк, записанных в файл данных.

execute immediate

alter session set return l cnt; exception /*

В случае ЛЮБОЙ ошибки восстанавливаем формат даты и повторно возбуждаем исключительную ситуацию.

when others then execute immediate

alter session set nls date format= l datefmt

RAISE;

end; run;

unloader;

Package body created.

Теперь эту функцию можно использовать так, как показано ниже.

Для выполнения следующихдействий, естественно, необходимо предоставить текущему пользователю или роли привилегию SELECTдля таблицы SCOTT.EMP.



Глава 9

tkyte@TKYTE816> drop table emp; Table dropped. tkyte@TKYTE816> Table created.

tkyte@TKYTE816> alter table emp add resume raw(2000);

create table emp as select

from scott.emp;

Table altered.

tkyte@TKYTE816>

2 set resume

14 rows updated.

update emp

rpad(O2,

4000, 02);

tkyte@TKYTE816> update emp

2 set ename = substr(ename,

1, 2)

chr(10)

substr(ename,3);

14 rows updated.

tkyte@TKYTE816> tkyte@TKYTE816>

set serveroutput declare

l rows

number;

begin

l rows

:= unloader.run

(p query

=>

select * from

p tname

=>

emp ,

p mode

=>

replace,

P dir

=>

c:\temp,

p filename

=>

emp ,

p separator

=>

p enclosure

=>

p terminator

=>

dbms output.put line(to char(l rows)

rows extracted

end;

from emp order by erapno,

14 rows extracted to ascii file

PL/SQL procedure successfully completed.

Вот какой управляющий файл будет сгенерирован в результате.

Чисел в круглых скобках справа, выделенных наклонным шрифтом, на самом деле в файле нет. Они используются для ссылок в тексте:

load data (1)

infile c:\temp\emp.dat str x7E0D0A (2)

into table emp (3)

replace (4)

fields terminated by X2c enclosed by X22 (5)



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

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