创建 admin_pkg 软件包
本节介绍如何创建 admin_pkg 程序包、其子程序的工作方式、如何向需要该程序包的用户授予对该程序包的执行权限,以及该用户如何调用其其中一个子程序。
创建 admin_pkg 软件包:
-
以 app_admin 用户身份连接到 Oracle Database。
有关说明,请参阅“从 SQL*Plus 连接到 Oracle Database ”或“从 SQL Developer 连接到 Oracle Database ”。
-
创建以下同义词:
CREATE SYNONYM departments FOR app_data.departments; CREATE SYNONYM jobs FOR app_data.jobs; CREATE SYNONYM departments_sequence FOR app_data.departments_sequence;可以在 SQL*Plus 或 SQL Developer 工作表中输入 CREATE SYNONYM 语句。或者,可以使用 SQL Developer 工具“Create Synonym(创建同义词)”创建表。
-
创建程序包说明。
-
创建程序包体。
创建 admin_pkg 的软件包规范
注:您必须以 app_admin 用户身份连接到 Oracle Database。
要为 admin_pkg(应用程序管理员的 API)创建软件包规范,请使用以下 CREATE PACKAGE 语句。可以在 SQL*Plus 或 SQL Developer 工作表中输入语句。或者,可以使用 SQL Developer 工具“Create Package(创建程序包)”创建程序包。
CREATE OR REPLACE PACKAGE admin_pkg
AS
PROCEDURE update_job
( p_job_id IN jobs.job_id%TYPE,
p_job_title IN jobs.job_title%TYPE := NULL,
p_min_salary IN jobs.min_salary%TYPE := NULL,
p_max_salary IN jobs.max_salary%TYPE := NULL );
PROCEDURE add_job
( p_job_id IN jobs.job_id%TYPE,
p_job_title IN jobs.job_title%TYPE,
p_min_salary IN jobs.min_salary%TYPE,
p_max_salary IN jobs.max_salary%TYPE );
PROCEDURE update_department
( p_department_id IN departments.department_id%TYPE,
p_department_name IN departments.department_name%TYPE := NULL,
p_manager_id IN departments.manager_id%TYPE := NULL,
p_update_manager_id IN BOOLEAN := FALSE );
FUNCTION add_department
( p_department_name IN departments.department_name%TYPE,
p_manager_id IN departments.manager_id%TYPE )
RETURN departments.department_id%TYPE;
END admin_pkg;
/
另请参见:
-
“关于应用程序”
-
“创建和管理程序包”
-
Oracle Database PL/SQL Language Reference(了解有关 CREATE PACKAGE 语句的信息)
为 admin_pkg 创建软件包主体
注:您必须以 app_admin 用户身份连接到 Oracle Database。
要为 admin_pkg(应用程序管理员的 API)创建软件包主体,请使用以下 CREATE PACKAGE BODY 语句。可以在 SQL*Plus 或 SQL Developer 工作表中输入语句。或者,可以使用 SQL Developer 工具“Create Body(创建正文)”创建程序包。
CREATE OR REPLACE PACKAGE BODY admin_pkg
AS
PROCEDURE update_job
( p_job_id IN jobs.job_id%TYPE,
p_job_title IN jobs.job_title%TYPE := NULL,
p_min_salary IN jobs.min_salary%TYPE := NULL,
p_max_salary IN jobs.max_salary%TYPE := NULL )
IS
BEGIN
UPDATE jobs
SET job_title = NVL( p_job_title, job_title ),
min_salary = NVL( p_min_salary, min_salary ),
max_salary = NVL( p_max_salary, max_salary )
WHERE job_id = p_job_id;
END update_job;
PROCEDURE add_job
( p_job_id IN jobs.job_id%TYPE,
p_job_title IN jobs.job_title%TYPE,
p_min_salary IN jobs.min_salary%TYPE,
p_max_salary IN jobs.max_salary%TYPE )
IS
BEGIN
INSERT INTO jobs ( job_id, job_title, min_salary, max_salary )
VALUES ( p_job_id, p_job_title, p_min_salary, p_max_salary );
END add_job;
PROCEDURE update_department
( p_department_id IN departments.department_id%TYPE,
p_department_name IN departments.department_name%TYPE := NULL,
p_manager_id IN departments.manager_id%TYPE := NULL,
p_update_manager_id IN BOOLEAN := FALSE )
IS
BEGIN
IF ( p_update_manager_id ) THEN
UPDATE departments
SET department_name = NVL( p_department_name, department_name ),
manager_id = p_manager_id
WHERE department_id = p_department_id;
ELSE
UPDATE departments
SET department_name = NVL( p_department_name, department_name )
WHERE department_id = p_department_id;
END IF;
END update_department;
FUNCTION add_department
( p_department_name IN departments.department_name%TYPE,
p_manager_id IN departments.manager_id%TYPE )
RETURN departments.department_id%TYPE
IS
l_department_id departments.department_id%TYPE;
BEGIN
INSERT INTO departments ( department_id, department_name, manager_id )
VALUES ( departments_sequence.NEXTVAL, p_department_name, p_manager_id )
RETURNING department_id INTO l_department_id;
RETURN l_department_id;
END add_department;
END admin_pkg;
/
另请参见:
-
“关于应用程序”
-
“创建和管理程序包”
-
Oracle Database PL/SQL Language Reference(了解有关 CREATE PACKAGE BODY 语句的信息)
教程:显示 admin_pkg 子程序的工作方式
本教程使用 SQL*Plus,说明 admin_pkg 程序包的子程序如何工作。该教程还显示了触发器 jobs_aufer 的工作原理。
注:您必须以 SQL*Plus 的 app_admin 用户身份连接到 Oracle Database。
显示 admin_pkg 子程序如何工作的步骤:
-
显示有关 ID 为 AD_VP 的职务的信息:
SELECT * FROM jobs WHERE job_id = 'AD_VP';结果:
JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY ---------- ----------------------------------- ---------- ---------- AD_VP Administration Vice President 15000 30000 -
增加此职务的最高薪金,并再次显示相关信息:
EXEC admin_pkg.update_job( 'AD_VP', p_max_salary => 31000 ); SELECT * FROM jobs WHERE job_id = 'AD_VP';结果:
JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY ---------- ----------------------------------- ---------- ---------- AD_VP Administration Vice President 15000 31000 -
显示有关 ID 为 IT_PROG 的职务的信息:
SELECT * FROM jobs WHERE job_id = 'IT_PROG';结果:
JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY ---------- ----------------------------------- ---------- ---------- IT_PROG Programmer 4000 10000 -
尝试增加此职务的最高薪金:
EXEC admin_pkg.update_job( 'IT_PROG', p_max_salary => 4001 );结果(来自 SQL*Plus):
SQL> EXEC admin_pkg.update_job( 'IT_PROG', p_max_salary => 4001 ); BEGIN admin_pkg.update_job( 'IT_PROG', p_max_salary => 4001 ); END; * ERROR at line 1: ORA-20001: Salary update would violate 5 existing employee records ORA-06512: at "APP_DATA.JOBS_AUFER", line 12 ORA-04088: error during execution of trigger 'APP_DATA.JOBS_AUFER' ORA-06512: at "APP_ADMIN.ADMIN_PKG", line 10 ORA-06512: at line 1 -
添加新职务并显示有关该职务的信息:
EXEC admin_pkg.add_job( 'AD_CLERK', 'Administrative Clerk', 3000, 7000 ); SELECT * FROM jobs WHERE job_id = 'AD_CLERK';结果:
JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY ---------- ----------------------------------- ---------- ---------- AD_CLERK Administrative Clerk 3000 7000 -
显示有关部门 100 的信息:
SELECT * FROM departments WHERE department_id = 100;结果:
DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID ------------- ------------------------------ ---------- 100 Finance 108 -
更改部门 100 的姓名和经理,并显示有关该部门的信息:
EXEC admin_pkg.update_department( 100, 'Financial Services' ); EXEC admin_pkg.update_department( 100, p_manager_id => 111, p_update_manager_id => true ); SELECT * FROM departments WHERE department_id = 100;结果:
DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID ------------- ------------------------------ ---------- 100 Financial Services 111
另请参见:“创建和管理程序包”
向 app_admin_user 授予执行权限
注:您必须以 app_admin 用户身份连接到 Oracle Database。
要向 app_admin_user(应用程序管理员)授予对软件包 admin_pkg 的执行权限,请使用以下 GRANT 语句。可以在 SQL*Plus 或 SQL Developer 工作表中输入语句。
GRANT EXECUTE ON admin_pkg TO app_admin_user;
另请参见:
-
“应用方案”
-
Oracle Database SQL Language Reference(了解有关 GRANT 语句的信息)
教程:以 app_admin_user 的身份调用 add_department
本教程使用 SQL*Plus,说明如何以 app_admin_user(应用程序管理员)身份调用 app_admin.admin_pkg.add_department 函数,然后查看有关新部门的信息。
以 app_admin_user 身份调用 admin_pkg.add_department 的步骤:
-
以 app_admin_user 身份从 SQL*Plus 连接到 Oracle Database。
有关说明,请参阅从 SQL*Plus 连接到 Oracle Database 。
-
创建以下同义词:
CREATE SYNONYM admin_pkg FOR app_admin.admin_pkg; -
为函数的返回值声明一个绑定变量:
VARIABLE n NUMBER -
添加没有经理的新部门:
EXEC :n := admin_pkg.add_department( 'New department', NULL ); -
显示新部门经理的 ID:
PRINT :n结果:
N ---------- 275
查看新部门信息的步骤:
-
以 app_admin 用户身份连接到 Oracle Database。
-
显示有关新部门的信息:
SELECT * FROM departments WHERE department_name LIKE 'New department%';结果:
DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID ------------- ------------------------------ ---------- 275 New department