使用游标将结果集保存在变量中

时间:2017-01-02 12:04:29

标签: sql oracle cursor

我在使用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';

我想做什么

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

这是可能的还是我有什么办法可以保存光标和循环两次的结果?

1 个答案:

答案 0 :(得分: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;