在存储过程中编译时,dbms_datapump.get_dumpfile_info无法读取目录

时间:2018-11-20 18:35:56

标签: oracle plsql directory datapump

我正在创建一个存储过程来加载(impdp)Datapump数据库转储。

我正在尝试使用DBMS_DATAPUMP.GET_DUMPFILE_INFO,like in this example来获取转储文件的创建日期(与以前加载的转储的日期进行比较)。

在匿名块中运行时(如下所示),它运行良好,并输出转储文件的创建日期。但是,当在存储过程中修改并编译同一块时,出现ORA-39087错误(目录名称无效)。

DECLARE 
  dumpfile VARCHAR2(256) := 'my_file.dp';
  dir VARCHAR2(30) := 'MY_DIR';
  info ku$_dumpfile_info;
  ft NUMBER;
BEGIN
  sys.dbms_datapump.get_dumpfile_info(dumpfile, dir, info, ft);
  FOR rec IN (SELECT * FROM TABLE (info) WHERE item_code = 6 ) LOOP 
    dbms_output.put_line(rec.value);
  END LOOP;
END;

目录存在。名称有效。当我运行

SELECT * FROM datapump_dir_objs;

使用同一用户,我可以看到该用户在目录上具有READ和WRITE特权。 Oracle版本是11g 11.2.0.4.0。

有没有发现我做错了什么?

谢谢。

1 个答案:

答案 0 :(得分:0)

问题是目录上的READ和WRITE特权是通过角色添加的。默认情况下,匿名块是使用当前用户的权限执行的,但存储过程则不会。

我在过程的标题中添加了AUTHID CURRENT_USER,并设法访问了我的目录。

感谢Alex Poole的见识。