PLS-00201:必须声明标识符UTIL_FILE

时间:2013-11-20 20:20:55

标签: sql oracle

我正在尝试将查询中的数据导出到安装在Windows Server 2008计算机上的Oracle Enterprise Express的csv文件中。

我找到了这个解决方案:

http://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:235814350980

它基本上编写一个函数并使用UTIL_FILE对象来创建和写入文件并添加分隔符。

当我尝试在Oracle SQL Developer中创建函数时收到以下错误:

PLS-00201: identifier UTIL_FILE must be declared. 

当我运行以下命令时:

select owner, object_type from all_objects where object_name = 'UTL_FILE' 

结果是:

OWNER      Object Type
---------  -----------
PUBLIC     SYNONYM

编辑:

跑步:

GRANT EXECUTE ON UTL_FILE TO PUBLIC

给予:

Error starting at line 2 in command:
GRANT EXECUTE ON UTL_FILE TO PUBLIC
Error report:
SQL Error: ORA-00942: table or view does not exist
00942. 00000 -  "table or view does not exist"
*Cause:    
*Action:

有什么问题?

5 个答案:

答案 0 :(得分:12)

似乎对我缺乏特权。通常PUBLIC用户在该程序包上授予EXECUTE权限,但该权限可能会被撤销。

您可以通过发出以下查询来检查PUBLIC是否具有该权限:

SELECT * FROM all_tab_privs WHERE grantee = 'PUBLIC' AND table_name = 'UTL_FILE';

如果没有返回任何行,请尝试将执行权限授予您记录的用户,或授予PUBLIC某些特权用户,例如SYS

GRANT EXECUTE ON SYS.utl_file TO user_name;

修改

您必须在记录时授予权限,例如SYS user。

答案 1 :(得分:1)

默认情况下,用户对UTL_FILE没有执行权限。要使用UTL_FILE,ADMIN用户或实例管理员必须对其明确授予EXECUTE权限,例如在以下示例中:

GRANT EXECUTE ON SYS.UTL_FILE TO scott;

答案 2 :(得分:1)

除了可能缺少其他答案所涵盖的权限之外,您的问题还表明您获得的错误是:

PLS-00201: identifier UTIL_FILE must be declared

这表明您在函数中引用了UTIL_FILE,而不是内置包UTL_FILE。当然,你在编写这个问题时可能会出错,但是你也在文本中使用它,所以如果你不是只复制并粘贴Tom的代码,那么你的代码中的包名可能是错误的

如果你还没有UTL_FILE,你仍然需要{{1}}的执行权限。

答案 3 :(得分:1)

用户:h_djebli在评论中指出,您需要首先以SYS用户身份连接。

要做到这一点,你必须在你的oracle主目录中:

cd $ORACLE_HOME

然后执行:

sqlplus / as sysdba

sqlplus将在您的终端中启动,您将作为SYS用户连接。

您最终可以在sqlplus控制台中编写GRANT命令:

GRANT EXECUTE ON SYS.utl_file TO your_db_username;

答案 4 :(得分:-1)

我们可以通过cmd执行以下步骤:

  1. sysdba登录(connect sys as sysdba,然后以sys_password输入密码)
  2. grant execute on utl_file to <user_name>
  3. 现在我们可以通过查询进行检查了:'SELECT * FROM all_tab_privs WHERE grantee = 'PUBLIC' AND table_name = 'UTL_FILE';'