Werte für Variablen und Konstanten deklarieren und zuweisen

Eine Variable oder Konstante, die in einer Packagespezifikation deklariert ist, steht jedem Programm zur Verfügung, das Zugriff auf das Package hat. In einem Package-Body oder Unterprogramm deklarierte Variablen oder Konstanten ist lokal und nur im entsprechenden Package oder Unterprogramm gültig. Beim Deklarieren einer Konstanten müssen Sie ihr einen Ausgangswert zuweisen.

Ein bedeutender Vorteil von PL/SQL gegenüber SQL ist, dass Sie in PL/SQL Variablen und Konstanten deklarieren und verwenden können.

Eine Variable oder Konstante, die in einer Packagespezifikation deklariert ist, steht jedem Programm zur Verfügung, das Zugriff auf das Package hat. In einem Package-Body oder Unterprogramm deklarierte Variablen oder Konstanten ist lokal und nur im entsprechenden Package oder Unterprogramm gültig.

Eine Variable nimmt einen Wert eines bestimmten Datentyps auf. Das Programm kann den Wert der Variablen zur Laufzeit ändern. Eine Konstante nimmt einen Wert an, der nicht geändert werden kann.

Variablen oder Konstanten können einen beliebigen PL/SQL-Datentyp haben. Beim Deklarieren einer Variablen können Sie ihr einen Ausgangswert zuweisen; wenn Sie dies nicht tun, ist ihr Ausgangswert NULL. Beim Deklarieren einer Konstanten müssen Sie ihr einen Ausgangswert zuweisen. Zum Zuweisen eines Ausgangswerts für eine Variable oder Konstante verwenden Sie den Zuordnungsoperator (:=).

Tipp: Alle Werte, die sich nicht ändern, als Konstanten deklarieren. Dies optimiert den kompilierten Code und erleichtert die Pflege des Quellcodes.

Siehe auch: Oracle Database PL/SQL Language Reference für allgemeine Informationen zu Variablen und Konstanten

Tutorial: Variablen und Konstanten in einem Unterprogramm deklarieren

In diesem Tutorial wird beschrieben, wie Sie mit dem Tool "Bearbeiten" von SQL Developer Variablen und Konstanten in der Funktion EMP_EVAL.CALCULATE_SCORE deklarieren. (Dieses Tutorial liefert auch ein Beispiel für das Ändern eines Package Bodys.)

Die Funktion EMP_EVAL.CALCULATE_SCORE wird in "Tutorial: Packagespezifikation erstellen" angegeben.

Schritte zum Deklarieren von Variablen und Konstanten in der Funktion CALCULATE_SCORE:

  1. Blenden Sie im Schritt "Verbindungen" hr_conn ein.

  2. Blenden Sie in der Liste der Schemaobjekttypen die Option Packages ein.

  3. Blenden Sie in der Liste der Pakete EMP_EVAL ein.

  4. Klicken Sie in der Auswahlliste mit der rechten Maustaste auf EMP_EVAL Body.

    Eine Optionsliste wird angezeigt.

  5. Wählen Sie in der Auswahlliste Bearbeiten aus.

    Der EMP_EVAL-Bodybereich wird angezeigt. Er zeigt den Code für den Package Body:

     CREATE OR REPLACE
     PACKAGE BODY EMP_EVAL AS
    
       PROCEDURE eval_department ( dept_id IN NUMBER ) AS
    
       BEGIN
    
         -- TODO implementation required for PROCEDURE EMP_EVAL.eval_department
         NULL;
       END eval_department;
    
       FUNCTION calculate_score ( evaluation_id IN NUMBER
                               , performance_id IN NUMBER)
                               RETURN NUMBER AS
       BEGIN
    
         -- TODO implementation required for FUNCTION EMP_EVAL.calculate_score
         RETURN NULL;
       END calculate_score;
    
     END EMP_EVAL;
    
  6. fügen Sie zwischen RETURN NUMBER AS und BEGIN diese Variablen-und Konstantendeklarationen hinzu:

     n_score       NUMBER(1,0);                -- variable
     n_weight      NUMBER;                     -- variable
     max_score     CONSTANT NUMBER(1,0) := 9;  -- constant, initial value 9
    
     max_weight    CONSTANT NUMBER(8,8) := 1;  -- constant, initial value 1
    
     The title of the EMP_EVAL Bodypane changes to italic font, indicating that the code is not saved in the database.
    
  7. Wählen Sie im Menü "Datei" die Option Speichern.

    Oracle Database kompiliert und speichert den geänderten Package Body. Der Titel des Bereichs "EMP_EVAL Body" wird nicht mehr in Kursivschrift dargestellt.

Siehe:

Sicherstellen, dass Variablen, Konstanten und Parameter den richtigen Datentyp haben

Stellen Sie sicher, dass Variablen, Konstanten und Parameter die richtigen Datentypen aufweisen, indem Sie sie mit dem Attribut %TYPE deklarieren.

Nach dem Tutorial: Variablen und Konstanten in einem Unterprogramm deklarieren ist der Code für die Funktion EMP_EVAL.CALCULATE_SCORE wie folgt:

FUNCTION calculate_score ( evaluation_id IN NUMBER
                          , performance_id IN NUMBER )
                          RETURN NUMBER AS
  n_score       NUMBER(1,0);                -- variable
  n_weight      NUMBER;                     -- variable
  max_score     CONSTANT NUMBER(1,0) := 9;  -- constant, initial value 9
  max_weight    CONSTANT NUMBER(8,8) := 1;  -- constant, initial value 1
  BEGIN
    -- TODO implementation required for FUNCTION EMP_EVAL.calculate_score
    RETURN NULL;
  END calculate_score;

Die Variablen, Konstanten und Parameter der Funktion stellen Werte aus den Tabellen SCORES und PERFORMANCE_PARTS dar (erstellt in "Tabellen erstellen"):

Entsprechend verfügen alle Variablen, Konstanten und Parameter über den gleichen Datentyp als zugehörige Spalte.

Wenn sich die Datentypen der Spalten ändern, möchten Sie, dass die Datentypen der Variablen, Konstanten und Parameter in dieselben Datentypen geändert werden; andernfalls wird die Funktion CALCULATE_SCORE ungültig.

Um sicherzustellen, dass die Datentypen von Variablen, Konstanten und Parametern immer denen der Spalten entsprechen, sollten sie mit dem Attribut %TYPE deklariert wird. Das Attribut %TYPE stellt den Datentyp einer Tabellenspalte oder einer anderen Variablen bereit und sorgt so dafür, dass die korrekte Datentypzuweisung gewährleistet ist.

Siehe:

Tutorial: Deklarationen für die Verwendung des Attributs %TYPE ändern

Dieses Tutorial zeigt, wie Sie mit dem SQL Developer-Tool "Bearbeiten" die Deklarierungen der Variablen, Konstanten und formalen Parameter der Funktion EMP_EVAL.CALCULATE_SCORE in einem Unterprogramm deklarieren können.

Die Funktion EMP_EVAL.CALCULATE_SCORE wird in "Tutorial: Variablen und Konstanten in einem Unterprogramm deklarieren" angezeigt.

Schritte zum Ändern der Deklarationen in CALCULATE_SCORE, sodass sie %TYPE verwenden:

  1. Blenden Sie im Schritt "Verbindungen" hr_conn ein.

  2. Blenden Sie in der Liste der Schemaobjekttypen die Option Packages ein.

  3. Blenden Sie in der Liste der Pakete EMP_EVAL ein.

  4. Klicken Sie in der Auswahlliste mit der rechten Maustaste auf EMP_EVAL Body.

  5. Wählen Sie in der Auswahlliste Bearbeiten aus.

    Der Bodypan EMP_EVAL wird angezeigt. Er zeigt den Code für den Package Body an:

     CREATE OR REPLACE
     PACKAGE BODY emp_eval AS
    
       PROCEDURE eval_department ( dept_id IN NUMBER ) AS
       BEGIN
    
         -- TODO implementation required for PROCEDURE EMP_EVAL.eval_department
         NULL;
       END eval_department;
    
       FUNCTION calculate_score ( evaluation_id IN NUMBER
                               , performance_id IN NUMBER )
                               RETURN NUMBER AS
       n_score       NUMBER(1,0);                -- variable
       n_weight      NUMBER;                     -- variable
       max_score     CONSTANT NUMBER(1,0) := 9;  -- constant, initial value 9
    
       max_weight    CONSTANT NUMBER(8,8) := 1;  -- constant, initial value 1
    
       BEGIN
    
         -- TODO implementation required for FUNCTION EMP_EVAL.calculate_score
         RETURN NULL;
       END calculate_score;
    
     END emp_eval;
    
  6. Nehmen Sie im Code für die Funktion die folgenden Änderungen vor:

     FUNCTION calculate_score ( evaluation_id IN SCORES.EVALUATION_ID%TYPE
                               , performance_id IN SCORES.PERFORMANCE_ID%TYPE)
                               RETURN NUMBER AS
     n_score       SCORES.SCORE%TYPE;
     n_weight      PERFORMANCE_PARTS.WEIGHT%TYPE;
     max_score     CONSTANT SCORES.SCORE%TYPE := 9;
     max_weight    CONSTANT PERFORMANCE_PARTS.WEIGHT%TYPE := 1;
    
  7. Klicken Sie mit die rechte Maustaste auf EMP_EVAL.

  8. Wählen Sie in der Auswahlliste Bearbeiten aus.

    Der Fensterbereich EMP_EVAL wird geöffnet und zeigt die Anweisung CREATE PACKAGE, mit der das PACKAGE erstellt wurde:

     CREATE OR REPLACE PACKAGE EMP_EVAL AS
    
     PROCEDURE eval_department(dept_id IN NUMBER);
     FUNCTION calculate_score(evaluation_id IN NUMBER
                             , performance_id IN NUMBER)
                               RETURN NUMBER;
    
     END EMP_EVAL;
    
  9. Nehmen Sie im Code für die Funktion die folgenden Änderungen vor:

     FUNCTION calculate_score(evaluation_id IN scores.evaluation_id%TYPE
                             , performance_id IN scores.performance_id%TYPE)
    
  10. Klicken Sie mit die rechte Maustaste auf EMP_EVAL.

  11. Wählen Sie in der Auswahlliste Kompilieren aus.

  12. Klicken Sie mit die rechte Maustaste auf EMP_EVAL Body.

  13. Wählen Sie in der Auswahlliste Kompilieren aus.

Variablen Werte zuweisen

Sie können einer Variable einen Wert auf folgende Weisen zuweisen:

Siehe:

Mit dem Zuweisungsoperator Variablen Werte zuweisen

Mit dem Zuweisungsoperator (:=) können Sie den Wert eines Ausdrucks einer Variable im deklarativen oder ausführbaren Teil eines Unterprogramms zuweisen.

Im deklarativen Teil eines Unterprogramms können Sie einer Variable einen Ausgangswert zuweisen, wenn Sie sie deklarieren. Die Syntax lautet:

variable_name data_type := expression;

Im ausführbaren Teil eines Unterprogramms können Sie einer Variable einen Wert mit einer Zuweisungsanweisung zuweisen. Die Syntax lautet:

variable_name := expression;

Beispiel 5-1 zeigt die Änderungen, die an der Funktion EMP_EVAL.CALCULATE_SCORE vorgenommen werden, um eine Variable "running_total" hinzuzufügen und sie als Rückgabewert der Funktion zu verwenden. Der Zuweisungsoperator wird sowohl im deklarativen als auch im ausführbaren Teil der Funktion angezeigt. (Der Datentyp von running_total muss NUMBER und nicht SCORES.SCORE%TYPE oder PERFORMANCE_PARTS.WEIGHT%TYPE sein, da er das Produkt von zwei NUMBER-Werten mit unterschiedlichen Genauigkeiten und Skalierungen enthält.)

Siehe:

Beispiel 5-1: Einer Variablen mit Zuweisungsoperator Werte zuweisen

FUNCTION calculate_score(evaluation_id IN SCORES.EVALUATION_ID%TYPE
                         , performance_id IN SCORES.PERFORMANCE_ID%TYPE)
                         RETURN NUMBER AS
  n_score       SCORES.SCORE%TYPE;
  n_weight      PERFORMANCE_PARTS.WEIGHT%TYPE;
  running_total NUMBER := 0;
  max_score     CONSTANT SCORES.SCORE%TYPE := 9;
  max_weight    CONSTANT PERFORMANCE_PARTS.WEIGHT%TYPE:= 1;
BEGIN
  running_total := max_score * max_weight;
  RETURN running_total;
END calculate_score;

Variablen mit der Anweisung SELECT INTO Werte zuweisen

Um Tabellenwerte in Unterprogrammen oder Packages zu verwenden, müssen Sie sie Variablen mit SELECT INTO-Anweisungen zuweisen. Beispiel 5-2 zeigt die Änderungen, die an der Funktion EMP_EVAL.CALCULATE_SCORE vorgenommen werden müssen, damit sie running_total aus den Tabellenwerten berechnet.

Die Prozedur ADD_EVAL in Beispiel 5-3 fügt eine Zeile in die Tabelle EVALUATIONS ein. Dabei werden Werte aus der entsprechenden Zeile in der Tabelle EMPLOYEES verwendet. Fügen Sie die Prozedur ADD_EVAL dem Body des Packages EMP_EVAL hinzu, jedoch nicht der Spezifikation. Da sich ADD_EVAL nicht in der Spezifikation befinden, ist es lokal im Package. Es kann nur von anderen Unterprogrammen im Package, nicht aber von außerhalb des Package aus aufgerufen wird.

Siehe auch: Oracle Database PL/SQL Language Reference enthält weitere Informationen zur SELECT INTO-Anweisung.

Beispiel 5-2: Tabellenwerte mit SELECT INTO zu Variablen zuweisen

FUNCTION calculate_score ( evaluation_id IN scores.evaluation_id%TYPE
                         , performance_id IN scores.performance_id%TYPE )
                         RETURN NUMBER AS

  n_score       scores.score%TYPE;
  n_weight      performance_parts.weight%TYPE;
  running_total NUMBER := 0;
  max_score     CONSTANT scores.score%TYPE := 9;
  max_weight    CONSTANT performance_parts.weight%TYPE:= 1;
BEGIN
  SELECT s.score INTO n_score
  FROM SCORES s
  WHERE evaluation_id = s.evaluation_id
  AND performance_id = s.performance_id;

  SELECT p.weight INTO n_weight
  FROM PERFORMANCE_PARTS p
  WHERE performance_id = p.performance_id;

  running_total := n_score * n_weight;
  RETURN running_total;
END calculate_score;

Beispiel 5-3: Tabellenzeilen mit Werten aus einer anderen Tabelle einfügen

PROCEDURE add_eval ( employee_id IN EMPLOYEES.EMPLOYEE_ID%TYPE
                   , today IN DATE )
AS
  job_id         EMPLOYEES.JOB_ID%TYPE;
  manager_id     EMPLOYEES.MANAGER_ID%TYPE;
  department_id  EMPLOYEES.DEPARTMENT_ID%TYPE;
BEGIN
  INSERT INTO EVALUATIONS (
    evaluation_id,
    employee_id,
    evaluation_date,
    job_id,
    manager_id,
    department_id,
    total_score
  )
  SELECT
    evaluations_sequence.NEXTVAL,   -- evaluation_id
    add_eval.employee_id,      -- employee_id
    add_eval.today,            -- evaluation_date
    e.job_id,                  -- job_id
    e.manager_id,              -- manager_id
    e.department_id,           -- department_id
    0                          -- total_score
  FROM employees e;

  IF SQL%ROWCOUNT = 0 THEN
    RAISE NO_DATA_FOUND;
  END IF;
END add_eval;