![]() |
|
Программирование >> Oracle
Глава 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
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)
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.002
При копировании материалов приветствуются ссылки. |