2014-12-11 8 views
5

Ho un problema nel creare attività addm su un database remoto.Oracle PL/SQL. DBMS_UTILITY.EXEC_DDL_STATEMENT e DBMS_ADVISOR.create_task

BEGIN 
[email protected](
    ' 
    begin 
     DBMS_ADVISOR.create_task (
      advisor_name  => ''ADDM'', 
      TASK_NAME   => ''15991_16109_AWR_SNAPSHOT_T1'', 
      TASK_DESC   => ''Advisor for snapshots 15991 to 16109.''); 
    end; 
    ' 
); 
END; 

esecuzione anche a livello locale sul database di destinazione non porta al risultato.

BEGIN 
DBMS_UTILITY.EXEC_DDL_STATEMENT(
    ' 
    begin 
     DBMS_ADVISOR.create_task (
      advisor_name  => ''ADDM'', 
      TASK_NAME   => ''15991_16109_AWR_SNAPSHOT_T1'', 
      TASK_DESC   => ''Advisor for snapshots 15991 to 16109.''); 
    end; 
    ' 
); 
END; 

Ma esecuzione localmente sul database di destinazione senza DBMS_UTILITY.EXEC_DDL_STATEMENT e correggere le citazioni funziona:

begin 
     DBMS_ADVISOR.create_task (
      advisor_name  => 'ADDM', 
      TASK_NAME   => '15991_16109_AWR_SNAPSHOT_T1', 
      TASK_DESC   => 'Advisor for snapshots 15991 to 16109.'); 
end; 

non v'è alcun problema con il collegamento, dblinks, borse di studio degli utenti ecc ... Il problema con DBMS_UTILITY. EXEC_DDL_STATEMENT. Le virgolette sembrano essere corrette, ho controllato usando DBMS_OUTPUT.PUT_LINE.

Qualche idea? Grazie.

+0

Perché non si sta chiamando DBMS_ADVISOR nel database remoto? – Ben

+0

Ho bisogno di raccogliere report da un gran numero di basi in un database di monitoraggio. Creare un report. Creazione di una vista temporanea nel database remoto. Obtainig da remoto visualizza un report e lo salva nel database di monitoraggio. Elimina la vista temporanea. Base remota non dovrebbe contenere codice eseguibile, solo un utente con sovvenzioni. Allo stesso modo, ottengo l'AWR, e ASH riporta un modo leggermente diverso attraverso le informazioni dbink sull'hardware, il sistema operativo, il database ... e funziona perfettamente. –

risposta

1

DBMS_UTILITY.EXEC_DDL_STATEMENT non esegue blocchi anonimi.

Nel prospetto che segue dovrebbe sollevare un errore, ma non è così:

begin 
    [email protected](' 
     declare 
      v_number number; 
     begin 
      v_number := 1/0; 
     end; 
    '); 
end; 
/

Ecco il modo corretto di chiamare una procedura su un collegamento datbase:

begin 
     [email protected](
      advisor_name  => 'ADDM', 
      TASK_NAME   => '15991_16109_AWR_SNAPSHOT_T1', 
      TASK_DESC   => 'Advisor for snapshots 15991 to 16109.'); 
end; 
/

Se è necessario eseguire più passi, e hanno bisogno di qualcosa come un blocco anonimo, dovrai creare una procedura temporanea, chiamarla e quindi eliminarla. Per aiutarti a mantenere il tuo equilibrio quando c'è così tanto nidificazione, usa il meccanismo di quotazione alternativo invece di raddoppiare le virgolette.

begin 
    --You may want to use a sequence in the name to ensure uniqueness. 
    [email protected](q'< 
     create or replace procedure temp_procedure is 
     begin 
      dbms_advisor.create_task(
       advisor_name  => 'ADDM', 
       TASK_NAME   => '15991_16109_AWR_SNAPSHOT_T2', 
       TASK_DESC   => 'Advisor for snapshots 15991 to 16109.'); 
     end; 
    >'); 

    --Don't call this again or you may receive: 
    --"ORA-04062: timestamp of procedure ... has been changed" 
    execute immediate 'begin [email protected]; end;'; 

    [email protected]('drop procedure temp_procedure'); 
end; 
/