Skip to content

Commit 5b23804

Browse files
yahondaclaude
andcommitted
Use type_owner for cross-schema type lookups
Use argument_metadata[:type_owner] instead of @schema_name when querying ALL_PLSQL_TYPE_ATTRS, ALL_TAB_COLUMNS, ALL_PLSQL_COLL_TYPES, and ALL_COLL_TYPES so that types defined in another schema are resolved correctly. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 3a7a307 commit 5b23804

3 files changed

Lines changed: 52 additions & 4 deletions

File tree

lib/plsql/procedure.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ def get_field_definitions(argument_metadata) # :nodoc:
361361
WHERE t.OWNER = :owner AND t.type_name = :type_name AND t.package_name = :package_name
362362
AND ta.OWNER = t.owner AND ta.TYPE_NAME = t.TYPE_NAME AND ta.PACKAGE_NAME = t.PACKAGE_NAME
363363
ORDER BY attr_no",
364-
@schema_name, argument_metadata[:type_name], argument_metadata[:type_subname]) do |r|
364+
argument_metadata[:type_owner], argument_metadata[:type_name], argument_metadata[:type_subname]) do |r|
365365

366366
attr_no, attr_name, attr_type_owner, attr_type_name, attr_type_package, attr_length, attr_precision, attr_scale, attr_char_used = r
367367

@@ -393,7 +393,7 @@ def get_field_definitions(argument_metadata) # :nodoc:
393393
"SELECT column_id, column_name, data_type, data_length, data_precision, data_scale, char_length, char_used
394394
FROM ALL_TAB_COLUMNS WHERE OWNER = :owner AND TABLE_NAME = :type_name
395395
ORDER BY column_id",
396-
@schema_name, argument_metadata[:type_name]) do |r|
396+
argument_metadata[:type_owner], argument_metadata[:type_name]) do |r|
397397

398398
col_no, col_name, col_type_name, col_length, col_precision, col_scale, col_char_length, col_char_used = r
399399

@@ -426,7 +426,7 @@ def get_element_definition(argument_metadata) # :nodoc:
426426
"SELECT elem_type_owner, elem_type_name, elem_type_package, length, precision, scale, char_used, index_by
427427
FROM ALL_PLSQL_COLL_TYPES t
428428
WHERE t.OWNER = :owner AND t.TYPE_NAME = :type_name AND t.PACKAGE_NAME = :package_name",
429-
@schema_name, argument_metadata[:type_name], argument_metadata[:type_subname])
429+
argument_metadata[:type_owner], argument_metadata[:type_name], argument_metadata[:type_subname])
430430

431431
elem_type_owner, elem_type_name, elem_type_package, elem_length, elem_precision, elem_scale, elem_char_used, index_by = r
432432

@@ -483,7 +483,7 @@ def get_element_definition(argument_metadata) # :nodoc:
483483
"SELECT elem_type_owner, elem_type_name, length, precision, scale, char_used
484484
FROM ALL_COLL_TYPES t
485485
WHERE t.owner = :owner AND t.TYPE_NAME = :type_name",
486-
@schema_name, argument_metadata[:type_name]
486+
argument_metadata[:type_owner], argument_metadata[:type_name]
487487
)
488488
elem_type_owner, elem_type_name, elem_length, elem_precision, elem_scale, elem_char_used = r
489489

spec/plsql/procedure_spec.rb

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2492,3 +2492,48 @@ def new_candidate(status)
24922492
expect(result).to eq(1)
24932493
end
24942494
end
2495+
2496+
describe "Function with cross-schema type reference" do
2497+
before(:all) do
2498+
primary_user, _ = DATABASE_USERS_AND_PASSWORDS[0]
2499+
second_user, second_password = DATABASE_USERS_AND_PASSWORDS[1]
2500+
@second_schema = second_user.upcase
2501+
2502+
plsql.connect! CONNECTION_PARAMS
2503+
2504+
# Connect as second user to create type and grant execute to primary user
2505+
plsql2 = PLSQL::Schema.new
2506+
plsql2.connect! CONNECTION_PARAMS.merge(username: second_user, password: second_password)
2507+
plsql2.execute "CREATE OR REPLACE TYPE t_cross_schema_record AS OBJECT (id NUMBER, name VARCHAR2(50))"
2508+
plsql2.execute "GRANT EXECUTE ON t_cross_schema_record TO #{primary_user}"
2509+
plsql2.logoff
2510+
2511+
plsql.execute <<-SQL
2512+
CREATE OR REPLACE FUNCTION test_cross_schema_fn(p_rec #{@second_schema}.t_cross_schema_record)
2513+
RETURN NUMBER
2514+
IS
2515+
BEGIN
2516+
RETURN p_rec.id;
2517+
END;
2518+
SQL
2519+
end
2520+
2521+
after(:all) do
2522+
second_user, second_password = DATABASE_USERS_AND_PASSWORDS[1]
2523+
plsql.execute "DROP FUNCTION test_cross_schema_fn" rescue nil
2524+
plsql2 = PLSQL::Schema.new
2525+
plsql2.connect! CONNECTION_PARAMS.merge(username: second_user, password: second_password)
2526+
plsql2.execute "DROP TYPE t_cross_schema_record" rescue nil
2527+
plsql2.logoff
2528+
plsql.logoff
2529+
end
2530+
2531+
it "should resolve type from another schema" do
2532+
expect(PLSQL::Procedure.find(plsql, :test_cross_schema_fn)).not_to be_nil
2533+
end
2534+
2535+
it "should execute function with cross-schema type parameter" do
2536+
result = plsql.test_cross_schema_fn(id: 42, name: "test")
2537+
expect(result).to eq(42)
2538+
end
2539+
end
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
create user arunit identified by arunit;
22
grant create session to arunit;
3+
grant create type to arunit;
4+
grant create procedure to arunit;
5+
grant unlimited tablespace to arunit;

0 commit comments

Comments
 (0)