Это похоже на ошибку; хотя в MoS нет ни одной из перечисленных в справочной заметке ORA-00900.
Не нравится, когда переменная пути объединяется как часть execute immediate
. Это терпит неудачу:
v_path := '/some/path';
execute immediate 'CREATE OR REPLACE DIRECTORY DIAG_TRACE AS ''' || v_path || '''';
, но это нормально, хотя окончательное утверждение остается тем же:
execute immediate 'CREATE OR REPLACE DIRECTORY DIAG_TRACE AS ''/some/path''';
После некоторого поиска это может быть связано с ошибкой 7036176: " СОЗДАННАЯ ДИНАМИ C ИМЯ ОБЪЕКТА ПОДНИМАЕТ ORA-00900 В 10G И 11G ". Это не совсем то же самое, но близко. Для получения дополнительной информации вам потребуется поискать в моей Oracle поддержке, хотя и не так много.
Вы можете обойти ее с помощью переменной:
declare
v_stmt varchar2(256);
v_path nvarchar2(256);
v_object_exists number;
begin
-- Use the directory Oracle DB provide for tracing.
select VALUE into v_path from V$DIAG_INFO where NAME = 'Diag Trace';
--dbms_output.put_line(v_path);
-- Set up new directory!
select count(*) into v_object_exists from all_objects where object_name = 'DIAG_TRACE' and object_type = 'DIRECTORY';
if v_object_exists > 0 then
execute immediate 'DROP DIRECTORY DIAG_TRACE';
end if;
v_stmt := 'CREATE OR REPLACE DIRECTORY DIAG_TRACE AS ''' || v_path || '''';
dbms_output.put_line(v_stmt);
execute immediate v_stmt;
end;
/
, которая сохраняет повторы строка для его печати, хотя вы, возможно, сделали это только из-за этой проблемы.
Не уверен, почему вы сначала выбрасываете с or replace
, кстати.