oracle 저장 프로세스 - 저장량 데이터 대량 삽입

4970 단어
지난주에face++로 식별된 신분증 정보를 회원들에게 저장하는 새로운 수요가 생겼다.저장량 데이터는 1300만 데이터, 즉 1300만 데이터를 긁어야 한다.
도매 조회를 위해 다중 라인을 봉하여 두보 인터페이스를 호출하려고 했는데 두보 서비스 제공자가 감당하지 못할까 봐 두렵다.
스크립트 브러시를 고려하면 다음과 같은 스크립트가 있습니다.
update mem.mem_base_info i
set i.nation = decode(i.nation,
                      null,
                      (select nation
                       from risk.loan_identity_personinfo p
                       where i.cust_id = p.mid),
                      i.nation),

  i.police_station = decode(i.police_station,
                            null,
                            (select id_org
                             from risk.loan_identity_personinfo p
                             where i.cust_id = p.mid),
                            i.police_station),

  i.id_validity_date = decode(i.id_validity_date,
                              null,
                              (select case length(p.id_effect_date)
                                      when 21 then
                                        to_date(substrb(p.id_effect_date,
                                                        12),
                                                'yyyy.mm.dd')
                                      else
                                        null
                                      end
                               from risk.loan_identity_personinfo p
                               where i.cust_id = p.mid),
                              i.id_validity_date),

  i.id_address  = decode(i.id_address,
                         null,
                         (select id_address
                          from risk.loan_identity_personinfo p
                          where i.cust_id = p.mid),
                         i.id_address),
  i.update_time = sysdate
where i.cust_id = 3800000273511449;

dba 브러쉬 데이터를 찾았는데 dba는'너 같은 데이터는 브러쉬를 할 수 없어. 실행이 너무 느려.","메모리 프로세스 브러시를 써라",dba는"이렇게 놀지 않을 거야!"마음속의 천만 마리의 알파카가 쏜살같이 달려가는 것을 듣고 혼자서 저장 과정을 쓸 수밖에 없었다. 다행히 이전에 저장 과정의 각본이 있어서 참고할 수 있었다.
저장 프로세스 v1 버전
create or replace procedure proc_update_meme_id_card_info is
i number;
begin
--   
i := 0;
--     
while i < 850 loop
--  update 1    
for x in (select mid,nation,
case length(p.id_effect_date)
when 21 then
to_date(substrb(p.id_effect_date, 12), 'yyyy.mm.dd')
when 17 then
to_date(substrb(p.id_effect_date, 10), 'yyyymmdd')
else null end as id_effect_date,
id_address, id_org from risk.loan_identity_personinfo p where trunc(p.update_time) = trunc(sysdate - i)) loop

update mem.mem_base_info i
set i.nation = decode(i.nation, null, x.nation, i.nation),
  i.police_station = decode(i.police_station, null,x.id_org,i.police_station),
  i.id_validity_date = decode(i.id_validity_date, null, x.id_effect_date, i.id_validity_date),
  i.id_address  = decode(i.id_address, null, x.id_address, i.id_address),
  i.update_time = sysdate where i.cust_id = x.mid;
commit;
end loop;
Dbms_Output.put_line( ' i :  ' || i);
i := i + 1;
end loop;
end proc_update_meme_id_card_info;

실행 발견 시간의 스팸 데이터가 너무 많습니다. 정상적인 상황: 2010.01.02-2020.01.02 또는 2010.01.02-장기 또는 20100102-20200102 결과 데이터베이스에 2010.01.02-20.201.001.02 스팸 데이터가 있습니다. 처리를 소홀히 해야 합니다. 멍~~
나중에 저장 과정에 이상 정보가 나타날 수 있다고 생각하고 무시한 v2판이 나왔어요.
create or replace procedure proc_update_meme_id_card_info is
i number;
begin
--   
i := 0;
--     
while i < 850 loop
--  update 1    
for x in (select mid,nation,
case length(p.id_effect_date)
when 21 then
to_date(substrb(p.id_effect_date, 12), 'yyyy.mm.dd')
when 17 then
to_date(substrb(p.id_effect_date, 10), 'yyyymmdd')
else null end as id_effect_date,
id_address, id_org from risk.loan_identity_personinfo p where trunc(p.update_time) = trunc(sysdate - i)) loop

update mem.mem_base_info i
set i.nation = decode(i.nation, null, x.nation, i.nation),
  i.police_station = decode(i.police_station, null,x.id_org,i.police_station),
  i.id_validity_date = decode(i.id_validity_date, null, x.id_effect_date, i.id_validity_date),
  i.id_address  = decode(i.id_address, null, x.id_address, i.id_address),
  i.update_time = sysdate where i.cust_id = x.mid;
commit;
end loop;
Dbms_Output.put_line( ' i :  ' || i);
i := i + 1;
end loop;
end proc_update_meme_id_card_info;

번역 성공!큰 성과를 거두다
스토리지 프로세스 실행
begin
-- Call the procedure
proc_update_meme_id_card_info;
end;

Storage Process Write:
CREATE OR REPLACE PROCEDURE 저장 프로세스 이름(param1 in type, param2 out type)
  IS
변수 1 유형(값 범위);
변수 2 유형(값 범위);  
  BEGIN
select count(*) into 변수 1 from 표 이름where 열 이름 =param1;
if(판단 조건) then
select 열명 into 변수 2 from 표명where 열명 =param1;
      DBMS_OUTPUT.put_라인
Elsif(판단 기준) then
      dbms_output.put_라인
    Else
Raise 예외 이름(NO DATA FOUND);
    End if;
  Exception
      When others then
        Rollback;   
  END;

좋은 웹페이지 즐겨찾기