2016-12-29 3 views
1

Итак, у меня есть таблица «Таблица1», в которой есть столбец File_Name, среди прочих. Я должен написать процедуру, которая проверяет, имеет ли каждое имя_файла свою пару с тем же именем. Единственное различие заключается в sufix file_name. Каждое имя_файла имеет .gz sufix, и его пара имеет .fin sufix, а имя - то же самое.процедура сопряжения файлов в plsql

Я полностью новичок в процедурах и plsql в целом, поэтому я очень благодарен за помощь. Я не знаю, нахожусь ли я на правильном пути. Это то, что у меня есть сейчас, и у него есть ошибки, конечно;

CREATE OR REPLACE 

PROCEDURE DWHAPND_FILE_PAIRING_CHECK(P_LOAD_TIME  IN DATE, 
           P_BATCH_NO  IN NUMBER, 
           P_STATUS  OUT VARCHAR2, 
           P_MSG   OUT VARCHAR2) IS 

CURSOR file_gz IS 
SELECT RTRIM(FILE_NAME, '.gz') 
FROM TABLE1 
WHERE INSTR(FILE_NAME, '.gz', -1, 1) 
AND BATCH_NO = P_BATCH_NO 
AND LOAD_TIME = P_LOAD_TIME; 

L_STATUS VARCHAR2(10); 
L_MSG  VARCHAR2(4000); 

BEGIN 

IF(
SELECT RTRIM(FILE_NAME, '.fin') as file_fin 
FROM TABLE1 
WHERE INSTR(FILE_NAME, '.fin', -1, 1) 
AND BATCH_NO = P_BATCH_NO 
AND LOAD_TIME = P_LOAD_TIME) IN file_gz; 
THEN L_STATUS := 'OK'; 
L_MSG := 'All files are paired'; 
ELSE L_MSG := 'NOT OK'; 
L_MSG := 'Following files are not paired: ' || FILE_NAME IN file_gz; 
END IF; 
END DWHAPND_FILE_PAIRING_CHECK; 
+0

Узнав те же имена файлов, что вы хотите с ними сделать? – GurV

+0

Ничего, это всего лишь процедура проверки, каждый файл должен иметь свою пару, иначе мы остановим ETL. – noiq23

ответ

0

Используйте этот путь:

CREATE OR REPLACE PROCEDURE DWHAPND_FILE_PAIRING_CHECK(P_LOAD_TIME IN DATE, 
            P_BATCH_NO IN NUMBER, 
            P_STATUS OUT VARCHAR2, 
            P_MSG  OUT VARCHAR2) IS 

    CURSOR file_gz IS 
    SELECT RTRIM(FILE_NAME, '.gz') fname 
     FROM TABLE1 
    WHERE INSTR(FILE_NAME, '.gz', -1, 1) 
     AND BATCH_NO = P_BATCH_NO 
     AND LOAD_TIME = P_LOAD_TIME 
     order by FILE_NAME; 

    L_STATUS VARCHAR2(10); 
    L_MSG VARCHAR2(4000); 

    type file_fin1 is table of TABLE1.FILE_NAME%type index by pls_integer; 

    L_file_fin file_fin1; 

BEGIN 

    SELECT RTRIM(FILE_NAME, '.fin') 
     BULK COLLECT INTO L_file_fin 
     FROM TABLE1 
     WHERE INSTR(FILE_NAME, '.fin', -1, 1) 
     AND BATCH_NO = P_BATCH_NO 
     AND LOAD_TIME = P_LOAD_TIME 
     order by FILE_NAME ; 

    For i in 1 .. L_file_fin.count 
    loop  
     for rec in file_gz 
     loop 
     IF file_gz(rec).fname = L_file_fin(i)    
      THEN 
      L_STATUS := 'OK'; 
      L_MSG := 'All files are paired'; 
     ELSE 
      L_MSG := 'NOT OK'; 
      L_MSG := 'Following files are not paired: ' || FILE_NAME IN file_gz; 
     END IF; 
     END LOOP; 
    END LOOP; 

END DWHAPND_FILE_PAIRING_CHECK; 
+0

Да, имеет смысл, я решил, что мне придется вставить цикл. Я просто получаю ошибки «sql statement ignored» на обоих блоках SELECT, не уверен, в чем проблема, все выглядит нормально. – noiq23

+0

Я надеюсь, что вы выберете, вернет одну строку, иначе снова возникнет проблема. Я надеюсь, что ваш problm будет разрешен. – XING

+0

Да, к сожалению, он возвращает несколько строк. – noiq23

0

Я бы решить эту проблему с помощью только одного запроса

with files (file_name) as 
(   select 'file1.gz' from dual 
    union all select 'file1.fin' from dual 
    union all select 'file2.gz' from dual 
    union all select 'file2.fin' from dual 
    union all select 'file3.gz' from dual 
) 
select * 
    from (select file_name, sum(decode(ext,'.gz',1,0)) cnt_gz, sum(decode(ext,'.fin',1,0)) cnt_fin 
      from (select substr(file_name,1,instr(file_name,'.')-1) file_name, substr(file_name,instr(file_name,'.')) ext 
        from files -- table1 in your example 
           --where batch_no = p_batch_no 
           -- and load_time = p_load_time 
      ) 
      group by file_name 
) 
    where cnt_gz >0 and cnt_fin = 0; 
+0

Эта первая часть с объединением всех, не уверен, что я понимаю, потому что я не могу знать точные имена файлов и количество файлов. – noiq23

+0

Первая часть - просто сделать этот пример работой как автономный SQL. Вы должны заменить «from files» на «from table1» и, вероятно, сделать цикл курсора над оператором –

0

Вы можете попробовать это

Чтобы найти, если какой-либо из файлов не в паре.

select a.file_name 
from table1 a 
where batch_no = p_batch_no 
and load_time = p_load_time 
and not exists 
(select distinct 1 from table1 b where replace(b.file_name,'.gz','') = replace(b.file_name,'.fin','') 
and a.p_load_time = b.p_load_time and a.batch_no = b.batch_no); 

и для файлов, которые сопряжены.

select a.file_name 
from table1 a 
where batch_no = p_batch_no 
and load_time = p_load_time 
and exists 
(select distinct 1 from table1 b where replace(b.file_name,'.gz','') = replace(b.file_name,'.fin','') 
and a.p_load_time = b.p_load_time and a.batch_no = b.batch_no); 
Смежные вопросы