Domanda

Ho una serie di procedure pl/sql la cui esecuzione può richiedere diversi minuti.Durante lo sviluppo, ho aggiunto alcune istruzioni print per facilitare il debug e fornire anche feedback e indicatori di progresso.Inizialmente, li ho eseguiti su piccoli set di prova e l'output è stato quasi istantaneo.Ora che sto testando con set di test più grandi che richiedono diversi minuti per essere eseguiti, trovo che la stampa sulla console non sia più adatta, perché non viene stampato nulla fino al termine della procedura.Sono abituato a lavorare in ambienti che non memorizzano nel buffer l'output e non lo stampano immediatamente ed è comune aggiungere semplici istruzioni di stampa per un semplice debugging e diagnostica.

È possibile in pl/sql stampare immediatamente l'output (non bufferizzato)?In caso negativo, quali alternative consigliano le persone per ottenere un risultato simile?

È stato utile?

Soluzione

Si può avere una procedura che scrive messaggi a un tavolo con una transazione qualcosa di autonomo come:

procedure log (p_message)
is
    pragma autonomous_transaction;
begin
    insert into message_log (user, datetime, message)
    values (user, sysdate, p_message);
    commit;
end;

Quindi monitorare la tabella da un'altra sessione di Oracle.

Altri suggerimenti

abbiamo un piccolo trucco per questo.

è possibile utilizzare DBMS_APPLICATION_INFO.set_client_info ( "qualche informazione qui"); la creazione di alcune variabili e sostituire la stringa dentro "".

e utilizzare selezionare client_info da v $ session per monitorare i progressi.

Sto usando dbms_pipe per questo scopo.Invia messaggi a una pipe denominata e leggili da un'altra sessione.Questo metodo potrebbe non funzionare in un ambiente RAC quando i processi di scrittura e lettura potrebbero connettersi a un nodo diverso.

In alternativa è possibile inserire messaggi in una tabella utilizzando una procedura che viene eseguita nella propria sessione utilizzando "pragma autonomo_transaction".Puoi interrogare questi messaggi da un'altra sessione

Modificare:Vedo che la mia seconda opzione è già stata menzionata.

Ci sono generalmente due opzioni:

  • Invia l'output a una tabella Oracle (O tabella temporanea)
  • Scrivi alla (host del database) filesystem con UTL_FILE

Se non si ha accesso sistema operativo per l'host del database, si può ancora scrivere al filesystem dbhost e legare una tabella esternamente definito Oracle per il file in modo che possa essere interrogato con un SELECT.

Potrebbe dipendere dal vostro strumento client. Non ho usato SQL * Plus in un po ', ma quando sto debug procedure in PL / SQL Developer, ho aprire una finestra di comando e di emettere un comando SET SERVEROUTPUT ON. Poi, quando eseguo la procedura, qualcosa di stampato da DBMS_OUTPUT.PUT_LINE si presenta subito.

Modifica: hai ragione, credo Stavo solo vedendo che con grandi quantità di output o qualcosa del genere. Comunque ho fatto un po 'di ricerca on-line e sono imbattuto in questo log4plsql -. Può essere utile

Un'alternativa è quella di utilizzare una funzione pipeline che restituisce le informazioni di registrazione. Vedi qui per un esempio: http: //berxblog.blogspot. com / 2009/01 / pipeline-funzione-vs-dbmsoutput.html Quando si utilizza una funzione di pipeline non è necessario utilizzare un altro SQLPLUS / Toad / SQL developer, ecc ... a sessione.

È possibile utilizzare DBMS Tubo e il visualizzatore di tubo in PL / SQL Developer per catturare in modo asincrono tutte le informazioni come sono messi nel tubo.

Fare attenzione a solo mettere le cose in un tubo quando c'è qualcuno a leggerlo. In caso contrario, la chiamata avrà esito negativo quando il tubo è pieno.

C'è anche la possibilità di utilizzare gli eventi, PL / SQL Developer ha un evento monitorare pure. E i documenti dovrebbero fornire un esempio di come farlo.

Un'altra opzione è quella di avere il vostro / SQL chiamata PL una procedura per inviare una e-mail con il messaggio di log in esso. Ciò richiede che il database è l'invio di e-mail capacità, che può essere aggiunto tramite UTL_SMTP.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top