как вариант, если найдется добрый человек, который найдет время остатки прикрутить (у меня доступа к живой базе сейчас нет):
Код:
DECLARE
-- выгрузка на кассы Штрих miniPOS
k_outF UTL_FILE.FILE_TYPE;
k_outD VARCHAR2(10) := 'd:\sql'; -- каталог выгрузки на
-- СЕРВЕРЕ должен быть описан в параметре UTL_FILE_DIR в pfile
k_outN VARCHAR2(10) := 'goods1.txt'; -- имя файла
-- выборка из базы
cursor cash is
select c.ARTICLE, c.NAME, b.barcode, b.quantity, p.PRICE
from SMCard c, SMStoreUnits b, SMPrices p
where
c.ARTICLE=b.ARTICLE and
c.ARTICLE = p.ARTICLE and
c.ACCEPTED = 1 and
c.CASHLOAD = 1 and
p.STORELOC = 2;
ca VARCHAR2(50); -- артикул
cn VARCHAR2(255); -- наименование
cnn VARCHAR2(255); -- наименование без табуляций
bc VARCHAR2(50); -- штрихкод
bq NUMBER(14); -- количество по штрихкоду
pp NUMBER(19,4); -- цена
tab char(1) := CHR(9); -- разделитель полей шаблона см2000
dd char(1) := ';'; -- разделитель для кассы
BEGIN
-- открываем файл
k_outF := UTL_FILE.FOPEN(k_outD,k_outN,'w');
-- формируем заголовок
UTL_FILE.PUTF(k_outF,'##@@&&'||'\n'||'#'||'\n');
UTL_FILE.FFLUSH(k_outF);
OPEN cash; -- открываем выборку
LOOP
FETCH cash INTO ca, cn, bc, bq, pp; -- считываем записи
EXIT WHEN cash%NOTFOUND; -- пока не кончится выборка
-- отладочный выход после строки № 100
-- EXIT WHEN cash%ROWCOUNT > 100;
cnn := REPLACE(cn,tab,' '); -- выкидываем лишние табуляции
cnn := REPLACE(cnn,dd,' '); -- выкидываем из названий разделители
-- выводим в буфер
UTL_FILE.PUTF(k_outF,ca||dd||bc||dd||cnn||dd||cnn||dd||pp||dd||'0'||dd||'0'||dd||'0'||dd||'0'||dd||'0'||dd||'0'||dd||'0'||dd||'0'||dd||'1'||dd||'0'||dd||'0'||dd||'1'||dd||'2'||dd||'0'||dd||dd||dd||'\n');
-- буфер иногда сбрасываем в файл, чтобы не переполнялся
IF MOD(cash%ROWCOUNT,100)=0 then
UTL_FILE.FFLUSH(k_outF);
END IF;
END LOOP;
CLOSE cash; -- закрываем выборку
UTL_FILE.FCLOSE(k_outF); -- закрываем файл
EXCEPTION -- обработчики ошибок
WHEN UTL_FILE.INVALID_PATH THEN
RAISE_APPLICATION_ERROR(-20100, 'Invalid Path');
WHEN UTL_FILE.INVALID_MODE THEN
RAISE_APPLICATION_ERROR(-20101, 'Invalid Mode');
WHEN UTL_FILE.INVALID_OPERATION THEN
RAISE_APPLICATION_ERROR(-20101, 'Invalid Operation');
WHEN UTL_FILE.INVALID_FILEHANDLE THEN
RAISE_APPLICATION_ERROR(-20300,'Invalid File Handle');
WHEN UTL_FILE.WRITE_ERROR THEN
RAISE_APPLICATION_ERROR(-20301,'Write Error');
WHEN UTL_FILE.INTERNAL_ERROR THEN
RAISE_APPLICATION_ERROR(-20302,'Internal Error');
END;
/
exit;