Как преобразовать одну операцию с циклом для всех записей в oracle - PullRequest
1 голос
/ 24 марта 2020

У меня есть таблица PHOTO, в этой таблице 3 столбца: id, MYFILE (blob), ex_id. Я написал сценарий DEMO, который позволял бы снимать фотографию во второй базе, в столбец снимков в формате base 64 и записывать ответ JSON. Но я не могу отладить этот скрипт вообще, могу ли я отредактировать его, чтобы сделать все фотографии в al oop, я не мог сделать это сам, я был бы благодарен за вашу помощь)

этот скрипт работает только для одной записи (где id = 196041;)

Declare     
v_clob_post     CLOB;
v_clob          CLOB;
l_body_b        BLOB;
g_EXTERNAL_ID  varchar2(300);   
v_count int;
BEGIN 
select MYFILE INTO l_body_b from PHOTO  where id = 196041;
    apex_json.initialize_clob_output;
    apex_json.open_object;
    apex_json.write('snapshot', blob_to_clob_base64(l_body_b)); 
    apex_json.close_object;
    V_clob  := apex_json.get_clob_output;
    apex_json.free_output;



                    apex_web_service.g_request_headers(1).name := 'Content-Type';  
                    apex_web_service.g_request_headers(1).value := 'application/json';  
                    v_clob_post  := apex_web_service.make_rest_request(p_url => 'myURL',p_http_method => 'POST'
                    ,p_body =>  v_clob );
 apex_json.parse(v_clob_post);     
 g_EXTERNAL_ID := apex_json.get_varchar2(p_path => 'id_document'); -- Obtain access_token
update PHOTO set EXTERNAL_ID = g_EXTERNAL_ID where id = 196041;

end;

Я хочу сделать это для всех таблиц, базу которых я хочу записать, именно в столбце Снимок. И только в цикле, чтобы сделать все фотографии одновременно

1 Ответ

2 голосов
/ 25 марта 2020

Как представляется, для обработки вам нужны априорные знания о photo_ids, поскольку для них не указан источник и вы не используете таблицу фотографий напрямую. В этом случае вы можете выполнить sh, когда захотите, определив и инициализировав коллекцию (массив) и l oop поверх коллекции. Как показано ниже:

Declare     
v_clob_post     CLOB;
v_clob          CLOB;
l_body_b        BLOB;
g_EXTERNAL_ID  varchar2(300);   
v_count int;

  -- define an array to hold Photo ids
  type photo_list_t is 
        table of integer;
  -- define variable and initialize with Photo ids
   photo_list photo_list_t := photo_list_t(196041,196042,106055, ...);
BEGIN 

-- loop through array
   for i in photo_list.first .. photo_list.last
   loop 
      select MYFILE INTO l_body_b from PHOTO  where id = photo_list(i);    
       .
       . place remainder of existing code here. 
       . 
       update PHOTO set EXTERNAL_ID = g_EXTERNAL_ID where id = photo_list(i);
    end loop;

С другой стороны, если вы хотите обработать все фотографии, вы можете просто l oop поверх самой таблицы Photo.

Declare     
v_clob_post     CLOB;
v_clob          CLOB;
l_body_b        BLOB;
g_EXTERNAL_ID  varchar2(300);   
v_count int;

BEGIN 

-- loop through Photos
   for my_photo_rec in 
       (select id, myfile 
          from photo 
       )
   loop 
      l_body_b := my_photo_rec.myfile;  -- or update l_body_b following to my_photo_rec.myfile
       .
       . place remainder of existing code here. 
       . 
       update PHOTO set EXTERNAL_ID = g_EXTERNAL_ID where id = my_photo_rec.id;
    end loop;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...