CREATE TABLE my_data (n NUMBER)
Apply ACCESSIBLE BY To Subprograms and Specify "Unit Kind"
CREATE OR REPLACE PACKAGE pkg
AUTHID DEFINER
IS
PROCEDURE do_this;
PROCEDURE this_for_proc_only
ACCESSIBLE BY (PROCEDURE generic_name);
PROCEDURE this_for_trigger_only
ACCESSIBLE BY (TRIGGER generic_name);
PROCEDURE this_for_any_generic_name
ACCESSIBLE BY (generic_name);
/* This will not work - only program units can be named, not subprograms */
PROCEDURE this_for_pkgd_proc1_only
ACCESSIBLE BY (PROCEDURE pkg1.myproc1);
END;
CREATE OR REPLACE PACKAGE BODY pkg
IS
PROCEDURE do_this
IS
BEGIN
NULL;
END;
PROCEDURE this_for_proc_only
ACCESSIBLE BY (PROCEDURE generic_name)
IS
BEGIN
NULL;
END;
PROCEDURE this_for_trigger_only
ACCESSIBLE BY (TRIGGER generic_name)
IS
BEGIN
NULL;
END;
PROCEDURE this_for_any_generic_name
ACCESSIBLE BY (generic_name)
IS
BEGIN
NULL;
END;
PROCEDURE this_for_pkgd_proc1_only
ACCESSIBLE BY (PROCEDURE pkg1.myproc1)
IS
BEGIN
NULL;
END;
END;
Trigger Invokes Trigger-Only Procedure
CREATE OR REPLACE TRIGGER generic_name
BEFORE INSERT
ON my_data
FOR EACH ROW
DECLARE
BEGIN
pkg.this_for_trigger_only;
END;
Trigger Invokes Procedure-Only Procedure
CREATE OR REPLACE TRIGGER generic_name
BEFORE INSERT
ON my_data
FOR EACH ROW
DECLARE
BEGIN
pkg.this_for_proc_only;
END;
Procedure Invokes Procedure-only Procedure
CREATE OR REPLACE PROCEDURE generic_name
AUTHID DEFINER
IS
BEGIN
pkg.this_for_proc_only;
END;
Procedure Invokes Trigger-only Procedure
CREATE OR REPLACE PROCEDURE generic_name
AUTHID DEFINER
IS
BEGIN
pkg.this_for_trigger_only;
END;
Trigger Can Invoke "Any Kind" Procedure
CREATE OR REPLACE TRIGGER generic_name
BEFORE INSERT
ON my_data
FOR EACH ROW
DECLARE
BEGIN
pkg.this_for_any_generic_name;
END;
Procedure Can Invoke "Any Kind" Procedure
CREATE OR REPLACE PROCEDURE generic_name
AUTHID DEFINER
IS
BEGIN
pkg.this_for_any_generic_name;
END;
CREATE OR REPLACE PACKAGE pkg1
AUTHID DEFINER
IS
PROCEDURE myproc1;
PROCEDURE myproc2;
END;
ACCESSIBLE BY Cannot Restrict to Subprogram.
CREATE OR REPLACE PACKAGE BODY pkg1
IS
PROCEDURE myproc1
IS
BEGIN
pkg.this_for_pkgd_proc1_only;
END;
PROCEDURE myproc2
IS
BEGIN
NULL;
END;
END;