11module PLSQL
22 class ProcedureCall # :nodoc:
3+ PLSQL_BOOLEAN_METADATA = { data_type : "NUMBER" , data_precision : 1 } . freeze
4+
35 def initialize ( procedure , args = [ ] , options = { } )
46 @procedure = procedure
57 @schema = @procedure . schema
@@ -237,8 +239,8 @@ def add_argument(argument, value, argument_metadata = nil)
237239 when "PL/SQL BOOLEAN"
238240 @declare_sql << "l_#{ argument } BOOLEAN;\n "
239241 @assignment_sql << "l_#{ argument } := (:#{ argument } = 1);\n "
240- @bind_values [ argument ] = value . nil? ? nil : ( value ? 1 : 0 )
241- @bind_metadata [ argument ] = argument_metadata . merge ( data_type : "NUMBER" , data_precision : 1 )
242+ @bind_values [ argument ] = ruby_value_to_plsql_boolean ( value )
243+ @bind_metadata [ argument ] = plsql_boolean_metadata ( argument_metadata )
242244 "l_#{ argument } "
243245 when "UNDEFINED" , "XMLTYPE" , "OPAQUE/XMLTYPE"
244246 if argument_metadata [ :type_name ] == "XMLTYPE" || argument_metadata [ :data_type ] =~ /XMLTYPE/
@@ -352,8 +354,8 @@ def record_assignment_sql_values_metadata(argument, argument_metadata, record_va
352354 case metadata [ :data_type ]
353355 when "PL/SQL BOOLEAN"
354356 sql << "l_#{ argument } .#{ field } := (:#{ bind_variable } = 1);\n "
355- bind_values [ bind_variable ] = value . nil? ? nil : ( value ? 1 : 0 )
356- bind_metadata [ bind_variable ] = metadata . merge ( data_type : "NUMBER" , data_precision : 1 )
357+ bind_values [ bind_variable ] = ruby_value_to_plsql_boolean ( value )
358+ bind_metadata [ bind_variable ] = plsql_boolean_metadata ( metadata )
357359 else
358360 sql << "l_#{ argument } .#{ field } := :#{ bind_variable } ;\n "
359361 bind_values [ bind_variable ] = value
@@ -384,7 +386,7 @@ def add_return_variable(argument, argument_metadata, is_return_value = false)
384386 case metadata [ :data_type ]
385387 when "PL/SQL BOOLEAN"
386388 @return_vars << bind_variable
387- @return_vars_metadata [ bind_variable ] = metadata . merge ( data_type : "NUMBER" , data_precision : 1 )
389+ @return_vars_metadata [ bind_variable ] = plsql_boolean_metadata ( metadata )
388390 arg_field = "l_#{ argument } .#{ field } "
389391 @return_sql << ":#{ bind_variable } := " << "CASE WHEN #{ arg_field } = true THEN 1 " <<
390392 "WHEN #{ arg_field } = false THEN 0 ELSE NULL END;\n "
@@ -411,7 +413,7 @@ def add_return_variable(argument, argument_metadata, is_return_value = false)
411413 # if output bind variable appears in several places
412414 bind_variable = :"o_#{ argument } "
413415 @return_vars << bind_variable
414- @return_vars_metadata [ bind_variable ] = argument_metadata . merge ( data_type : "NUMBER" , data_precision : 1 )
416+ @return_vars_metadata [ bind_variable ] = plsql_boolean_metadata ( argument_metadata )
415417 @return_sql << "IF l_#{ argument } IS NULL THEN\n o_#{ argument } := NULL;\n " <<
416418 "ELSIF l_#{ argument } THEN\n o_#{ argument } := 1;\n ELSE\n o_#{ argument } := 0;\n END IF;\n " <<
417419 ":#{ bind_variable } := o_#{ argument } ;\n "
@@ -508,15 +510,15 @@ def return_variable_value(argument, argument_metadata)
508510 field_value = @cursor [ ":#{ argument } _o#{ metadata [ :position ] } " ]
509511 case metadata [ :data_type ]
510512 when "PL/SQL BOOLEAN"
511- return_value [ field ] = field_value . nil? ? nil : field_value == 1
513+ return_value [ field ] = plsql_boolean_to_ruby_value ( field_value )
512514 else
513515 return_value [ field ] = field_value
514516 end
515517 end
516518 return_value
517519 when "PL/SQL BOOLEAN"
518520 numeric_value = @cursor [ ":o_#{ argument } " ]
519- numeric_value . nil? ? nil : numeric_value == 1
521+ plsql_boolean_to_ruby_value ( numeric_value )
520522 when "UNDEFINED" , "XMLTYPE" , "OPAQUE/XMLTYPE"
521523 if argument_metadata [ :type_name ] == "XMLTYPE" || argument_metadata [ :data_type ] =~ /XMLTYPE/
522524 @cursor [ ":o_#{ argument } " ]
@@ -622,5 +624,17 @@ def dbms_output_log
622624 end
623625 @dbms_output_stream . flush if @dbms_output_stream
624626 end
627+
628+ def ruby_value_to_plsql_boolean ( value )
629+ value . nil? ? nil : ( value ? 1 : 0 )
630+ end
631+
632+ def plsql_boolean_to_ruby_value ( numeric_value )
633+ numeric_value . nil? ? nil : numeric_value == 1
634+ end
635+
636+ def plsql_boolean_metadata ( base_metadata )
637+ base_metadata . merge ( PLSQL_BOOLEAN_METADATA )
638+ end
625639 end
626640end
0 commit comments