如何编写一个程序来自动执行一组查询

时间:2015-11-17 13:55:45

标签: 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 '
        ||(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过程已成功编译。

如何修复我的程序并使其有效?

1 个答案:

答案 0 :(得分:0)

All_USERSALL_TABLES应更改为DBA_USERSDBA_TABLES,因此我的程序有效。

因为all_tables视图显示存储过程的所有者具有特权的表,所以,除非存储过程是由特权用户创建的,或者是已经拥有这些授权的用户(具有授权)选项,所以他们实际上可以给予特权),all_tables中可能没有任何资格。