After Googling a lot and not finding what I'm looking for I decided to ask this question.
I'm using binding variables as demonstrated in this awesome article from 2005 titled The Values That Bind by Mark A. Williams, like this:
OracleParameter p_APP_NAME =
new OracleParameter("p_APP_NAME", OracleDbType.NVarchar2, ParameterDirection.Input);
p_APP_NAME.Size = 50;
p_APP_NAME.Value = log.Application.Name;
cmd.Parameters.Add(p_APP_NAME);
I successfully enabled ODP.NET
debug tracing but one key info that's missing is that the logged SQL statement
doesn't show me what was the value bound to the binding variable.
It's logging OracleCommand.CommandText
but without OracleCommand.Parameters
values. It's showing me this:
TIME:2013/09/20-22:59:21:890 TID:20fc OpsSqlPrepare2(): SQL: UPDATE PS_LOG SET
APP_NAME = :p_APP_NAME,
WHERE LOG_ID = :p_LOG_ID
What I'd really like to see are the actual values that were used in the query sent to the ORACLE server like this:
TIME:2013/09/20-22:59:21:890 TID:20fc OpsSqlPrepare2(): SQL: UPDATE PS_LOG SET
APP_NAME = 'App Name',
WHERE LOG_ID = 777
Am I missing some configuration or this info I want is not available when using ODP.NET
tracing capability?
If this is not built-in I guess I'll have to implement my own substitution method and log the SQL Statement
myself.
I agree with everything posted by Nicholas but would add that beginning with Oracle 10.1 the DBMS_MONITOR PL/SQL Package is the preferred method of enabling/disabling tracing. Though setting the event still works as Nicholas has nicely demonstrated.
As you have observed ODP does not emit bind variable values into its trace file as a security consideration.
As one of the options, you could turn on sql tracing with bind variables dumping by setting 10046 event of level 12 or 4 for a session, either manually or automatically(in a logon trigger for a user for instance):
After that trace file will be generated in a directory specified by
user_dump_dest
parameter.Here is an example:
Among other information presented in a newly generated trace file we could find information about the query, bind variable(s) and its/their values:
You could also, starting from Oracle 10g and up, query
v$sql_bind_capture
dynamic performance view to get information about bind variable(s) and their values:Result: