Сплит CLOB по частям - PullRequest
0 голосов
/ 15 мая 2019

У меня есть следующие таблицы:

LOG_SYNC_CALLS_HEADERS
    ID
    CALL_DATE
    CALL_TYPE (foreign key to LOG_SYNC_CALL_TYPES)
    ACTION_NAME
    ACTION_RESULTS
LOG_SYNC_CALLS_IECS
    ID
    HEADER_ID (foreign key to LOG_SYNC_CALLS_HEADERS)
    CONTENTS (clob)

Мне нужно создать процедуру GET_IEC_BY_PARTS. Входным параметром будет ID, этот идентификатор вы должны найти в таблице LOG_SYNC_CALLS_IECS, соответствующей CLOB. Разделите этот CLOB в varchar на 4000 символов и верните его курсором. У курсора есть столбцы: ID, HEADER_ID, PART_NUMBER, CONTENTS. PART_NUMBER будет в интервале от 1 до 10.

Может ли кто-нибудь показать мне, как реализовать эту процедуру?

Мои вопросы:

  1. Как разделить CLOB в varchar на 4000 символов и вернуть его в курсоре?

  2. Как определить параметры для курсора?

У меня есть следующие процедуры:

INSERT_IEC_BY_PARTS. Процедура имеет параметры: ID (NUMBER), HEADER_ID (NUMBER), CONTENTS_PART1, ..., CONTENTS_PART10. CONTENT_PART - это тип VARCHAR. Процедура возвращает номер результирующего кода и вставленный идентификатор в курсоре (параметры OUT).

Эта процедура должна объединить эти 10 CONTENTS_PART в один CLOB, а затем использовать процедуру INSERT_IEC для вставки этого CLOB в базу данных.

  procedure insert_iec_by_parts(p_header_id in number,
                       p_contents_part1 in varchar2,
                       p_contents_part2 in varchar2,
                       p_contents_part3 in varchar2,
                       p_contents_part4 in varchar2,
                       p_contents_part5 in varchar2,
                       p_contents_part6 in varchar2,
                       p_contents_part7 in varchar2,
                       p_contents_part8 in varchar2,
                       p_contents_part9 in varchar2,
                       p_contents_part10 in varchar2,

                       o_cur_results out sys_refcursor,
                       result_code out number) is

l_clob clob;

begin

l_clob:=p_contents_part1||p_contents_part2||p_contents_part3||p_contents_part4||p_contents_part5||
        p_contents_part6||p_contents_part7||p_contents_part8||p_contents_part9||p_contents_part10;

insert_iec(p_header_id, l_clob, o_cur_results, result_code );

end;

INSERT_IEC:

 procedure insert_iec(p_header_id in number,
                       p_contents in clob,
                       o_cur_results out sys_refcursor,
                       result_code out number) is

    id_temp number;
    l_id number;

  procedure SetError(pErrCode number) is

  -- A centralised sub proc could allow for a quick change to raise_application_error at any time.

  begin

    result_code   := pErrCode;


  end;

  begin

  select count(*) into l_id from log_sync_calls_headers
where log_sync_calls_headers.id =p_header_id;

  case

    when (p_header_id is null) or (l_id <= 0)     then SetError(9804);
    when p_contents is null then SetError(9805);

        else

      -- fetch sequence number

   id_temp := iec_seq.nextval;

         result_code:=0;

      open o_cur_results for    
      select id_temp as id
      from dual;

           insert into log_sync_calls_iecs
       (id, header_id, contents)
       values
       (id_temp, p_header_id, p_contents );


      commit;
  end case;  

            exception      when others then
        result_code :=9701;
        rollback;
        pkg_common.insert_log_record(p_source => 'insert_iec',
                p_type => 'Er',
                p_message => sqlerrm);    



end;
...