Oracle 的 dbms_metadata.get_ddl 类型 DIRECTORY:参数 SCHEMA 的输入值无效
Oracle's dbms_metadata.get_ddl for type DIRECTORY: invalid input value for parameter SCHEMA
当我尝试在 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 子句 (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 子句,我会看到与您报告的相同的错误。
当我尝试在 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 子句 (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 子句,我会看到与您报告的相同的错误。