Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我的存储过程逻辑,循环游标_Sql_Oracle_Stored Procedures_Plsql - Fatal编程技术网

Sql 我的存储过程逻辑,循环游标

Sql 我的存储过程逻辑,循环游标,sql,oracle,stored-procedures,plsql,Sql,Oracle,Stored Procedures,Plsql,让我们看看我能不能说清楚。基本上我想做什么,我不知道这是怎么做的:在我的循环中,我如何迭代这两个游标?从代码段中可以看到,在获取了要插入到这两个表中的行之后: 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 T

让我们看看我能不能说清楚。基本上我想做什么,我不知道这是怎么做的:在我的循环中,我如何迭代这两个游标?从代码段中可以看到,在获取了要插入到这两个表中的行之后:

 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_本地,必须运行sele


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

嵌入式游标for loops是一个选项。以下是如何(我删除了代码中不相关的部分以使其尽可能简单):


难道你不认为你可以简化你的问题(因此,对于我们所有不知道你的数据的人来说,更清楚)从你的代码中删除无用的信息吗?然后我们可以把重点放在迭代2个游标上。所以我不必以那种方式声明这些游标?我假设我可以在这些for循环中轻松地进行一些验证。例如,在cur_d循环之前,我可以使用一些验证:如果找到get_local%,那么……您可以显式声明它们,但这需要您打开一个游标,创建一个循环,注意退出,关闭游标。。。并不是说这是不可能的,但这种方法更简单,因为Oracle可以为您处理大多数这些事情。至于验证:当然,在两个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;