建立 admin_pkg 套裝軟體

此段落顯示如何建立 admin_pkg 套裝程式、其子程式的運作方式、如何將套裝程式的 EXECUTE 權限授與需要該套裝程式的使用者,以及該使用者如何呼叫它的其中一個子程式。

若要建立 admin_pkg 套裝軟體:

  1. 以使用者 app_admin 的身分連線至 Oracle AI Database。

    如需相關指示,請參閱從 SQL*Plus 連線至 Oracle AI Database從 SQL Developer 連線至 Oracle AI Database

  2. 建立這些同義字:

    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 工具「建立同義字」來建立表格。

  3. 建立薪資配套規格。

  4. 建立套件主體。

另請參閱:

建立 admin_pkg 的套裝軟體規格

注意:您必須以 app_admin 使用者身分連線到資料庫。

若要為應用程式管理員的 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;
/

另請參閱:

建立 admin_pkg 的套裝軟體主體

注意:您必須以 app_admin 使用者身分連線到資料庫。

若要為應用程式管理員的 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;
/

另請參閱:

教學課程:顯示 admin_pkg 子程式的運作方式

本教學課程使用 SQL*Plus 顯示 admin_pkg 套裝程式的子程式如何運作。教學課程也會顯示觸發程式 jobs_aufer 的運作方式。

注意:您必須從 SQL*Plus 以使用者 app_admin 身分連線到資料庫。

若要顯示 admin_pkg 子程式的運作方式:

  1. 顯示其 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
  2. 增加此職務的薪資上限,並再次顯示其相關資訊:

    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
  3. 顯示 ID 為 IT_PROG 之工作的相關資訊:

    SELECT * FROM jobs WHERE job_id = 'IT_PROG';

    結果:

    JOB_ID     JOB_TITLE                           MIN_SALARY MAX_SALARY
    
    ---------- ----------------------------------- ---------- ----------
    IT_PROG    Programmer                                4000      10000
  4. 嘗試增加此職務的薪資上限:

    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
  5. 新增工作並顯示其相關資訊:

    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
  6. 顯示部門 100 的相關資訊:

    SELECT * FROM departments WHERE department_id = 100;

    結果:

    DEPARTMENT_ID DEPARTMENT_NAME                MANAGER_ID
    
    ------------- ------------------------------ ----------
              100 Finance                               108
  7. 變更部門 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

另請參閱:建立與管理套裝程式

將 EXECUTE 權限授予 app_admin_user

注意:您必須以 app_admin 使用者身分連線到資料庫。

若要將套裝軟體 admin_pkg 的 EXECUTE 權限授予 app_admin_user (應用程式管理員),請使用下列 GRANT 陳述式。您可以在 SQL*Plus 或 SQL Developer 的「工作表」中輸入敘述句。

GRANT EXECUTE ON admin_pkg TO app_admin_user;

另請參閱:

教學課程:以 app_admin_user 的身分呼叫 add_department

本教學課程使用 SQL*Plus,說明如何以使用者 app_admin_user (應用程式管理員) 的身分來呼叫 app_admin.admin_pkg.add_department 函數,然後查看新部門的相關資訊。

以 app_admin_user 身分呼叫 admin_pkg.add_department:

  1. 從 SQL*Plus 以使用者 app_admin_user 的身分連線至 Oracle AI Database。

    如需指示,請參閱 Connecting to Oracle AI Database from SQL*Plus

  2. 建立此同義字:

    CREATE SYNONYM admin_pkg FOR app_admin.admin_pkg;
  3. 為函數的傳回值宣告連結變數:

    VARIABLE n NUMBER
  4. 新增沒有經理人員的新部門:

    EXEC :n := admin_pkg.add_department( 'New department', NULL );
  5. 顯示新部門的經理人員 ID:

    PRINT :n

    結果:

            N
    
    ----------
          275

若要查看新部門的相關資訊:

  1. 以使用者 app_admin 身分連線資料庫。

  2. 顯示關於新部門的資訊 :

    SELECT * FROM departments WHERE department_name LIKE 'New department%';

    結果:

    DEPARTMENT_ID DEPARTMENT_NAME                MANAGER_ID
    
    ------------- ------------------------------ ----------
              275 New department