【问题标题】:Oracle Procedure甲骨文程序
【发布时间】:2011-03-30 08:37:03
【问题描述】:
create or replace function gen.sample_func(owner varchar2) return varchar2 
    as 
     data_t varchar2(10); 
      cursor cur is   select  data_type  from  SYS.DBA_TAB_COLUMNS;
      begin  
        open cur;
          dbms_output.put_line('Done'); 
        close cur; 
        return data_t;  
    end sample_func;

在编译上述函数时,我得到以下错误

Warning: compiled but with compilation errors
Errors for FUNCTION sample_func

LINE/COL                                                                        
--------------------------------------------------------------------------------
ERROR                                                                           
--------------------------------------------------------------------------------
4/8                                                                             
PLS-00201: identifier 'DBA_TAB_COLUMNS' must be declared                        

4/8                                                                             
PL/SQL: Item ignored                                                            

7/15                                                                            
PLS-00320: the declaration of the type of this expression is incomplete or malfo
rmed                                                                            

7/8                                                                             
PL/SQL: Statement ignored                                                       

当我在游标中单独执行select 语句时,我没有收到此错误。 请帮我解决这个问题。

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    您的用户需要被授予 SELECT ON DBA_TAB_COLUMNS。

    请注意,通过角色授予将不起作用 - 它需要直接授予用户才能创建函数/过程。

    【讨论】:

      【解决方案2】:

      在定义者权限存储过程(例如您正在创建的存储过程)中,在解析对象名称时,仅考虑直接授予过程所有者的权限。不考虑通过角色授予的权限。我敢打赌,您的过程的所有者已被授予通过角色而不是直接授予访问DBA_TAB_COLUMNS 视图的权限。您需要让 DBA 直接向拥有您的过程的用户授予对 DBA_TAB_COLUMNS 的访问权限。

      您可以快速测试这是否真的是您遇到的问题。在 SQL*Plus 中,输入命令

      SQL> set role none;
      

      然后运行您的 SELECT 语句。如果您收到相同的权限错误,那么问题是您通过角色获得了授权。禁用角色意味着您的交互式会话正在以与您的存储过程相同的权限运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-05
        • 2011-07-19
        • 2014-09-11
        相关资源
        最近更新 更多