Skip to content

Commit 36b63dc

Browse files
committed
dbms_output refactor: decouple from the main call
Decouple dbms_output logging implementation from the main begin/end call block. This enables dumping dbms_output even when the database call raises exception.
1 parent 135b10e commit 36b63dc

File tree

1 file changed

+26
-31
lines changed

1 file changed

+26
-31
lines changed

lib/plsql/procedure_call.rb

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,8 @@ def construct_sql(args)
215215
end
216216
add_out_variables
217217

218-
dbms_output_enable_sql, dbms_output_get_sql = dbms_output_sql
219-
220218
@sql = @declare_sql.empty? ? "" : "DECLARE\n" << @declare_sql
221-
@sql << "BEGIN\n" << @assignment_sql << dbms_output_enable_sql << @call_sql << dbms_output_get_sql << @return_sql << "END;\n"
219+
@sql << "BEGIN\n" << @assignment_sql << dbms_output_enable_sql << @call_sql << @return_sql << "END;\n"
222220
end
223221

224222
def add_argument(argument, value, argument_metadata=nil)
@@ -539,49 +537,46 @@ def procedure_name
539537
@procedure_name ||= @procedure.procedure
540538
end
541539

542-
def dbms_output_sql
543-
if @dbms_output_stream
544-
dbms_output_enable_sql = "DBMS_OUTPUT.ENABLE(#{@schema.dbms_output_buffer_size});\n"
545-
# if database version is at least 10.2 then use DBMS_OUTPUT.GET_LINES with SYS.DBMSOUTPUT_LINESARRAY
546-
if (@schema.connection.database_version <=> [10, 2, 0, 0]) >= 0
547-
@declare_sql << "l_dbms_output_numlines INTEGER := #{Schema::DBMS_OUTPUT_MAX_LINES};\n"
548-
dbms_output_get_sql = "DBMS_OUTPUT.GET_LINES(:dbms_output_lines, l_dbms_output_numlines);\n"
549-
@bind_values[:dbms_output_lines] = nil
550-
@bind_metadata[:dbms_output_lines] = {:data_type => 'TABLE', :data_length => nil,
551-
:sql_type_name => "SYS.DBMSOUTPUT_LINESARRAY", :in_out => 'OUT'}
552-
# if database version is less than 10.2 then use individual DBMS_OUTPUT.GET_LINE calls
553-
else
554-
dbms_output_get_sql = ""
555-
end
556-
[dbms_output_enable_sql, dbms_output_get_sql]
557-
else
558-
["", ""]
559-
end
540+
def dbms_output_enable_sql
541+
@dbms_output_stream ? "DBMS_OUTPUT.ENABLE(#{@schema.dbms_output_buffer_size});\n" : ""
560542
end
561543

562-
def dbms_output_log
544+
def dbms_output_lines
545+
lines = []
563546
if @dbms_output_stream
564-
# if database version is at least 10.2 then :dbms_output_lines output bind variable has dbms_output lines
565-
if @bind_metadata[:dbms_output_lines]
566-
@cursor[':dbms_output_lines'].each do |line|
567-
@dbms_output_stream.puts "DBMS_OUTPUT: #{line}" if line
568-
end
569-
# if database version is less than 10.2 then use individual DBMS_OUTPUT.GET_LINE calls
547+
if (@schema.connection.database_version <=> [10, 2, 0, 0]) >= 0
548+
cursor = @schema.connection.parse("BEGIN DBMS_OUTPUT.GET_LINES(:dbms_output_lines, :dbms_output_numlines); END;\n")
549+
cursor.bind_param(':dbms_output_lines', nil,
550+
:data_type => 'TABLE',
551+
:data_length => nil,
552+
:sql_type_name => "SYS.DBMSOUTPUT_LINESARRAY",
553+
:in_out => 'OUT')
554+
cursor.bind_param(':dbms_output_numlines', Schema::DBMS_OUTPUT_MAX_LINES, :data_type => 'NUMBER', :in_out => 'IN/OUT')
555+
cursor.exec
556+
lines = cursor[':dbms_output_lines']
557+
cursor.close
570558
else
571559
cursor = @schema.connection.parse("BEGIN sys.dbms_output.get_line(:line, :status); END;")
572560
while true do
573561
cursor.bind_param(':line', nil, :data_type => 'VARCHAR2', :in_out => 'OUT')
574562
cursor.bind_param(':status', nil, :data_type => 'NUMBER', :in_out => 'OUT')
575563
cursor.exec
576564
break unless cursor[':status'] == 0
577-
@dbms_output_stream.puts "DBMS_OUTPUT: #{cursor[':line']}"
565+
lines << cursor[':line']
578566
end
579567
cursor.close
580568
end
581-
@dbms_output_stream.flush
582569
end
570+
lines
571+
end
572+
573+
def dbms_output_log
574+
dbms_output_lines.each do |line|
575+
@dbms_output_stream.puts "DBMS_OUTPUT: #{line}" if line
576+
end
577+
@dbms_output_stream.flush if @dbms_output_stream
583578
end
584579

585580
end
586581

587-
end
582+
end

0 commit comments

Comments
 (0)