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:
-
Blenden Sie im Schritt "Verbindungen" hr_conn ein.
-
Blenden Sie in der Liste der Schemaobjekttypen die Option Packages ein.
-
Blenden Sie in der Liste der Pakete EMP_EVAL ein.
-
Klicken Sie in der Auswahlliste mit der rechten Maustaste auf EMP_EVAL Body.
Eine Optionsliste wird angezeigt.
-
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; -
fügen Sie zwischen
RETURN NUMBER ASundBEGINdiese 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 1The title of the EMP_EVAL Bodypane changes to italic font, indicating that the code is not saved in the database. -
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:
-
Oracle Database PL/SQL Language Reference für allgemeine Informationen zum Deklarieren von Variablen und Konstanten
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"):
-
Die Variable n_score enthält einen Wert aus der Spalte SCORE.SCORES, und die Konstante max_score wird mit diesen Werten verglichen.
-
Die Variable n_weight enthält einen Wert aus der Spalte PERFORMANCE_PARTS.WEIGHT, und die Konstante max_weight wird mit diesen Werten verglichen.
-
Der Parameter "evaluation_id" enthält einen Wert aus der Spalte SCORE.EVALUATION_ID.
-
Der Parameter performance_id enthält einen Wert aus der Spalte SCORE.PERFORMANCE_ID.
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:
-
Oracle Database PL/SQL Language Reference für weitere Informationen zum Attribut
%TYPE -
Oracle Database PL/SQL Language Reference für die Syntax des Attributs %TYPE
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:
-
Blenden Sie im Schritt "Verbindungen" hr_conn ein.
-
Blenden Sie in der Liste der Schemaobjekttypen die Option Packages ein.
-
Blenden Sie in der Liste der Pakete EMP_EVAL ein.
-
Klicken Sie in der Auswahlliste mit der rechten Maustaste auf EMP_EVAL Body.
-
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; -
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; -
Klicken Sie mit die rechte Maustaste auf EMP_EVAL.
-
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; -
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) -
Klicken Sie mit die rechte Maustaste auf EMP_EVAL.
-
Wählen Sie in der Auswahlliste Kompilieren aus.
-
Klicken Sie mit die rechte Maustaste auf EMP_EVAL Body.
-
Wählen Sie in der Auswahlliste Kompilieren aus.
Variablen Werte zuweisen
Sie können einer Variable einen Wert auf folgende Weisen zuweisen:
-
Um der Variable den Wert eines Ausdrucks zuzuweisen, verwenden Sie den Zuweisungsoperator.
-
Verwenden Sie die Anweisung SELECT INTO oder FETCH, um ihr einen Wert aus einer Tabelle zuzuweisen.
-
Übergeben Sie die Variable als OUT- oder IN OUT-Parameter IN ein Unterprogramm, und weisen Sie dann den Wert innerhalb des Unterprogramms zu.
-
Binden Sie die Variable an einen Wert.
Siehe:
-
Oracle Database PL/SQL Language Reference, um weitere Informationen zum Zuweisen von Werten zu Variablen zu erhalten
-
Oracle Database 2 Day + Java Developer's Guide für Informationen zu Binding-Variablen
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:
-
Oracle Database PL/SQL Language Reference zum Deklarieren von Variablen-Syntax
-
Oracle Database PL/SQL Language Reference: Syntax von Zuweisungsanweisungen
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;