【问题标题】:Logic of my Stored Procedure, Loop cursors我的存储过程的逻辑,循环游标
【发布时间】:2019-06-24 20:59:40
【问题描述】:

让我们看看我能不能说清楚。基本上我想做什么,但我不知道这是怎么回事:在我的循环中,我如何迭代这两个游标?如您在 sn-p 中看到的那样,在获取这些行后,我想在这两个表中插入:

 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,它必须运行 sele

对于每个存在的 LS_LOCAL,它必须使用 LS_LOCAL 变量在游标 get_docs 中运行选择。

【问题讨论】:

  • 你不认为你可以简化你的问题(因此,对于我们所有不知道你的数据的人来说更清楚)从你的代码中删除无用的信息吗?然后我们可以专注于迭代 2 个游标。

标签: sql oracle stored-procedures plsql


【解决方案1】:

嵌入式游标 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;

【讨论】:

  • 所以我不必以那种方式声明那些游标?我假设我可以轻松地在那些 for 循环中进行一些验证。例如,在 cur_d 循环之前,我可以使用一些验证: IF get_local%FOUND THEN....
  • 你可以明确声明它们,但这需要你打开一个游标,创建一个循环,注意退出,关闭游标......并不是它不能 i> 完成,但这种方式更简单,因为 Oracle 会为您处理大部分这些事情。至于验证:当然,在两个 FOR 语句之间做任何你想做的事情;他们不必立即互相关注。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 2019-04-29
相关资源
最近更新 更多