Oracle dbms_metadata.get_ddl для типа DIRECTORY: неверное входное значение для параметра SCHEMA - PullRequest
0 голосов
/ 29 февраля 2020

Когда я пытаюсь вызвать 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

1 Ответ

2 голосов
/ 29 февраля 2020

Вам необходимо добавить предложение 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 пункт, я вижу ту же ошибку, как вы сообщаете.

...