Логика моей хранимой процедуры, курсоры Loop - PullRequest
0 голосов
/ 24 июня 2019

Посмотрим, смогу ли я это прояснить. В основном, что я хочу сделать, и я не знаю, как это: внутри моего цикла, как я могу перебрать эти 2 курсора? После извлечения этих строк я хочу вставить эти две таблицы, как вы можете видеть во фрагменте:

 CREATE OR REPLACE PROCEDURE add_docs

     IS

       dom_doc       DOM_DOCUMENT.DOMAIN_DOC%TYPE;
       type_doc_pk   TYPE_DOCS.TYPE_DOC_PK%TYPE;
       type_doc      TYPE_DOCS.TYPE_DOCUMENT%TYPE;
       user_code     TYPE_DOCS.USERCODE%TYPE;
       result_code   ECM_TIPO_DOCS.CODIGO_RESULTADO%TYPE;
       LS_LOCAL      INTEGER;
       l_id          INTEGER;

    cursor get_local
        is
        SELECT ls_local_pk FROM rt_local_ls

        rc_loc   c_loc%ROWTYPE;


cursor get_docs 
    is
    SELECT DOM_DOCUMENT.DOMAIN_DOC INTO dom_doc,
            TYPE_DOCS.TYPE_DOC_PK INTO type_doc_pk,
            TYPE_DOCS.TYPE_DOCUMENT INTO type_doc,
            TYPE_DOCS.USERCODE INTO user_code,
            TYPE_DOCS.CODE_RESULT INTO result_code
      FROM TYPE_DOCS 
        JOIN DOM_TDOC_SIS 
               ON TYPE_DOCS.TYPE_DOC_PK = DOM_TDOC_SIS.TYPE_DOC_PK
         JOIN DOM_DOCUMENT 
              ON DOM_TDOC_SIS.DOMAIN_DOC_PK = DOM_DOCUMENT.DOMAIN_DOC_PK
         WHERE DOM_DOCUMENT.DOMAIN_DOC_PK IN (2, 10) 
          AND NOT EXISTS
                 (
                  SELECT 1
                    FROM TP_DOC_MAP
                   WHERE  TP_DOC_MAP.LS_LOCAL_PK = LS_LOCAL        ----this is the variable that i have to iterate it's what i am getting from the other cursor
                          AND TP_DOC_MAP.LS_SYSTEM_PK = 3 
                         AND TP_DOC_MAP.ACTIVE = 1 
                         AND TP_DOC_MAP.CODE = TYPE_DOCS.TYPE_DOC_PK 
                );


BEGIN

    OPEN get_local;

    FETCH get_local INTO rc_loc

    IF get_local%FOUND
      THEN
           for md_local in get_local

           LOOP

           OPEN get_docs;

           FETCH get_docs INTO....


           ---now this is where i don't know how to do inside this loop i want to repeat the cursor get_docs  for each row in the cursor get_local
           --and then insert with the values fetched for each iteration


             INSERT INTO TP_DOC VALUES (  
              type_doc_pk,               
              type_doc,                     
              1,                    
              SYSDATE,             
              NULL)
              RETURNING id INTO l_id;


              INSERT INTO TP_DOC_MAP VALUES (
              l_id,
              LS_LOCAL,
              3,
              type_doc_pk,
              1,
              sysdate,
              NULL
              );


          END LOOP


      END IF;

END add_docs;

как я могу это сделать? для каждого LS_LOCAL, который существует, он должен будет выполнить выбор

для каждого существующего LS_LOCAL, он должен будет выполнить выборку в курсоре get_docs с переменной LS_LOCAL.

1 Ответ

1 голос
/ 25 июня 2019

Встроенный курсор для циклов FOR является одним из вариантов. Вот как (я удалил нерелевантные части кода, чтобы сделать его максимально простым):

begin
  for cur_l in (select ls_local_pk from rt_local_ls) 
  loop
    for cur_d in (select domain_doc, 
                         type_doc_pk, ...
                  from type_docs join dom_tdoc_sis ...
                 )
    loop
      insert into tp_doc ...
      insert into tp_doc_map ...
    end loop;
  end loop;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...