Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 59 additions & 21 deletions lib/plsql/procedure.rb
Original file line number Diff line number Diff line change
Expand Up @@ -219,21 +219,24 @@ def get_argument_metadata_from_18c #:nodoc:
@tmp_tables_created = {}

@schema.select_all(
"SELECT subprogram_id, object_name, TO_NUMBER(overload), argument_name, position,
data_type, in_out, data_length, data_precision, data_scale, char_used,
char_length, type_owner, nvl(type_subname, type_name),
decode(type_object_type, 'PACKAGE', type_name, null), type_object_type, defaulted
FROM all_arguments
WHERE object_id = :object_id
AND owner = :owner
AND object_name = :procedure_name
ORDER BY overload, sequence",
"SELECT a.subprogram_id, a.object_name, TO_NUMBER(a.overload), a.argument_name, a.position,
a.data_type, a.in_out, a.data_length, a.data_precision, a.data_scale, a.char_used,
a.char_length, a.type_owner, nvl(a.type_subname, a.type_name) type_name,
case when a.type_object_type = 'PACKAGE' then a.type_name end type_package, a.type_object_type, a.defaulted,
s.table_owner synonym_owner, s.table_name synonym_name
FROM all_arguments a
LEFT JOIN all_synonyms s ON a.type_owner = s.owner AND a.type_name = s.synonym_name
WHERE a.object_id = :object_id
AND a.owner = :owner
AND a.object_name = :procedure_name
ORDER BY a.overload, a.sequence",
@object_id, @schema_name, @procedure
) do |r|

subprogram_id, object_name, overload, argument_name, position,
data_type, in_out, data_length, data_precision, data_scale, char_used,
char_length, type_owner, type_name, type_package, type_object_type, defaulted = r
char_length, type_owner, type_name, type_package, type_object_type, defaulted,
synonym_dest_owner, synonym_dest_name = r

@overloaded ||= !overload.nil?
# if not overloaded then store arguments at key 0
Expand All @@ -242,6 +245,25 @@ def get_argument_metadata_from_18c #:nodoc:
@return[overload] ||= nil
@tmp_table_names[overload] ||= []

unless synonym_dest_owner.nil?
#puts 'Synonym not nil'
@schema.select_all(
"SELECT o.owner, o.object_name, o.object_type
FROM all_objects o
WHERE o.owner = :synonym_owner
AND o.object_name = :synonym_name
AND o.object_type IN ('PACKAGE', 'TYPE')",
synonym_dest_owner, synonym_dest_name
) do |r2|
tmp_owner, tmp_name, tmp_type = r2
if tmp_type == 'PACKAGE'
type_owner, type_package, type_object_type = tmp_owner, tmp_name, tmp_type
else
type_owner, type_name, type_object_type = tmp_owner, tmp_name, tmp_type
end
end
end

sql_type_name = build_sql_type_name(type_owner, type_package, type_name)

tmp_table_name = nil
Expand Down Expand Up @@ -346,15 +368,22 @@ def build_sql_type_name(type_owner, type_package, type_name) #:nodoc:
end

def get_field_definitions(argument_metadata) #:nodoc:
puts "#### get_field_definitions: #{argument_metadata[:type_object_type]}, #{argument_metadata[:type_owner]}, #{argument_metadata[:type_subname]}, #{argument_metadata[:type_name]}"
fields = {}
case argument_metadata[:type_object_type]
when "PACKAGE"
@schema.select_all(
"SELECT attr_no, attr_name, attr_type_owner, attr_type_name, attr_type_package, length, precision, scale, char_used
FROM ALL_PLSQL_TYPES t, ALL_PLSQL_TYPE_ATTRS ta
WHERE t.OWNER = :owner AND t.type_name = :type_name AND t.package_name = :package_name
AND ta.OWNER = t.owner AND ta.TYPE_NAME = t.TYPE_NAME AND ta.PACKAGE_NAME = t.PACKAGE_NAME
ORDER BY attr_no",
"SELECT ta.attr_no, ta.attr_name,
nvl(s.table_owner, attr_type_owner) attr_type_owner,
CASE WHEN ta.attr_type_package IS NOT NULL THEN ta.attr_type_name ELSE nvl(s.table_name, ta.attr_type_name) END attr_type_name,
CASE WHEN ta.attr_type_package IS NOT NULL THEN nvl(s.table_name, ta.attr_type_package) END attr_type_package,
ta.length, ta.precision, ta.scale, ta.char_used
FROM all_plsql_type_attrs ta
LEFT JOIN all_synonyms s ON ta.attr_type_owner = s.owner AND nvl(ta.attr_type_package, ta.attr_type_name) = s.synonym_name
WHERE ta.owner = :owner
AND ta.type_name = :type_name
AND ta.package_name = :package_name
ORDER BY ta.attr_no",
@schema_name, argument_metadata[:type_name], argument_metadata[:type_subname]) do |r|

attr_no, attr_name, attr_type_owner, attr_type_name, attr_type_package, attr_length, attr_precision, attr_scale, attr_char_used = r
Expand Down Expand Up @@ -409,14 +438,21 @@ def get_field_definitions(argument_metadata) #:nodoc:
end

def get_element_definition(argument_metadata) #:nodoc:
puts "#### get_element_definition: #{argument_metadata[:type_object_type]}, #{argument_metadata[:type_owner]}, #{argument_metadata[:type_subname]}, #{argument_metadata[:type_name]}"
element_metadata = {}
if collection_type?(argument_metadata[:data_type])
case argument_metadata[:type_object_type]
when "PACKAGE"
r = @schema.select_first(
"SELECT elem_type_owner, elem_type_name, elem_type_package, length, precision, scale, char_used, index_by
FROM ALL_PLSQL_COLL_TYPES t
WHERE t.OWNER = :owner AND t.TYPE_NAME = :type_name AND t.PACKAGE_NAME = :package_name",
"SELECT nvl(s.table_owner, t.elem_type_owner) elem_type_owner,
CASE WHEN t.elem_type_package IS NOT NULL THEN t.elem_type_name ELSE nvl(s.table_name, t.elem_type_name) END elem_type_name,
CASE WHEN t.elem_type_package IS NOT NULL THEN nvl(s.table_name, t.elem_type_package) END elem_type_package_new,
length, precision, scale, char_used, index_by
FROM all_plsql_coll_types t
LEFT JOIN all_synonyms s ON t.elem_type_owner = s.owner AND nvl(t.elem_type_package, t.elem_type_name) = s.synonym_name
WHERE t.owner = :owner
AND t.type_name = :type_name
AND t.package_name = :package_name",
@schema_name, argument_metadata[:type_name], argument_metadata[:type_subname])

elem_type_owner, elem_type_name, elem_type_package, elem_length, elem_precision, elem_scale, elem_char_used, index_by = r
Expand Down Expand Up @@ -451,9 +487,11 @@ def get_element_definition(argument_metadata) #:nodoc:
end
when "TYPE"
r = @schema.select_first(
"SELECT elem_type_owner, elem_type_name, length, precision, scale, char_used
FROM ALL_COLL_TYPES t
WHERE t.owner = :owner AND t.TYPE_NAME = :type_name",
"SELECT nvl(s.table_owner, t.elem_type_owner), nvl(s.table_name, t.elem_type_name), t.length, t.precision, t.scale, t.char_used
FROM all_coll_types t
LEFT JOIN all_synonyms s ON t.elem_type_owner = s.owner AND t.elem_type_name = s.synonym_name
WHERE t.owner = :owner
AND t.type_name = :type_name",
@schema_name, argument_metadata[:type_name]
)
elem_type_owner, elem_type_name, elem_length, elem_precision, elem_scale, elem_char_used = r
Expand Down