powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / external table с неопределенным количеством дата файлов
9 сообщений из 9, страница 1 из 1
external table с неопределенным количеством дата файлов
    #39345420
dbmsoutput
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
доброе утро,

проблема:
В датаваренхауз читаем 100 external таблиц. В результате получаем сколько то bad файлов. Хочется через sql посчитать сколько bad строчек в каждом файле.

Я хочу сделать external таблицу и через нее считать все bad файлы в один раз. таблица должна содержать: имя bad файла и bad рекорд (как одну колонку)

Нюансы:
1. все bad файлы имеют только общее оканчание .bad
2. каждый день разные bad файлс, т.е от 0 до 100
3.дата файлы не содержат имени датафайла, т.е если в bad файле нельзя найти откуда рекорд была сброшена
4.database 12.1.0.2.0 Linux x86 64-bit
5.мои юникс скилс очень ограничены, я аналист

Пока нацарапал не много :(, таблица читает конкретные bad файлс, а хочется чтоб читала все *.bad
и не получается выцепить имя bad файла чтоб выдать в каждой строке.

Можно ли решить это без препроцесса? Без юникса скрипта?
Если препроцесс необходим, может ли кто нибудь дать примерчик. Я думаю надо в начале склеить все бадфайлы и в каждую строку добавить имя откуда рекорд приехала.


Большое спасибо,

Ром

create table stg.ext_top_roman_err_test
( data_rec varchar2(4000)
)
organization external
( type oracle_loader
default directory stg_file_top
access parameters
(
records delimited by "\r\n"
badfile stg_file_top:'roman_err_test.bad'
discardfile stg_file_top:'roman_err_test.dsc'
logfile stg_file_top:'roman_err_test.log'
skip 1
fields terminated by '~'
missing field values are null
reject rows with all null fields
( data_rec char
)
)
location (stg_file_top:'Voorziening.bad','Problematiek.bad')
)
reject limit unlimited
/
...
Рейтинг: 0 / 0
external table с неопределенным количеством дата файлов
    #39345498
preprocessor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbmsoutput,

cat
...
Рейтинг: 0 / 0
external table с неопределенным количеством дата файлов
    #39345760
dbmsoutput
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
preprocessor,

нацарапал скрипт: MergeBad.sh

for file in /transfer/grd-cjg/dwhont/*bad; do /bin/cat $file >> /transfer/grd-cjg/dwhont/bad_totaal.csv; done

сделал внешнюю таблицу:

create table stg.ext_top_roman_err_test
( data_rec varchar2(4000)
)
organization external
( type oracle_loader
default directory stg_file_top
access parameters
(
records delimited by newline
disable_directory_link_check
preprocessor stg_file_top:'MergeBad.sh'
badfile stg_file_top:'roman_err_test.bbd'
logfile stg_file_top:'roman_err_test.log'
characterset utf8
skip 1
fields terminated by '¥' optionally enclosed by '"'
missing field values are null
reject rows with all null fields
( data_rec char
)
)
location (stg_file_top:'Wijkteam_meta.txt')
)
reject limit unlimited
/


проблеммы:
1.если в location стоит bad_totaal.csv, но его еще нет в директории то получаю ошибку что файл не найден.
заменяю датафайл в location на другой (см. таб скрипт).
если удаляю preprocessor то таблица показывает строчки. Если preprocessor вставляю и делаю селект из таблицы: нет ошибок, bad_totaal.csv появляется в директории, Но таблица пустая :(

Как починитъ?

Другой вопрос: как в каждуй строчку нового файла (bad_totaal.csv) вставить имя файла (как первый столбик) откуда строчка скопирована(один из bad файлов)?

спасибо, Ром
...
Рейтинг: 0 / 0
external table с неопределенным количеством дата файлов
    #39346295
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
tst> create directory bin_dir as '/usr/bin';

Directory created.

tst> create directory tmp_dir as '/tmp';

Directory created.

tst> declare f utl_file.file_type := utl_file.fopen('TMP_DIR', 'MergeBad.sh', 'w');
  2  begin   utl_file.put_line(f, 'cd /u/app/oracle/product/11gr2/javavm/demo');
  3          utl_file.put_line(f, '/usr/bin/grep -s ''.'' *.mk');
  4          utl_file.fclose(f);
  5  end;
  6  /

PL/SQL procedure successfully completed.

tst> create table bad_lines(filename varchar2(30), line varchar2(80))
  2  organization external (
  3      type oracle_loader default directory tmp_dir
  4      access parameters (
  5          records delimited by newline
  6          nologfile nobadfile nodiscardfile
  7          preprocessor bin_dir:'bash'
  8          fields ltrim (
  9              filename char(30) terminated by ':',
 10              line char(80)
 11          )
 12      ) location ('MergeBad.sh')
 13  );

Table created.

tst> select * from bad_lines;

FILENAME                       LINE
------------------------------ --------------------------------------------------------------------------------
java.mk                        ## java.mk
java.mk                        .SUFFIXES: .java .class
java.mk                        .java.class:
java.mk                        $(JAVAC) -g -classpath $(MAKE_CLASSPATH) $<
java.mk                        JAVA_HOME=$(ORACLE_HOME)/jdk
java.mk                        JAVAC=$(JAVA_HOME)/bin/javac
java.mk                        JAVA=$(JAVA_HOME)/bin/java
java.mk                        # jdk12 classpath
java.mk                        JDK12_CLASSPATH = ".$(PATHSEP)${JAVA_HOME}$(DIRSEP)jre$(DIRSEP)lib$(DIRSEP)rt.ja
java.mk                        # jre12 classpath
java.mk                        JRE12_CLASSPATH = ".$(PATHSEP)${JAVA_HOME}$(DIRSEP)jre$(DIRSEP)lib$(DIRSEP)rt.ja
java.mk                        # services
java.mk                        ifdef ENABLETEST_IPV6
java.mk                        GIOP_SERVICE=sess_iiop://${IPV6HOST}:2481:${ORACLE_SID}
java.mk                        GIOPS_SERVICE=sess_iiop://${IPV6HOST}:2482:${ORACLE_SID}
java.mk                        HTTP_SERVICE=http://${IPV6HOST}:7777
java.mk                        HTTPS_SERVICE=https://${IPV6HOST}:9000
java.mk                        JDBC_SERVICE=jdbc:oracle:thin:@${IPV6HOST}:${ORACLE_PORT}:${ORACLE_SID}
java.mk                        KPRB_SERVICE=jdbc:oracle:kprb:
java.mk                        OCI8_SERVICE=jdbc:oracle:oci8:@
java.mk                        SERVICE=$(GIOP_SERVICE)
java.mk                        else
java.mk                        GIOP_SERVICE=sess_iiop://localhost:2481:${ORACLE_SID}
java.mk                        GIOPS_SERVICE=sess_iiop://localhost:2482:${ORACLE_SID}
java.mk                        HTTP_SERVICE=http://localhost:7777
java.mk                        HTTPS_SERVICE=https://localhost:9000
java.mk                        JDBC_SERVICE=jdbc:oracle:thin:@localhost:${ORACLE_PORT}:${ORACLE_SID}
java.mk                        KPRB_SERVICE=jdbc:oracle:kprb:
java.mk                        OCI8_SERVICE=jdbc:oracle:oci8:@
java.mk                        SERVICE=$(GIOP_SERVICE)
java.mk                        endif
java.mk                        ifndef SYSPASSWD
java.mk                        SYSPASSWD=change_on_install
java.mk                        endif
java.mk                        # transaction
java.mk                        UT_NAME=/test/UserTransaction/testut
java.mk                        DS_NAME=/test/DataSource/testds
java.mk                        # demo account(s)
java.mk                        HRuser=HR
java.mk                        HRpwd=HR
java.mk                        USER=scott
java.mk                        PASS=tiger
unix.mk                        ## unix.mk
unix.mk                        FAMILY=unix
unix.mk                        PLATFORM=solaris
unix.mk                        #SHELL=/usr/bin/sh
unix.mk                        DIRSEP=/
unix.mk                        PATHSEP=:
unix.mk                        RMRF=rm -rf
win.mk                         ## win.mk
win.mk                         FAMILY=win
win.mk                         PLATFORM=nt
win.mk                         SHELL=C:\winnt\system32\cmd.exe/c
win.mk                         PATHSEP=;
win.mk                         DIRSEP=/
win.mk                         RMRF=rm -rf

56 rows selected.
...
Рейтинг: 0 / 0
external table с неопределенным количеством дата файлов
    #39346296
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пустые строки не попадают, естественно
...
Рейтинг: 0 / 0
external table с неопределенным количеством дата файлов
    #39346394
dbmsoutput
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров,

Спасибо. Я только не совсем понимаю решения.

Моя задача:

1.после загрузки датаваренчауза (через внешние таблицы) у меня может появится от 0 до N bad files
2.В строчках bad files нет указания на датафайл.
3.Я хочу сделать новую внешнюю таблицу и через нее читать все (от 0 до N) bad files
4.Конечная цель селект в котором я показываю сколько строчек в каждом bad файле. Администратор связывается с поставщиком даты и тд.

Для выше описанного:
1.делаю таблицу внешнюю ext_top_roman_err_test ( filename varchar2(100), data_rec varchar2(4000) ) organization external....
2.нужен unix скрипт ('MergeBad.sh') который 'клеит' все bad файлы в один - bad_totaal.csv. Помимо клеинья скрипт добавляет в каждую строчку bad_totaal.csv имя bad файла откуда строчка пришла.
3.'MergeBad.sh' всавляю в preprocessor: preprocessor stg_file_top:'MergeBad.sh' таблицы ext_top_roman_err_test
4.Таблица ext_top_roman_err_test читает файл который делается во время исполнения preprocessor - bad_totaal.csv
5. результат: select filename, count(1) from ext_top_roman_err_test group by filename;

Главная проблема - нехватка тех экспертизы, особено юникса :(
Если можете помогите пожалуйста.

спасибо,

Роман

create table stg.ext_top_roman_err_test
( filename varchar2(100), data_rec varchar2(4000)
)
organization external
( type oracle_loader
default directory stg_file_top
access parameters
(
records delimited by newline
preprocessor stg_file_top:'MergeBad.sh'
badfile stg_file_top:'roman_err_test.bbd'
discardfile stg_file_top:'roman_err_test.dsc'
logfile stg_file_top:'roman_err_test.log'
fields terminated by ';'
missing field values are null
reject rows with all null fields
(filename char
data_rec char
)
)
location (stg_file_top:'bad_totaal.csv')
)
reject limit unlimited
...
Рейтинг: 0 / 0
external table с неопределенным количеством дата файлов
    #39346395
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первая, и самая неприятная проблема -- ты пришел спрашивать совета на форуме, но не ознакомился с его правилами об оформлении сообщений. Поверь, читать твое творчество в сплошном потоке совершенно не интересно

Второе, ты не понял как работает директива PREPROCESSOR https://docs.oracle.com/cd/E11882_01/server.112/e22490/et_params.htm#SUTIL1384 The preprocessor program converts the data to a record format supported by the access driver and then writes the converted record data to standard output (stdout), which the access driver reads as input

Ну и третье -- дальше жевать уже просто не педагогично, думай сам
...
Рейтинг: 0 / 0
external table с неопределенным количеством дата файлов
    #39346398
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И да, по поводу Юникса
Я использовал команду grep '.' (вместо cat) навскидку просто потому, что у нее такое поведение -- подставлять имя файла (в случае, если он не один)
Возможно, есть смысл использовать awk (это вообще универсально) или что-нибудь другое

Но это уже в подфорум с Юниксами
...
Рейтинг: 0 / 0
external table с неопределенным количеством дата файлов
    #39346486
dbmsoutput
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров,

Спасибо. вы действительно правы, учту.
Я не совсем технарь, поэтому глупые вопросы.

Ваша версия работает прекрасно. Препроцесинг вроде тоже понял :)

Попробую посмотреть akw чтобы и в случае с одним bad файлом работало. если не разберусь то сделаю dummy bad file. который будет всегда и который не буду учитывать в контрольном селекте.... из за нехватки скилз приходится извращаться.

с уважением, ром
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / external table с неопределенным количеством дата файлов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]