我正在创建一个存储过程来加载(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。
有没有发现我做错了什么?
谢谢。
答案 0 :(得分:0)
问题是目录上的READ和WRITE特权是通过角色添加的。默认情况下,匿名块是使用当前用户的权限执行的,但存储过程则不会。
我在过程的标题中添加了AUTHID CURRENT_USER
,并设法访问了我的目录。
感谢Alex Poole的见识。