admin_pkg-Package wird erstellt

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

So erstellen Sie das admin_pkg-Paket:

  1. Stellen Sie als Benutzer app_admin eine Verbindung zu Oracle AI Database her.

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

  2. Erstellen Sie diese 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 bei der Datenbank angemeldet 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 bei der Datenbank angemeldet 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 bei der Datenbank angemeldet sein.

So zeigen Sie die Funktionsweise der Unterprogramme admin_pkg an:

  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"

Erteilen der EXECUTE-Berechtigung für app_admin_user

Hinweis: Sie müssen als Benutzer app_admin bei der Datenbank angemeldet sein.

Um app_admin_user (einem Anwendungsadministrator) die Berechtigung EXECUTE 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.

So rufen Sie admin_pkg.add_department als app_admin_user auf:

  1. Stellen Sie über SQL*Plus eine Verbindung zu Oracle AI Database als Benutzer app_admin_user her.

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

  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

So zeigen Sie die Informationen zur neuen Abteilung an:

  1. Melden Sie sich bei der Datenbank als Benutzer app_admin an.

  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