【问题标题】:Saving result set in variable using a cursor使用游标将结果集保存在变量中
【发布时间】:2017-01-02 12:04:28
【问题描述】:

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

我想做的事

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

这可能吗?或者我可以做些什么来保存光标的结果并循环两次?

【问题讨论】:

    标签: sql oracle cursor


    【解决方案1】:

    请尝试此代码。我已经修改了您的代码以仅显示约束的表名。您可以根据需要修改 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;
    

    【讨论】:

    • 是的。这工作正常。您介意解释一下如何创建变量吗?
    • 你需要创建一个与上面提到的游标对应的表类型。一旦你创建了类型,你需要一次性将所有游标记录存储到类型中,这可以使用 Bulk collect 来实现。批量收集检索所有行并将它们加载到集合中并切换回 PL/SQL 引擎。一旦存储了所有行,我们就可以使用循环概念在类型中遍历并显示或执行必要的操作。抱歉回复晚了(由于时间差:))
    猜你喜欢
    • 1970-01-01
    • 2021-03-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多