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;