0

当我尝试dbms_metadata.get_ddl('TABLE', 'MYTABLE', 'MYSCHEMA')在 pl/sql 块或包过程中调用时,它工作正常。

当我尝试dbms_metadata.get_ddl('TABLE', 'MYTABLE')在 pl/sql 块或包过程中调用(没有明确提供模式)时,它也可以正常工作。

当我尝试dbms_metadata.get_ddl('DIRECTORY', 'MYDIR')在 pl/sql 块中调用(没有明确提供模式)时,它也可以正常工作。

但,

当我尝试dbms_metadata.get_ddl('DIRECTORY', 'MYDIR', 'MYSCHEMA')在 pl/sql 块或包过程中调用时,它会引发错误:

ORA-31600: invalid input value MYSCHEMA for parameter SCHEMA in function GET_DDL

当我尝试dbms_metadata.get_ddl('DIRECTORY', 'MYDIR')在包过程中调用(没有明确提供架构)时,它会引发错误:

ORA-31603: object "MYDIR" of type DIRECTORY not found in schema "MYSCHEMA"

问题是什么?

EXECUTE_CATALOG_ROLE=true
SELECT_CATALOG_ROLE=true
'CREATE ANY DIRECTORY'=true
PL/SQL Release 12.2.0.1.0 - Production
4

1 回答 1

2

您需要添加 AUTHID CURRENT_USER 子句(文档

create or replace procedure dir_ddl  (dir_name in varchar2) AUTHID CURRENT_USER is
 x clob;
begin
 SELECT DBMS_METADATA.get_ddl ('DIRECTORY', dir_name) into x from dual;
 dbms_output.put_line(x);
end dir_ddl;
/

set serveroutput on
exec dir_ddl('PLSHPROF_DIR')

我的输出是...

Procedure DIR_DDL compiled


   CREATE OR REPLACE DIRECTORY "PLSHPROF_DIR" AS '/home/oracle/profiler'


PL/SQL procedure successfully completed.

如果我删除 AUTHID 子句,我会看到与您报告的相同的错误。

于 2020-02-29T13:19:24.220 回答