2010-07-09 11 views
5

È possibile utilizzare all_arguments e all_procedures per elencare le procedure e le funzioni all'interno di un determinato pacchetto e con DBMS_METADATA posso estrarre il DDL per quel pacchetto. Esiste un modo semplice (diverso da molte chiamate di istruzioni e sottostringhe) per ottenere la procedura o il codice sorgente della funzione separatamente per ciascun blocco di codice separato in un pacchetto.Codice sorgente per stored procedure o funzione specifica

Qualcosa del genere:

Proprietario | Nome del pacchetto | Nome oggetto | Sovraccarico | Argomenti | Sorgente

Ovviamente l'uso della sottostringa e dell'istruzione presenterà problemi con funzioni sovraccariche.

All_arguments ha il campo subprogram_id che, secondo la documentazione molto sparsa su di esso, sembra fare riferimento in modo univoco alla procedura a cui è correlato nel pacchetto ma non sembra essere nulla che lo utilizza.

Acclamazioni di anticipo

+0

Qual è il tuo scopo nell'estrazione delle definizioni di funzione? –

+0

Intendevo la definizione in un modo simile a DDL - modificato al codice sorgente per cercare di essere più chiaro che sto cercando di elencare il codice per una specifica procedura o funzione – Chris

+0

"Elenco del codice" come in stampa la funzione da sola alla stampante o isolare in un file? –

risposta

3

IIRC, PLSQL permette pacchetti e funzioni nidificate. In questo caso, scoprirai che "istring" e "substring" potrebbero non essere adeguati per estrarre il codice sorgente, poiché stai affrontando la ricorsione, e le funzioni di stringa in genere gestiscono solo una classe più piccola di calcoli (in genere espressioni regolari). Questo è un problema classico che le persone hanno cercato di analizzare le lingue con una semplice manipolazione delle stringhe. Puoi aggirare i limiti delle funzioni di stringa essenzialmente hackerando il parser di un uomo povero, ma questa può essere una quantità sorprendente di lavoro se vuoi che sia letale, perché devi gestire almeno le regole grammaticali ricorsive che contano per il tuo estrazione.

Un altro modo per ottenere un accesso affidabile agli elementi di un pacchetto PLSQL consiste nell'utilizzare un parser di linguaggio. Il DMS Software Reengineering Toolkit ha un parser PLSQL completo.

Si dovrebbe prima estrarre il testo del pacchetto in un file e quindi applicare il parser PLSQL ad esso; ciò produce internamente un sintattico astratto (AST) nel parser. Dato il nome di una funzione, è piuttosto semplice cercare nell'AST la funzione con un nome corrispondente. Avresti finito con più di un colpo se hai sovraccaricato le funzioni; potresti qualificare la funzione in base alla gerarchia in cui è incorporata o alle informazioni sugli argomenti che potresti avere. Avendo identificato una funzione specifica nell'AST, si può chiedere a DMS di stampare in modo abbastanza preciso quell'albero e rigenerare il testo di (completo di commenti) per quella funzione.

+0

+1, bella risposta, e il puntatore al parser PLSQL. – DCookie

Problemi correlati