2012-09-04 12 views
5

Necesito un método generalizado para obtener la lista de parámetros de tiempo de ejecución (valores) cuando llamo a un procedimiento. Necesito algo similar a $$ PLSQL_UNIT que devuelve el nombre del procedimiento en ejecución. (plsql Oracle 10g)oracle plsql: recuperar los valores de los parámetros de tiempo de ejecución cuando se llama a un procedimiento

P. ej. Mira a este procedimiento de ejemplo: (simplemente imprime su propio nombre y parámetros)

CREATE OR REPLACE PROCEDURE MY_PROC(ow in varchar2, tn IN varchar2) 
IS 

BEGIN 
    dbms_output.put_line('proc_name: '||$$PLSQL_UNIT||' parameters: '|| ow||' '||tn ); 

    EXCEPTION 
    WHEN OTHERS THEN 
     DBMS_OUTPUT.PUT_LINE('ERRORE: ' ||SQLERRM); 

END MY_PROC; 
/

procedimiento de rodaje produce el siguiente resultado:

SQL> 
    1 BEGIN 
    2  IBAD_OWN.MY_PROC('first_par', 'second_par'); 
    3 END; 
    4/

proc_name: MY_PROC parameters: first_par second_par 

PL/SQL procedure successfully completed. 

no me satisface porque no puedo copiar y pegar en todos mis procedimientos porque tengo que codificar cada procedimiento para establecer sus variables de parámetro correctas.

Gracias de antemano por la ayuda.

+1

posible duplicado de http://stackoverflow.com/questions/12160928/get-a-parameters-name/? – tbone

+0

sí, creo que es la misma pregunta. Ambos sin respuesta :(Creo que no hay forma de obtener valor de los parámetros :( – tortugone

+1

No creo que sea la misma pregunta. Estás pidiendo el valor de un parámetro sin saber su nombre. en una respuesta ahora eliminada, y en la pregunta vinculada encontrar el nombre de un parámetro es fácil pero no el valor de ese parámetro. – Ben

Respuesta

2

No es posible recuperar dinámicamente los valores de los parámetros pasados ​​a un procedimiento en Oracle PL/SQL. El lenguaje simplemente no está diseñado para manejar este tipo de operación.

Por cierto, en un procedimiento que se encuentra dentro de un paquete, $$PLSQL_UNIT solo devolverá el nombre del paquete. Encuentro que es mejor definir una constante con nombre constante dentro de cada procedimiento que contiene el nombre del procedimiento.

1

Cuando quería la misma funcionalidad que la tuya, no encontré ninguna buena solución incorporada.

Lo que hice fue: escribió el disparador de nivel de DB que modifica el cuerpo original de la función/procedimiento/paquete. Este disparador se agrega inmediatamente después de "comenzar" una pieza de código generada dinámicamente desde "user_arguments".

Además, después de eso incluyo en este disparador el código, que registra llamadas de procs cuando se produce una excepción.

Además, puede rastrear llamadas de procs, y muchas más cosas intersticiales.

Pero esta solución funciona bien solo para preproducción porque el rendimiento disminuye drásticamente.

PS. Perdón por mi mal ingles.

+0

¿Podría publicar su código? – Jesse

Cuestiones relacionadas