CREATE TABLE my_data
(
visible_number NUMBER,
invisible_number NUMBER INVISIBLE
)
Table created.
BEGIN
INSERT INTO my_data (visible_number, invisible_number)
VALUES (1, -1);
COMMIT;
END;
1 row(s) inserted.
CREATE OR REPLACE PACKAGE my_pkg
AUTHID DEFINER
IS
CURSOR data_cur1
IS
SELECT * FROM my_data;
CURSOR data_cur2
IS
SELECT visible_number, invisible_number FROM my_data;
END;
Package created.
SELECT * -> Invisible Columns Left Behind
DECLARE
rec my_data%ROWTYPE;
BEGIN
SELECT *
INTO rec
FROM my_data
WHERE ROWNUM < 2;
DBMS_OUTPUT.PUT_LINE ('invisible = ' || rec.invisible_number);
END;
ORA-06550: line 9, column 48: PLS-00302: component 'INVISIBLE_NUMBER' must be declared ORA-06550: line 9, column 4: PL/SQL: Statement ignoredMore Details: https://docs.oracle.com/error-help/db/ora-06550
Same Behavior, Doesn't Matter How Record is Defined
DECLARE
rec my_pkg.data_cur1%ROWTYPE;
BEGIN
SELECT *
INTO rec
FROM my_data
WHERE ROWNUM < 2;
DBMS_OUTPUT.PUT_LINE ('invisible = ' || rec.invisible_number);
END;
ORA-06550: line 9, column 48: PLS-00302: component 'INVISIBLE_NUMBER' must be declared ORA-06550: line 9, column 4: PL/SQL: Statement ignoredMore Details: https://docs.oracle.com/error-help/db/ora-06550
Not Invislble If You Know Magic Word (Column Name)
DECLARE
rec my_pkg.data_cur2%ROWTYPE;
BEGIN
OPEN my_pkg.data_cur2;
FETCH my_pkg.data_cur2 INTO rec;
CLOSE my_pkg.data_cur2;
DBMS_OUTPUT.PUT_LINE ('invisible = ' || rec.invisible_number);
END;
invisible = -1
Make Column Visible
ALTER TABLE my_data
MODIFY (invisible_number VISIBLE)
Table altered.
Now SELECT * Includes Column
DECLARE
rec my_data%ROWTYPE;
BEGIN
SELECT *
INTO rec
FROM my_data
WHERE ROWNUM < 2;
DBMS_OUTPUT.PUT_LINE ('invisible = ' || rec.invisible_number);
END;
invisible = -1
DROP TABLE my_data
Table dropped.
DROP PACKAGE my_pkg
Package dropped.