For loop 如何编写自动执行查询集的过程

For loop 如何编写自动执行查询集的过程,for-loop,plsql,cursor,procedures,execute-immediate,For Loop,Plsql,Cursor,Procedures,Execute Immediate,我编写了一个过程,将特定模式的所有表的权限授予其他模式 create or replace PROCEDURE GRANTS_PROC IS CURSOR GRANTS_CURSOR IS SELECT 'GRANT SELECT, INSERT, UPDATE, DELETE ON "' ||T.OWNER ||'"."' ||TABLE_NAME ||'" TO '

我编写了一个过程,将特定模式的所有表的权限授予其他模式

  create or replace PROCEDURE GRANTS_PROC

    IS

    CURSOR GRANTS_CURSOR
    IS
        SELECT 'GRANT SELECT, INSERT, UPDATE, DELETE ON "'
        ||T.OWNER
        ||'"."'
        ||TABLE_NAME
        ||'" TO '
        ||(SELECT rtrim(listagg(U.username||',')
         within group (order by U.username),',') USERNAME
         FROM ALL_USERS U
         WHERE U.USERNAME!=T.OWNER
         AND U.USERNAME IN
        ('AAA','BBB','CCC','DDD','EEE','FFF','GGG','HHH','III'))||';' FINAL_TXT
         FROM  ALL_TABLES T
         WHERE T.OWNER IN
        ('AAA','BBB','CCC','DDD','EEE','FFF','GGG','HHH','III')
         ORDER BY T.OWNER,UPPER(T.TABLE_NAME);
    BEGIN
        --DBMS_OUTPUT.PUT_LINE('CURSOR_GRANTS.FINAL_TXT');
        --QRY_TEXT:='ABC';
        FOR CURSOR_GRANTS IN GRANTS_CURSOR
        LOOP
        DBMS_OUTPUT.PUT_LINE(CURSOR_GRANTS.FINAL_TXT);

            EXECUTE IMMEDIATE CURSOR_GRANTS.FINAL_TXT;

        END LOOP;
    END;
/
上述过程已成功编译,但在执行过程中,它没有进入
FOR
循环以运行
EXECUTE IMMEDIATE
块,而是成功编译了PL/SQL过程


如何修复我的过程并使其工作?

所有用户
所有表
都应更改为
DBA\u用户
DBA\u表
,因此我的过程工作正常


因为
all_tables
视图显示了存储过程所有者对其具有特权的表,所以,除非存储过程是由特权用户创建的,或者是已经具有这些授权的用户创建的(使用grant选项,以便他们能够实际授予特权),
所有表中可能没有符合条件的内容。

如果
FOR
循环没有运行,那可能是因为
T.OWNER中的字符串(…
不是有表的用户。这看起来像是伪数据,但要确保真实数据是大写的,就像大多数用户名一样。我只是把它改成了“aaa”、“bbb”等。我已经给出了现有的用户名,即使它不起作用,并且是大写的。查询是否单独返回结果?例如,代码中也有一些拼写错误mple
TXT
应该是
FINAL\u TXT
。仅查询就可以完美地返回结果集。我需要一个接一个地自动执行这些结果集。这是我的目标。我已经对包含
TXT
的行进行了注释。这不是必需的。我只是出于测试目的使用了它。其中仍然有很多不必要的代码。但它确实有用ems希望它可以工作。继续缩小它,直到找到断裂的部分。尝试使用declare/begin/end PL/SQL块而不是过程来简化事情。DBMS_输出是否至少显示了所有内容?