Skip to content

Commit cdce4bf

Browse files
yahondaclaude
andcommitted
Fix XMLType parameter and return value handling on Oracle 12c+
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, return_variable_value, MATCHING_TYPES, and plsql_to_ruby_data_type. This fixes the XMLType tests that were skipped since issue #114. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent d545cd1 commit cdce4bf

3 files changed

Lines changed: 10 additions & 13 deletions

File tree

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: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ def get_overload_from_arguments_list(args)
115115
MATCHING_TYPES = {
116116
integer: ["NUMBER", "NATURAL", "NATURALN", "POSITIVE", "POSITIVEN", "SIGNTYPE", "SIMPLE_INTEGER", "PLS_INTEGER", "BINARY_INTEGER"],
117117
decimal: ["NUMBER", "BINARY_FLOAT", "BINARY_DOUBLE"],
118-
string: ["VARCHAR", "VARCHAR2", "NVARCHAR2", "CHAR", "NCHAR", "CLOB", "BLOB", "XMLTYPE"],
118+
string: ["VARCHAR", "VARCHAR2", "NVARCHAR2", "CHAR", "NCHAR", "CLOB", "BLOB", "XMLTYPE", "OPAQUE/XMLTYPE"],
119119
date: ["DATE"],
120120
time: ["DATE", "TIMESTAMP", "TIMESTAMP WITH TIME ZONE", "TIMESTAMP WITH LOCAL TIME ZONE"],
121121
boolean: ["PL/SQL BOOLEAN"],
@@ -240,8 +240,8 @@ def add_argument(argument, value, argument_metadata = nil)
240240
@bind_values[argument] = value.nil? ? nil : (value ? 1 : 0)
241241
@bind_metadata[argument] = argument_metadata.merge(data_type: "NUMBER", data_precision: 1)
242242
"l_#{argument}"
243-
when "UNDEFINED"
244-
if argument_metadata[:type_name] == "XMLTYPE"
243+
when "UNDEFINED", "XMLTYPE", "OPAQUE/XMLTYPE"
244+
if argument_metadata[:type_name] == "XMLTYPE" || argument_metadata[:data_type] =~ /XMLTYPE/
245245
@declare_sql << "l_#{argument} XMLTYPE;\n"
246246
@assignment_sql << "l_#{argument} := XMLTYPE(:#{argument});\n" if not value.nil?
247247
@bind_values[argument] = value if not value.nil?
@@ -395,8 +395,8 @@ def add_return_variable(argument, argument_metadata, is_return_value = false)
395395
end
396396
end
397397
"l_#{argument} := " if is_return_value
398-
when "UNDEFINED"
399-
if argument_metadata[:type_name] == "XMLTYPE"
398+
when "UNDEFINED", "XMLTYPE", "OPAQUE/XMLTYPE"
399+
if argument_metadata[:type_name] == "XMLTYPE" || argument_metadata[:data_type] =~ /XMLTYPE/
400400
@declare_sql << "l_#{argument} XMLTYPE;\n" if is_return_value
401401
bind_variable = :"o_#{argument}"
402402
@return_vars << bind_variable
@@ -517,8 +517,8 @@ def return_variable_value(argument, argument_metadata)
517517
when "PL/SQL BOOLEAN"
518518
numeric_value = @cursor[":o_#{argument}"]
519519
numeric_value.nil? ? nil : numeric_value == 1
520-
when "UNDEFINED"
521-
if argument_metadata[:type_name] == "XMLTYPE"
520+
when "UNDEFINED", "XMLTYPE", "OPAQUE/XMLTYPE"
521+
if argument_metadata[:type_name] == "XMLTYPE" || argument_metadata[:data_type] =~ /XMLTYPE/
522522
@cursor[":o_#{argument}"]
523523
end
524524
else

spec/plsql/procedure_spec.rb

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -238,9 +238,6 @@
238238
describe "Function or procedure with XMLType parameters" do
239239
before(:all) do
240240
plsql.connect! CONNECTION_PARAMS
241-
@oracle12c_or_higher = !! plsql.connection.select_all(
242-
"select * from product_component_version where product like 'Oracle%' and to_number(substr(version,1,2)) >= 12")
243-
skip "Skip until furtuer investigation for #114" if @oracle12c_or_higher
244241
plsql.execute <<-SQL
245242
CREATE OR REPLACE FUNCTION test_xmltype
246243
( p_xml XMLTYPE )
@@ -261,8 +258,8 @@
261258
end
262259

263260
after(:all) do
264-
plsql.execute "DROP FUNCTION test_xmltype" unless @oracle12c_or_higher
265-
plsql.execute "DROP PROCEDURE test_xmltype2" unless @oracle12c_or_higher
261+
plsql.execute "DROP FUNCTION test_xmltype" rescue nil
262+
plsql.execute "DROP PROCEDURE test_xmltype2" rescue nil
266263
plsql.logoff
267264
end
268265

0 commit comments

Comments
 (0)