Skip to content

Commit 5f3c0a9

Browse files
authored
Merge pull request #252 from yahonda/exclude-hidden-columns
Use ALL_TAB_COLUMNS that does not show hidden columns by default
2 parents 3042b1f + a2d1850 commit 5f3c0a9

2 files changed

Lines changed: 42 additions & 1 deletion

File tree

lib/plsql/procedure.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ def get_field_definitions(argument_metadata) # :nodoc:
391391
when "TABLE", "VIEW"
392392
@schema.select_all(
393393
"SELECT column_id, column_name, data_type, data_length, data_precision, data_scale, char_length, char_used
394-
FROM ALL_TAB_COLS WHERE OWNER = :owner AND TABLE_NAME = :type_name
394+
FROM ALL_TAB_COLUMNS WHERE OWNER = :owner AND TABLE_NAME = :type_name
395395
ORDER BY column_id",
396396
@schema_name, argument_metadata[:type_name]) do |r|
397397

spec/plsql/procedure_spec.rb

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2385,3 +2385,44 @@ def new_candidate(status)
23852385
expect { plsql.test_func(p_STRING: "xxx") }.not_to raise_error
23862386
end
23872387
end
2388+
2389+
describe "Procedure with %ROWTYPE parameter on table that has hidden columns" do
2390+
before(:all) do
2391+
plsql.connect! CONNECTION_PARAMS
2392+
plsql.execute "DROP PACKAGE test_hidden_cols_pkg" rescue nil
2393+
plsql.execute "DROP TABLE test_hidden_cols" rescue nil
2394+
plsql.execute "CREATE TABLE test_hidden_cols (col1 VARCHAR2(50), col2 VARCHAR2(50))"
2395+
# Functional index creates a hidden column in ALL_TAB_COLS
2396+
plsql.execute "CREATE INDEX test_hidden_cols_idx ON test_hidden_cols (UPPER(col1))"
2397+
plsql.execute <<-SQL
2398+
CREATE OR REPLACE PACKAGE test_hidden_cols_pkg IS
2399+
PROCEDURE test_proc(p_rec IN test_hidden_cols%ROWTYPE);
2400+
END;
2401+
SQL
2402+
plsql.execute <<-SQL
2403+
CREATE OR REPLACE PACKAGE BODY test_hidden_cols_pkg IS
2404+
PROCEDURE test_proc(p_rec IN test_hidden_cols%ROWTYPE) IS
2405+
BEGIN
2406+
NULL;
2407+
END;
2408+
END;
2409+
SQL
2410+
end
2411+
2412+
after(:all) do
2413+
plsql.execute "DROP PACKAGE test_hidden_cols_pkg" rescue nil
2414+
plsql.execute "DROP TABLE test_hidden_cols" rescue nil
2415+
plsql.logoff
2416+
end
2417+
2418+
it "should not include hidden columns in %ROWTYPE fields" do
2419+
procedure = PLSQL::Procedure.find(plsql, :test_proc, "TEST_HIDDEN_COLS_PKG")
2420+
fields = procedure.arguments[0][:p_rec][:fields]
2421+
field_names = fields.keys
2422+
expect(field_names).to include(:col1)
2423+
expect(field_names).to include(:col2)
2424+
# Use string comparison instead of symbol literal (e.g., :sys_nc00003$)
2425+
# because $ in symbol literals is a syntax error in the Ruby 2.4 parser
2426+
expect(field_names.none? { |name| name.to_s.start_with?("sys_nc") }).to be true
2427+
end
2428+
end

0 commit comments

Comments
 (0)