CREATE TABLE fgd_test
AS
SELECT *
FROM hr.employees
Table created.
Get and Display Validity Status of Program Unit
CREATE OR REPLACE PROCEDURE show_validity (
change_in IN VARCHAR2
, unit_name_in IN VARCHAR2
, recompile_in IN BOOLEAN DEFAULT TRUE
)
IS
l_validity all_objects.status%TYPE;
BEGIN
SELECT status
INTO l_validity
FROM user_objects
WHERE object_name = unit_name_in;
DBMS_OUTPUT.put_line ('After "' || change_in || '"');
DBMS_OUTPUT.put_line (
' State of ' || unit_name_in || ' = ' || l_validity );
IF l_validity = 'INVALID' AND recompile_in
THEN
EXECUTE IMMEDIATE 'alter procedure '
|| unit_name_in
|| ' COMPILE REUSE SETTINGS';
END IF;
END show_validity;
Procedure created.
CREATE OR REPLACE PACKAGE pkg1
IS
PROCEDURE proc1 (a IN VARCHAR2);
FUNCTION func1 RETURN VARCHAR2;
END pkg1;
Package created.
Dependent on Table and Package
CREATE OR REPLACE PROCEDURE use_pkg1
IS
l_name fgd_test.last_name%TYPE;
BEGIN
SELECT e.last_name
INTO l_name
FROM fgd_test e
WHERE e.employee_id = 198;
pkg1.proc1 ('a');
END use_pkg1;
Procedure created.
BEGIN
show_validity ('Freshly Compiled', 'USE_PKG1');
END;
After "Freshly Compiled"
State of USE_PKG1 = VALID
Change Type of Column NOT Used in USE_PKG1
ALTER TABLE fgd_test MODIFY first_name VARCHAR2(2000)
Table altered.
Still Valid!
BEGIN
DBMS_OUTPUT.
put_line ('Change size of first_name column - state should remain VALID.'
);
show_validity ('Change LAST_NAME Column', 'USE_PKG1');
END;
Change size of first_name column - state should remain VALID.
After "Change LAST_NAME Column"
State of USE_PKG1 = VALID
Add New Subprogram to Package
CREATE OR REPLACE PACKAGE pkg1
IS
PROCEDURE proc1 (a IN VARCHAR2);
FUNCTION func1
RETURN VARCHAR2;
FUNCTION func2
RETURN NUMBER;
END pkg1;
Package created.
Still Valid!
BEGIN
DBMS_OUTPUT.put_line ('Add a new function - should not affect state.');
show_validity ('Add new function', 'USE_PKG1');
END;
Add a new function - should not affect state.
After "Add new function"
State of USE_PKG1 = VALID
Add a New Column
ALTER TABLE fgd_test ADD nickname VARCHAR2(100)
Table altered.
Still Valid!
BEGIN
DBMS_OUTPUT.
put_line ('Add column to fgd_test; should not affect state.');
show_validity ('Add new column', 'USE_PKG1');
END;
Add column to fgd_test; should not affect state.
After "Add new column"
State of USE_PKG1 = VALID
ALTER TABLE fgd_test DROP COLUMN nickname
Table altered.
Change Parameter List of Subprogram
CREATE OR REPLACE PACKAGE pkg1
IS
PROCEDURE proc1 (a IN VARCHAR2, b IN PLS_INTEGER DEFAULT NULL);
FUNCTION func1
RETURN VARCHAR2;
FUNCTION func2
RETURN NUMBER;
END pkg1;
Package created.
Now Invalid
BEGIN
DBMS_OUTPUT.
put_line (
'Add new IN parameter with trailing default - should not affect state? It does!'
);
show_validity ('Add new parameter', 'USE_PKG1');
END;
Add new IN parameter with trailing default - should not affect state? It does!
After "Add new parameter"
State of USE_PKG1 = INVALID
Change Datatype of Existing Parameter
CREATE OR REPLACE PACKAGE pkg1
IS
PROCEDURE proc1 (a IN DATE);
FUNCTION func1
RETURN VARCHAR2;
FUNCTION func2
RETURN NUMBER;
END pkg1;
Package created.
Now Invalid
BEGIN
DBMS_OUTPUT.
put_line (
'Change datatype of argument that is used; should affect state.'
);
show_validity ('Change parameter type to DATE', 'USE_PKG1');
END;
Change datatype of argument that is used; should affect state.
After "Change parameter type to DATE"
State of USE_PKG1 = INVALID
What Happens If I Change a Constant's Value?
CREATE OR REPLACE PACKAGE magic_value
IS
c_value1 NUMBER := 1;
END;
Package created.
CREATE OR REPLACE PROCEDURE use_magic_value
IS
BEGIN
DBMS_OUTPUT.put_line (magic_value.c_value1);
END;
Procedure created.
Valid (Of Course) Right After Compilation
BEGIN
show_validity ('Initial Compile', 'USE_MAGIC_VALUE');
END;
After "Initial Compile"
State of USE_MAGIC_VALUE = VALID
Change Variable Value to 2
CREATE OR REPLACE PACKAGE magic_value
IS
c_value1 NUMBER := 2;
END;
Package created.
Still Valid!
BEGIN
show_validity ('Change packaged constant value', 'USE_MAGIC_VALUE');
END;
After "Change packaged constant value"
State of USE_MAGIC_VALUE = VALID