create or replace procedure grant_prc is
  cursor grant_audit is
  select table_name,grantor,grantee,privilege from dba_tab_privs where owner=upper('pcisetl');
  v_privilege       varchar2(400);
  v_grantee         varchar2(400);
  v_table_name      varchar2(200);
  v_grantor         varchar2(200);
begin
    open grant_audit;
    loop
    fetch grant_audit into v_table_name,v_grantor,v_grantee,v_privilege;
    exit when grant_audit%NOTFOUND;
    execute immediate 'grant '||v_privilege||' on '||v_grantor||'.'||v_table_name||' to '||v_grantee ||';';
    end loop;
    close grant_audit;
    return;
end grant_prc;
/请问这个procedure有什么问题没有呢,我执行的时候就是不出结果,请帮助

解决方案 »

  1.   

    select table_name,grantor,grantee,privilege from dba_tab_privs where owner=upper('pcisetl') for update;
    试试
      

  2.   

    where owner=upper('pcisetl')改成:
    where owner='||upper('pcisetl')||';
      

  3.   

    加个输出,看看是哪个地方没执行
    begin
        open grant_audit;
        dbms_output.put_line(grant_audit%rowcount);
        loop
        fetch grant_audit into v_table_name,v_grantor,v_grantee,v_privilege;
        exit when grant_audit%NOTFOUND;
        dbms_output.put_line(grant '||v_privilege||' on '||v_grantor||'.'||v_table_name||' to '||v_grantee ||';');
        execute immediate 'grant '||v_privilege||' on '||v_grantor||'.'||v_table_name||' to '||v_grantee ||';';
        end loop;
        close grant_audit;
        return;
    end grant_prc;
      

  4.   

    你想要什么结果?
    你在SQL Command窗口执行时,先set serveroutput on
    再执行存储过程吧
      

  5.   

    SQL> set serveroutput on
    SQL> exec grant_prc;PL/SQL procedure successfully completed
    实际上我是想在procedure中批处理授权的。
    可是执行还是没有输出哦。create or replace procedure grant_prc is
      cursor grant_audit is
      select table_name,grantor,grantee,privilege from dba_tab_privs where owner='upper(system)';
      v_privilege       varchar2(400);
      v_grantee         varchar2(400);
      v_table_name      varchar2(200);
      v_grantor         varchar2(200);
    begin
        open grant_audit;
        loop
        fetch grant_audit into v_table_name,v_grantor,v_grantee,v_privilege;
        exit when grant_audit%NOTFOUND;
        --dbms_output.put_line('succeed'grant_audit);       execute immediate 'grant '||v_privilege||' on '||v_grantor||'.'||v_table_name||' to '||v_grantee ||';';
           dbms_output.put_line('grant' ||','||v_privilege||' on '||v_table_name||' to '||v_grantee);    end loop;
        close grant_audit;
        return;
    end grant_prc;
      

  6.   

    execute immediate 'grant '||v_privilege||' on '||v_grantor||'.'||v_table_name||' to '||v_grantee ||';';
          看来主要是这句话有问题,可是我看不出啊,继续求助
      

  7.   

    因为你的cursor根本没数据,执行到
    exit when grant_audit%NOTFOUND;
    就exit了,哪里有数据阿~~楼主写错了,应该这样用upper。
    select table_name,grantor,grantee,privilege from dba_tab_privs where owner=upper('system');
    不是这样
    select table_name,grantor,grantee,privilege from dba_tab_privs where owner='upper(system)';
      

  8.   

    报错:
    execute immediate 'grant '||v_privilege||' on '||v_grantor||'.'||v_table_name||' to '||v_grantee ||';';这一行有:
    SQL> exec grant_prc;begin grant_prc; end;ORA-00911: invalid character
    ORA-06512: at "SYSTEM.GRANT_PRC", line 16
    ORA-06512: at line 1
      

  9.   

    将上面execute注释掉之后,可以输出结果的
      

  10.   

    Procedure created.SQL> exec grant_prc
    grant EXECUTE on SYSTEM.ACTION_INPUT_DATA_NST to PUBLIC;
    BEGIN grant_prc; END;*
    ERROR at line 1:
    ORA-00911: invalid character
    ORA-06512: at "APPS.GRANT_PRC", line 14
    ORA-06512: at line 1
    SQL> grant EXECUTE on SYSTEM.ACTION_INPUT_DATA_NST to PUBLIC;
    grant EXECUTE on SYSTEM.ACTION_INPUT_DATA_NST to PUBLIC
                            *
    ERROR at line 1:
    ORA-01031: insufficient privileges
    SQL> insufficient privileges 你要grant必须要有足够的权限,请问楼主有没有把权限grant 给 procedure??
      

  11.   

    SQL> grant execute on system.grant_prc to public;Grant succeededSQL> set serveroutput on size 1000000
    SQL> exec grant_prc;begin grant_prc; end;ORA-00911: invalid character
    ORA-06512: at "SYSTEM.GRANT_PRC", line 16
    ORA-06512: at line 1
    而且我就是用这个procedure的属主授权的哦
      

  12.   

    create or replace procedure grant_prc is
      cursor grant_audit is
      select table_name,grantor,grantee,privilege from dba_tab_privs where owner='upper(system)';
      v_privilege       varchar2(400);
      v_grantee         varchar2(400);
      v_table_name      varchar2(200);
      v_grantor         varchar2(200);
      str long;
    begin
        open grant_audit;
        loop
        fetch grant_audit into v_table_name,v_grantor,v_grantee,v_privilege;
        exit when grant_audit%NOTFOUND;
        --dbms_output.put_line('succeed'grant_audit);
       str:='grant '||v_privilege||' on '||v_grantor||'.'||v_table_name||' to '||v_grantee ||';';
           dbms_output.put_line('str='||str);
        end loop;
        close grant_audit;
        return;
    end grant_prc;
    把str输出出来手动执行下,看语句错哪了。
      

  13.   

    SQL> set serveroutput on size 10000000
    SQL> exec grant_prc;PL/SQL procedure successfully completed没有输出哦
      

  14.   

    grant_audit%rowcount有值么?输出来看看
      

  15.   

    对于procedure的调用外部的函数,方法等,比如user A 要调用user B的一个方法pro,那么在授权的时候不能仅仅把pro的权限授予给A,而是要不pro这个方法中关联调用的所有方法进行授权才行.
      

  16.   

    SQL> set serveroutput on size 1000000
    SQL> exec grant_prc;
    0PL/SQL procedure successfully completed可以不可能霉雨结果的,这个存储过程定位到用户system的。
    create or replace procedure grant_prc is
      cursor grant_audit is
      select table_name,grantor,grantee,privilege from dba_tab_privs where owner='SYSTEM';
      v_privilege       varchar2(400);
      v_grantee         varchar2(400);
      v_table_name      varchar2(200);
      v_grantor         varchar2(200);
    begin
        open grant_audit;
        dbms_output.put_line(grant_audit%rowcount);   --查看复合条件的记录数
        loop
        fetch grant_audit into v_table_name,v_grantor,v_grantee,v_privilege;
        exit when grant_audit%NOTFOUND;
        --dbms_output.put_line('succeed'grant_audit);       --execute immediate 'grant '||v_privilege||' on '||v_grantor||'.'||v_table_name||' to '||v_grantee ||';';
           dbms_output.put_line('grant ' ||v_privilege||' on '||v_table_name||' to '||v_grantee||';');    end loop;
        close grant_audit;
        return;
    end grant_prc;