【问题标题】:Oracle's dbms_metadata.get_ddl for type DIRECTORY: invalid input value for parameter SCHEMA类型 DIRECTORY 的 Oracle dbms_metadata.get_ddl:参数 SCHEMA 的输入值无效
【发布时间】:2020-02-29 07:38:59
【问题描述】:

当我尝试在 pl/sql 块或包过程中调用 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') 时,它会引发错误:

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

【问题讨论】:

  • 目录对象没有架构,因此错误消息似乎是合理的。
  • 如果将包的AUTHID设置为CURRENT_USER,它是否有效?或者,如果您在 get_ddl 调用中指定模式 SYS?

标签: oracle plsql oracle12c dbms-metadata


【解决方案1】:

您需要添加 AUTHID CURRENT_USER 子句 (Docs)

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 子句,我会看到与您报告的相同的错误。

【讨论】:

  • 尝试编译如function GET_EXTTAB_FPATH (i_table_name in varchar2) return varchar2 AUTHID CURRENT_USER我得到:Error(72,79): PLS-00157: Only schema-level programs allow AUTHID
  • 在整个包定义级别设置AUTHID CURRENT_USER 我成功了。见stackoverflow.com/questions/39113926/…
  • 你没有向我们展示你的PLSQL,所以我做了最基本的例子
猜你喜欢
  • 1970-01-01
  • 2016-02-03
  • 2010-10-25
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 2012-09-19
  • 1970-01-01
相关资源
最近更新 更多