2017-01-02 49 views
1

我在使用Oracle SQL循环两次结果集时遇到了问题。使用游标将结果集保存在变量中

问题

我有一个游标,让我所有的外键给定的表名。使用这个游标的结果,我遍历所有约束并禁用它们。然后我执行数据导入,然后我需要遍历相同的结果集并启用它们。

CURSOR c_fkeys_inn(tabellnavn IN VARCHAR2) 
IS 
    SELECT table_name,constraint_name, status 
    FROM user_constraints 
    WHERE (r_constraint_name,r_owner) IN 
    (SELECT constraint_name, owner 
    FROM user_constraints 
    WHERE owner ='POP' 
    AND table_name=upper(tabellnavn) 
) 
    AND STATUS = 'ENABLED'; 

我想这样做

我的大脑直接跳转到一个变量。我想只执行一次游标,然后将游标的结果保存到变量中。

这是可能的,或者是有什么我做保存从游标和循环事半功倍的效果?

回答

2

请尝试此代码。我已经修改了你的代码,只显示约束的表名。您可以根据需要修改plsql的结束部分。如果您遇到任何错误或问题,请发表评论,谢谢。

CREATE or replace PROCEDURE a_proc(name_table varchar) 
AS 
CURSOR c_fkeys_inn(tabellnavn IN VARCHAR2) 
IS 
SELECT table_name,constraint_name, status 
FROM user_constraints 
WHERE STATUS = 'ENABLED' 
AND TABLE_NAME=tabellnavn; 

names_t c_fkeys_inn%ROWTYPE; 
TYPE c_fkeys IS TABLE OF names_t%TYPE; 
fkeys c_fkeys; 
BEGIN 
OPEN c_fkeys_inn(name_table); 
FETCH c_fkeys_inn BULK COLLECT INTO fkeys; 
CLOSE c_fkeys_inn; 

FOR indx IN 1..fkeys.COUNT LOOP 
DBMS_OUTPUT.PUT_LINE(fkeys(indx).table_name); 
END LOOP; 
END a_proc; 

要运行代码,请运行一个单独的plsql块。请在下面找到一个简单的示例plsql块。

begin 
a_proc('SUPPLIER'); 
END; 
+0

是。这工作正常。你介意解释你如何创建变量? – Stene

+1

您需要创建一个与上面提到的游标对应的表类型。一旦你创建了类型,你需要一次性将所有的光标记录存储到类型中,这可以使用批量收集来实现。批量收集检索所有行并将它们加载到集合中并切换回PL/SQL引擎。一旦存储了所有的行,我们可以使用循环概念在类型和显示内进行遍历或者执行必要的操作。对于迟到的回复(由于时间差距:),抱歉) –

相关问题