建立 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 工具「建立同義字」來建立表格。
-
建立薪資配套規格。
-
建立套件主體。
建立 admin_pkg 的套裝軟體規格
注意:您必須以 app_admin 使用者身分連線到 Oracle Database。
若要為應用程式管理員的 API 建立 admin_pkg 的套裝軟體規格,請使用下列 CREATE PACKAGE 陳述式。您可以在 SQL*Plus 或 SQL Developer 的「工作表」中輸入敘述句。或者,您也可以使用 SQL Developer 工具「建立套裝程式」建立套裝程式。
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。
若要為應用程式管理員的 API 建立 admin_pkg 的套裝程式主體,請使用下列 CREATE PACKAGE BODY 敘述句。您可以在 SQL*Plus 或 SQL Developer 的「工作表」中輸入敘述句。或者,您可以使用 SQL Developer 工具「建立主體」來建立套裝程式。
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。
若要將套裝程式 admin_pkg 的執行權限授予 app_admin_user (應用程式管理員),請使用下列 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 的步驟:
-
從 SQL*Plus,以使用者 app_admin_user 的身分連線到 Oracle Database。
如需指示,請參閱 Connecting to Oracle Database from SQL*Plus 。
-
建立此同義字:
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