使用游标将结果集保存在变量中
Saving result set in variable using a cursor
我在使用 Oracle SQL 遍历结果集两次时遇到问题。
问题
我有一个游标,可以让我获取给定 table 名称的所有外键。使用这个游标的结果,我遍历所有约束并禁用它们。然后我执行数据导入,然后我需要循环相同的结果集并启用它们。
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';
我想做什么
我的大脑直接跳到一个变量。我只想执行一次游标,然后将游标的结果保存到一个变量中。
这可能吗?或者我可以做些什么来保存游标的结果并循环两次?
请尝试此代码。我已经巧妙地修改了您的代码以仅显示约束的 table 名称。您可以根据需要修改 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;
我在使用 Oracle SQL 遍历结果集两次时遇到问题。
问题
我有一个游标,可以让我获取给定 table 名称的所有外键。使用这个游标的结果,我遍历所有约束并禁用它们。然后我执行数据导入,然后我需要循环相同的结果集并启用它们。
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';
我想做什么
我的大脑直接跳到一个变量。我只想执行一次游标,然后将游标的结果保存到一个变量中。
这可能吗?或者我可以做些什么来保存游标的结果并循环两次?
请尝试此代码。我已经巧妙地修改了您的代码以仅显示约束的 table 名称。您可以根据需要修改 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;