• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 803
  • Last Modified:

Printing Values of Bind Variables

I have PL/SQL package where in I am executing the dynamic insert as shown below
--code snippet
v_ins_sql:=
' INSERT INTO tablea 
(col1, col2)
VALUES
(:1,
:2)
 
--p_col1_value, p_col2_value values are passed as parameters to procedure
EXECUTE IMMEDIATE v_ins_sql
USING (p_col1_value, p_col2_value);
 
DBMS_OUTPUT.PUT_LINE(v_ins_sql);
--------------------------------------------------
 
--problem statement
Now, I have log table where in I have to insert the v_ins_sql string along with values.
But I am not getting values of p_col1_value, p_col2_value when I print DBMS_OUTPUT.PUT_LINE(v_ins_sql);
 
I get this 
INSERT INTO tablea (col1, col2) VALUES (:1, :2)
 
I wish to see the values of :1 and :2 and store in log table?
Is this doable in PL/SQL?

Open in new window

0
ajexpert
Asked:
ajexpert
  • 5
  • 4
1 Solution
 
lwadwellCommented:
Hi ajexpert,

try doing

DBMS_OUTPUT.PUT_LINE(':1=" || p_col1_value || ' :2=' || p_col2_value);

lwadwell
0
 
lwadwellCommented:
sorry ... quotes not quite right

DBMS_OUTPUT.PUT_LINE(':1=' || p_col1_value || ' :2=' || p_col2_value);
0
 
mrjoltcolaCommented:
Rather than peppering log statements all over your code, and doing your own log/audits, why not use the builtin Oracle features? You can configure Oracle to log statements as well as bind variable values, and you can do it on a fine-grained per table basis.
The danger is using your own logging is unless you catch exceptions, a log statement may cause your overall procedure / transaction to fail.

0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
ajexpertAuthor Commented:
I want to insert the sql statement not using DBMS_OUTPUT.PUT_LINE.
something like
 

' INSERT INTO tablea 
(col1, col2)
VALUES
(:1,
:2)
-----------------------
I wish to store the entire string along with bind variables values and not printing bind variable values separately
 

Open in new window

0
 
ajexpertAuthor Commented:
@mrjoltcola
This is one of the package we are developing which requires this logging.
I cannot alter oracle configuration because of this package.
0
 
lwadwellCommented:
How do you want it look in your log table?  Although I support mrjoltcola's suggestion of using Oracle's built in features.

Using bind variable's (which is good for performance) - the actual values are only resolved at time of execution and will never be part of the executed SQL string.

It would be possible to put replace() or similar functions in place to do the substitution for logging ... or you could concatenate them onto the end ... what is your requirement?
0
 
ajexpertAuthor Commented:
My requirement is
suppose I get parameter values as '
p_col1_value = 'test1'
p_col2_value = 100000  
My insert statement should go in log table like this

INSERT INTO tablea 
(col1, col2)
VALUES
('test1',
100000)

Open in new window

0
 
lwadwellCommented:
REPLACE(REPLACE(sql_str,':1',p_col1_value),':2',p_col2_value) would get you close ... except 'test1' would not be quoted.

REPLACE(REPLACE(sql_str,':1','''' || p_col1_value || ''''),':2',p_col2_value) would have the quotes included.
0
 
ajexpertAuthor Commented:
too much of homework I think...
is there any simple way?
I am ok even if I have to just log the statement after EXECUTE IMMEDIATE;
0
 
ajexpertAuthor Commented:
Though I didnt implented it, but I got another idea.  Thanks anyways
0

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

  • 5
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now