admin_pkg-Package wird erstellt

In diesem Abschnitt wird gezeigt, wie Sie das Package admin_pkg erstellen, wie seine Unterprogramme funktionieren, wie dem Benutzer, der es benötigt, die Ausführungsberechtigung für das Package erteilt und wie dieser Benutzer eines seiner Unterprogramme aufrufen kann.

So erstellen Sie das admin_pkg-Paket:

  1. Verbindung zu Oracle Database als Benutzer app_admin herstellen.

    Eine Anleitung finden Sie unter "Verbindung mit Oracle Database aus SQL*Plus herstellen" oder "Verbindung mit Oracle Database aus SQL Developer herstellen".

  2. Erstellen Sie die folgenden Synonyme:

     CREATE SYNONYM departments FOR app_data.departments;
     CREATE SYNONYM jobs FOR app_data.jobs;
     CREATE SYNONYM departments_sequence FOR app_data.departments_sequence;
    

    Sie können die CREATE SYNONYM-Anweisungen entweder in SQL*Plus oder im Arbeitsblatt von SQL Developer eingeben. Alternativ können Sie die Tabellen mit dem SQL Developer-Tool "Synonym erstellen" erstellen.

  3. Erstellen Sie die Packagespezifikation.

  4. Erstellen Sie den Package Body.

Siehe:

Packagespezifikation für admin_pkg wird erstellt

Hinweis: Sie müssen als Benutzer app_admin mit Oracle Database verbunden sein.

Um die Packagespezifikation für admin_pkg, die API für Anwendungsadministratoren, zu erstellen, verwenden Sie die folgende CREATE PACKAGE-Anweisung. Sie können die Anweisung entweder in SQL*Plus oder im Arbeitsblatt von SQL Developer eingeben. Alternativ können Sie das Package mit dem SQL Developer-Tool {\b Create Package} erstellen.

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;
/

Siehe:

Package Body für admin_pkg wird erstellt

Hinweis: Sie müssen als Benutzer app_admin mit Oracle Database verbunden sein.

Um den PACKAGE BODY für admin_pkg, die API für Anwendungsadministratoren, zu erstellen, verwenden Sie die folgende Anweisung CREATE PACKAGE BODY. Sie können die Anweisung entweder in SQL*Plus oder im Arbeitsblatt von SQL Developer eingeben. Alternativ können Sie das Package mit dem SQL Developer-Tool {\b Create Body} erstellen.

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;
/

Siehe:

Tutorial: Funktionsweise der Unterprogramme admin_pkg anzeigen

In diesem Tutorial wird mit SQL*Plus gezeigt, wie die Unterprogramme des admin_pkg-Packages funktionieren. Das Tutorial zeigt auch, wie der Trigger jobs_aufer funktioniert.

Hinweis: Sie müssen über SQL*Plus als Benutzer app_admin mit Oracle Database verbunden sein.

Schritte zur Anzeige der Funktionsweise der Unterprogramme admin_pkg:

  1. Informationen zu dem Job mit der ID AD_VP anzeigen:

     SELECT * FROM jobs WHERE job_id = 'AD_VP';
    

    Ergebnis:

     JOB_ID     JOB_TITLE                           MIN_SALARY MAX_SALARY
    
     ---------- ----------------------------------- ---------- ----------
     AD_VP      Administration Vice President            15000      30000
    
  2. Erhöhen Sie das Höchstgehalt für diese Tätigkeit, und zeigen Sie die entsprechenden Informationen erneut an:

     EXEC admin_pkg.update_job( 'AD_VP', p_max_salary => 31000 );
     SELECT * FROM jobs WHERE job_id = 'AD_VP';
    

    Ergebnis:

     JOB_ID     JOB_TITLE                           MIN_SALARY MAX_SALARY
    
     ---------- ----------------------------------- ---------- ----------
     AD_VP      Administration Vice President            15000      31000
    
  3. Informationen über den Job mit der ID IT_PROG anzeigen:

     SELECT * FROM jobs WHERE job_id = 'IT_PROG';
    

    Ergebnis:

     JOB_ID     JOB_TITLE                           MIN_SALARY MAX_SALARY
    
     ---------- ----------------------------------- ---------- ----------
     IT_PROG    Programmer                                4000      10000
    
  4. Versuchen Sie, das Höchstgehalt für diese Tätigkeit zu erhöhen:

     EXEC admin_pkg.update_job( 'IT_PROG', p_max_salary => 4001 );
    

    Ergebnis (aus 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. Fügen Sie einen neuen Job hinzu, und zeigen Sie die Informationen dazu an:

     EXEC admin_pkg.add_job( 'AD_CLERK', 'Administrative Clerk', 3000, 7000 );
     SELECT * FROM jobs WHERE job_id = 'AD_CLERK';
    

    Ergebnis:

     JOB_ID     JOB_TITLE                           MIN_SALARY MAX_SALARY
    
     ---------- ----------------------------------- ---------- ----------
     AD_CLERK   Administrative Clerk                      3000       7000
    
  6. Informationen zu Abteilung 100 anzeigen:

     SELECT * FROM departments WHERE department_id = 100;
    

    Ergebnis:

     DEPARTMENT_ID DEPARTMENT_NAME                MANAGER_ID
    
     ------------- ------------------------------ ----------
               100 Finance                               108
    
  7. Ändern Sie den Namen und den Manager der Abteilung 100, und zeigen Sie die Informationen dazu an:

     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;
    

    Ergebnis:

     DEPARTMENT_ID DEPARTMENT_NAME                MANAGER_ID
    
     ------------- ------------------------------ ----------
               100 Financial Services                    111
    

Siehe auch: "Packages erstellen und verwalten"

Berechtigung "Execute" an app_admin_user erteilen

Hinweis: Sie müssen als Benutzer app_admin mit Oracle Database verbunden sein.

Um app_admin_user (einem Anwendungsadministrator) die Ausführungsberechtigung für das Package admin_pkg zu erteilen, verwenden Sie die folgende GRANT-Anweisung. Sie können die Anweisung entweder in SQL*Plus oder im Arbeitsblatt von SQL Developer eingeben.

GRANT EXECUTE ON admin_pkg TO app_admin_user;

Siehe:

Tutorial: add_department wird als app_admin_user aufgerufen

Mit SQL*Plus zeigt dieses Tutorial, wie Sie die Funktion app_admin.admin_pkg.add_department als Benutzer app_admin_user (ein Anwendungsadministrator) aufrufen und dann die Informationen zur neuen Abteilung anzeigen.

Schritte zum Aufrufen von admin_pkg.add_department als app_admin_user:

  1. Melden Sie sich über SQL*Plus als Benutzer app_admin_user bei Oracle Database an.

    Anweisungen finden Sie unter "Herstellen einer Verbindung mit Oracle Database aus SQL*Plus".

  2. Erstellen Sie dieses Synonym:

     CREATE SYNONYM admin_pkg FOR app_admin.admin_pkg;
    
  3. Bind-Variable für den Rückgabewert der Funktion deklarieren:

     VARIABLE n NUMBER
    
  4. Neue Abteilung ohne Manager hinzufügen:

     EXEC :n := admin_pkg.add_department( 'New department', NULL );
    
  5. Zeigen Sie die ID des Managers der neuen Abteilung an:

     PRINT :n
    

    Ergebnis:

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

Schritte zum Anzeigen der Informationen zur neuen Abteilung:

  1. Verbindung zu Oracle Database als Benutzer app_admin herstellen.

  2. Informationen zur neuen Abteilung anzeigen:

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

    Ergebnis:

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