Skip to content

Commit e03418a

Browse files
yahondaclaude
andcommitted
Fix XMLType parameter handling for Oracle 12c+ (OPAQUE/XMLTYPE)
Oracle 12c+ reports XMLType parameters with data_type "OPAQUE/XMLTYPE" in ALL_ARGUMENTS (changed from "UNDEFINED" in Oracle 11g). Handle this new data_type in add_argument, add_return_variable, MATCHING_TYPES, and plsql_to_ruby_data_type. This fixes the 3 XMLType test failures that were skipped since #114. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 3043db1 commit e03418a

3 files changed

Lines changed: 8 additions & 13 deletions

File tree

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,4 @@ jobs:
8484
bundle install --jobs 4 --retry 3
8585
- name: Run RSpec
8686
run: |
87-
RUBY_PLSQL_DEBUG=1 RUBYOPT="-w --debug-frozen-string-literal" bundle exec rspec
87+
RUBYOPT="-w --debug-frozen-string-literal" bundle exec rspec

lib/plsql/oci_connection.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ def plsql_to_ruby_data_type(metadata)
157157
[DateTime, nil]
158158
when "TIMESTAMP", "TIMESTAMP WITH TIME ZONE", "TIMESTAMP WITH LOCAL TIME ZONE"
159159
[Time, nil]
160-
when "TABLE", "VARRAY", "OBJECT", "XMLTYPE"
160+
when "TABLE", "VARRAY", "OBJECT", "XMLTYPE", "OPAQUE/XMLTYPE"
161161
# create Ruby class for collection
162162
klass = OCI8::Object::Base.get_class_by_typename(metadata[:sql_type_name])
163163
unless klass

lib/plsql/procedure_call.rb

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,7 @@ def initialize(procedure, args = [], options = {})
1717
end
1818

1919
def exec
20-
if ENV["RUBY_PLSQL_DEBUG"]
21-
$stderr.puts "DEBUG: sql = #{@sql}"
22-
$stderr.puts "DEBUG: bind_values = #{@bind_values.inspect}"
23-
$stderr.puts "DEBUG: bind_metadata = #{@bind_metadata.inspect}"
24-
end
20+
# puts "DEBUG: sql = #{@sql.gsub("\n","<br/>\n")}"
2521
@cursor = @schema.connection.parse(@sql)
2622

2723
@bind_values.each do |arg, value|
@@ -119,7 +115,7 @@ def get_overload_from_arguments_list(args)
119115
MATCHING_TYPES = {
120116
integer: ["NUMBER", "NATURAL", "NATURALN", "POSITIVE", "POSITIVEN", "SIGNTYPE", "SIMPLE_INTEGER", "PLS_INTEGER", "BINARY_INTEGER"],
121117
decimal: ["NUMBER", "BINARY_FLOAT", "BINARY_DOUBLE"],
122-
string: ["VARCHAR", "VARCHAR2", "NVARCHAR2", "CHAR", "NCHAR", "CLOB", "BLOB", "XMLTYPE"],
118+
string: ["VARCHAR", "VARCHAR2", "NVARCHAR2", "CHAR", "NCHAR", "CLOB", "BLOB", "XMLTYPE", "OPAQUE/XMLTYPE"],
123119
date: ["DATE"],
124120
time: ["DATE", "TIMESTAMP", "TIMESTAMP WITH TIME ZONE", "TIMESTAMP WITH LOCAL TIME ZONE"],
125121
boolean: ["PL/SQL BOOLEAN"],
@@ -229,7 +225,6 @@ def construct_sql(args)
229225
def add_argument(argument, value, argument_metadata = nil)
230226
argument_metadata ||= arguments[argument]
231227
raise ArgumentError, "Wrong argument #{argument.inspect} passed to PL/SQL procedure" unless argument_metadata
232-
$stderr.puts "DEBUG add_argument: #{argument} data_type=#{argument_metadata[:data_type]} type_name=#{argument_metadata[:type_name]} sql_type_name=#{argument_metadata[:sql_type_name]}" if ENV["RUBY_PLSQL_DEBUG"]
233228
case argument_metadata[:data_type]
234229
when "PL/SQL RECORD"
235230
add_record_declaration(argument, argument_metadata)
@@ -245,8 +240,8 @@ def add_argument(argument, value, argument_metadata = nil)
245240
@bind_values[argument] = value.nil? ? nil : (value ? 1 : 0)
246241
@bind_metadata[argument] = argument_metadata.merge(data_type: "NUMBER", data_precision: 1)
247242
"l_#{argument}"
248-
when "UNDEFINED", "XMLTYPE"
249-
if argument_metadata[:type_name] == "XMLTYPE" || argument_metadata[:data_type] == "XMLTYPE"
243+
when "UNDEFINED", "XMLTYPE", "OPAQUE/XMLTYPE"
244+
if argument_metadata[:type_name] == "XMLTYPE" || argument_metadata[:data_type] =~ /XMLTYPE/
250245
@declare_sql << "l_#{argument} XMLTYPE;\n"
251246
@assignment_sql << "l_#{argument} := XMLTYPE(:#{argument});\n" if not value.nil?
252247
@bind_values[argument] = value if not value.nil?
@@ -400,8 +395,8 @@ def add_return_variable(argument, argument_metadata, is_return_value = false)
400395
end
401396
end
402397
"l_#{argument} := " if is_return_value
403-
when "UNDEFINED", "XMLTYPE"
404-
if argument_metadata[:type_name] == "XMLTYPE" || argument_metadata[:data_type] == "XMLTYPE"
398+
when "UNDEFINED", "XMLTYPE", "OPAQUE/XMLTYPE"
399+
if argument_metadata[:type_name] == "XMLTYPE" || argument_metadata[:data_type] =~ /XMLTYPE/
405400
@declare_sql << "l_#{argument} XMLTYPE;\n" if is_return_value
406401
bind_variable = :"o_#{argument}"
407402
@return_vars << bind_variable

0 commit comments

Comments
 (0)