2010-07-09 22 views
5

Puedo usar all_arguments y all_procedures para enumerar los procedimientos y funciones dentro de cualquier paquete dado y con DBMS_METADATA puedo extraer el DDL para ese paquete. ¿Existe alguna manera sencilla (aparte de muchas llamadas entrantes y subscritas) de obtener el código fuente del procedimiento o función por separado para cada bloque de código separado en un paquete?Código fuente para el procedimiento almacenado específico o función

Algo como esto:

Propietario | Nombre del paquete | Nombre del objeto | Sobrecarga | Argumentos | Fuente

Obviamente, el uso de subcadena e instring presentará problemas con las funciones sobrecargadas.

All_arguments tiene el campo subprogram_id que, de acuerdo con la escasa documentación en él, parece que hace referencia única a qué procedimiento se relaciona en el paquete pero no parece haber nada que lo use.

Saludos de antelación

+0

¿Cuál es su propósito al extraer definiciones de funciones? –

+0

Quise decir definición de una manera DDL - cambié a código fuente para intentar y ser más claro que estoy tratando de enumerar el código para un procedimiento o función específica – Chris

+0

"Listar el código" como para imprimir la función por sí mismo a la impresora o aislar en un archivo? –

Respuesta

3

IIRC, PLSQL permite paquetes y funciones anidadas. En este caso, encontrará que "instring" y "substring" pueden no ser adecuados para extraer el código fuente, ya que enfrenta la recursión, y las funciones de cadena generalmente solo manejan una clase más pequeña de cálculos (típicamente expresiones regulares). Este es un problema clásico que las personas intentan analizar en los lenguajes con una simple manipulación de cadenas. Puedes esquivar los límites de las funciones de cadena esencialmente pirateando para generar un analizador de pobre, pero esto puede ser una cantidad sorprendente de trabajo si quieres que sea mortal, porque tienes que manejar al menos las reglas gramaticales recursivas que son importantes para ti. extracción.

Otra forma de obtener un acceso confiable a los elementos de un paquete PLSQL es usar un analizador de lenguaje. El DMS Software Reengineering Toolkit tiene un analizador PLSQL completo.

Primero debe extraer el texto del paquete en un archivo y luego aplicarle el analizador PLSQL; que produce un árbol de sintaxis abstracta (AST) internamente en el analizador. Dado el nombre de una función, es bastante fácil buscar en el AST la función con un nombre coincidente. Tendría más de un golpe si tiene funciones sobrecargadas; puede calificar la función por la jerarquía en la que está incrustada o la información sobre los argumentos que podría tener. Habiendo identificado una función específica en el AST, uno puede pedirle a DMS que imprima bastante ese árbol, y regenerará el texto de (complete con comentarios) para esa función.

+0

+1, buena respuesta y el puntero al analizador PLSQL. – DCookie

Cuestiones relacionadas