codestory

Die Anleitung zu Oracle PL/SQL

  1. Die Vorstellung
  2. Was brauchen Sie um PL/SQL zu beginnen?
  3. Die Überblick von PL/SQL
  4. Die grundlegenden Befehle PL/SQL 
  5. Mit PL/SQL durch PL/SQL Developer anfangen
  6. Die üblichen Datentype und die Meldung
  7. Der Mauszeiger (Cursor)
  8. Der Verfahren (Procedure)
  9. Die Funktion
  10. Package
  11. Was ist Oracle Application Express ?

1. Die Vorstellung

PL/SQL (Procedural Language/Structured Query Language) ist eine verfahrenorientierte Programmiersprache für Oracle SQL. Es ist eine Verlängerung vom Oracle SQL.
PL/SQL umfasst die verfahrenorientierte Sprache-elemente. Das sind die Bedingungen und die Schleife. Es erlaubt die Konstante und die Variable, die Verfahren, und die Funktion, das Datentyp und die Variable der Datentype, und die trigger zu melden. Es kann die Ausnahme bei der Runtime behandeln. Der Array wird unterstützt um für die Kollektion in PL/SQL zu benutzen.Ab die Version 8 umfasst es die objektsorientierte Funktion. Es erstellt PL/SQL als einn Verfahren, eine Package, Datentyp, triggers. Die Dinge, die in Database gespeichert werden, werden durch alle Applikation zur Kommunikation mit Oracle wieder benutzt

Beachten Sie: In den folgenden Beispiel benutze ich PL/SQL Developer von Version 8.x,allerdings gibt es keinen Unterschied wenn Sie PL/SQL Developer von der Version 10.x oder eine andere Version benutzen

2. Was brauchen Sie um PL/SQL zu beginnen?

Sie brauchen ein Programmierstool um PL/SQL schnell zu zugreifen. Nach meiner Erfahrungen können Sie PL/SQL Developer benutzen. Das ist ein abstraktes Tool um mit Oracle zu arbeiten und PL/SQL zu programmieren
Sie können die Anleitung der Installation und der Konfiguration von PL/SQL bei... schauen:
Im Dokument benutze ich LearningSQL (Eine kleine Database zur Anleitung von SQL in der Website o7planning.org). Sie können die Database nach der folgenden Anleitung erstellen

3. Die Überblick von PL/SQL

Sie sollen einigen Begriffe bei der Programmierung mit PL/SQL beherrschen:
  • Jeder Befehl SQL endet mit Semikolon (;)
  • Der Befehl vom Data Definition Language - DDL) wird nicht in PL/SQL benutzt
  • Der Befehl SELECT.. INTO, der viele Zeile rückgibt, kann viele Ausnahme verursachen ( > 1 Zeile).
  • Der Befehl SELECT .. INTO, der keine Zeile rückgibt, kann viele Ausnahme verursachen
  • Der Befehl vom Data Manipulation Language - DMLkann auf vielen Datenzeilen auswirken.
  • Den Operator := benutzen um die Wert einer Variable zu zuweisen
-- assign value to variable
x  := 1;

-- Insert:
Insert into Department (Dept_Id, Dept_No, Dept_Name, Location)
 values (1, 'D1', 'HR', 'Chicago');

-- Catch exception:
Begin
  Select Dept.Dept_Id
  into v_Dept_Id
  from Department Dep;
Exception when too_many_rows then
  Dbms_Output.put_line('Error:'||Sqlerrm);
End;

......
PL/SQL wird nach jedem Befehlblock organisiert. Jedes Block kann mehrere Sub-Block darin haben
Declare
-- The declaration block - (Optional)
-- Declare the variables used in the body
v_Location Varchar2(100);
Begin
-- Body of block
-- Statements ...
v_Location := 'Chicago';
-- ....
Exception
-- Catch exception block - Optional
-- Catching the various exceptions.
When No_Data_Found Then
   -- Exception when SELECT ..INTO statement return nothing
   -- (Optional)
   -- Do something here.
   -- Or null if do nothing
   Null;
When Too_Many_Rows Then
   -- Exception when the SELECT .. INTO statement returns multiple records ( > 1)
   -- (Optional)
   Null;
When Others Then
   -- Other exceptions
   Null;
End;

4. Die grundlegenden Befehle PL/SQL 

Hier stelle ich die Überblick über die grundlegenden Befehle vom PL/SQL vor. Sie können es durch die Beispiele in die nächsten Teilen mehr kennen
Der Befehl If-elsif-else
Die Syntax
IF <condition 1> THEN
    Job 1;
[ELSIF <condition 2> THEN
     Job 2;
]
[ELSE
     Job n + 1;
]
END IF;
Zum Beispiel
If v_Option = 1 Then
   v_Action := 'Run';
Elsif v_Option = 2 Then
   v_Action := 'Backup';
Elsif v_Option = 3 Then
   v_Action := 'Stop';
Else
   v_Action := 'Invalid';
End If;
die Schleife LOOP)
Die Syntax
LOOP
 -- Do something here
EXIT WHEN <Condition>;
END LOOP;
Zum Beispiel
x := 0;
Loop
 x := x + 1;
 y := y - x;
Exit When x > y;
End Loop;
die Schleife FOR LOOP)
Die Syntax
FOR v_Index IN <Min value> .. <Max value>
LOOP
 -- Do something here
END LOOP;
Zum Beispiel
x := 0;
For v_Idx In 1 .. 100 Loop
 x := x + 1;
End Loop;
die Schleife WHILE)
Die Syntax
WHILE <Condition> LOOP
 -- Do something here
END LOOP;
Zum Beispiel
v_Text Varchar2(100);
...

While Length(v_Text) < 50 Loop
   v_Text := v_Text || '00';
End Loop

5. Mit PL/SQL durch PL/SQL Developer anfangen

Zuerst sollen Sie PL/SQL Developer öffnen und in den user learningsql melden:
Auf PL/SQL Developer erstellen Sie ein Fenster SQL:
Eine einfache Code zur Kalkulation der Summe von 2 Zähle schreiben
Declare
  v_Result Number;
  -- Declare a variable of type Number with value of 50
  v_a Number := 50;
  -- Declare a variable of type Number with value 100
  v_b Number := 100;
Begin
  -- Print out Console Screen
  Dbms_Output.Put_Line('v_a= ' || v_a);
  -- Print out Console Screen
  Dbms_Output.Put_Line('v_b= ' || v_b);
  -- Sum
  v_Result := v_a + v_b;
  -- Print out Console Screen
  Dbms_Output.Put_Line('v_Result= ' || v_Result);
End;
Klicken Sie auf das Symbol oder auf F8 um die Code zu implementieren
Das Ergebnis zur Beispiel-Durchführung

6. Die üblichen Datentype und die Meldung

Das Datenstyp Zahl
Die Datentype Zahl im PL/SQL
Data Typ
Die Bezeichnung
PLS_INTEGER
Gezeichneter Integer 32 bit liegt in dem Raum vom -2,147,483,648 bis 2,147,483,647.
BINARY_INTEGER
Gezeichneter Integer 32 bit liegt in dem Raum vom -2,147,483,648 bis 2,147,483,647.
BINARY_FLOAT
Single-precision IEEE 754-format floating-point number
BINARY_DOUBLE
Double-precision IEEE 754-format floating-point number
NUMBER(prec, scale)
Die feste Punkt (Fixed-point) mit der absoluten Wert vom 1E-130 bis (nicht einschließend) 1.0E126. Eine Variable NUMBER kann 0 bezeichnen
DEC(prec, scale)
Die feste Punkt (Fixed-point) ANSI mit der maximalen Genauigkeit von 38 Dezimalzahlen
DECIMAL(prec, scale)
Die feste Punkt (Fixed-point) IBM mit der maximalen Genauigkeit von 38 Dezimalzahlen
NUMERIC(pre, secale)
Floating type mit der maximalen Genauigkeit von 38 Dezimalzahle
DOUBLE PRECISION
ANSI floating-point typ mit der maximalen Genauigkeit von 126 Binärzahlen (ca.38 Dezimalzahlen).
FLOAT
ANSI undIBM floating-point Typ mit der maximalen Genauigkeit von 126 Binärzahlen (ca. 38 Dezimalzahlen).
INT
ANSI integer Typ mit der maximalen Genauigkeit von 38 Dezimalzahlen
INTEGER
ANSI undIBM Typ mit der maximalen Genauigkeit von 38 Dezimalzahlen
SMALLINT
Die ganze Zahl vom -32768 --> 32767
REAL
Floating-point Typ mit der maximalen Genauigkeit von 63 Binärzahlen (ca. 18 Dezimalzahlen)
Die üblichsten Datenstyp Zahl
Data type
Declaration
Number
v_Amount Number(15,2)
v_Salary Number;
Integer
v_Age Integer;
Float
v_Amount Float;
Double
Real
Das Typ Text
Das üblichste Typ
Data type
Declaration
Varchar2
v_First_Name Varchar2(32);
Das Typ Date/time
Data type
Declaration
Date
v_Birthday Date;
Das Typ eine Spalte (%type)
Das ist die Struktur der Tabelle EMPLOYEE:
Die Spalte First_Name in der Tabelle Employee hat das Typ Varchar2 und die Länge von 20 Zeichen. Um eine Variable mit der Wert der Spalte zu melden, können Sie in die folgenden Maßnahmen melden
-- Declaring a varchar2 variable, length 20.
-- This variable can store value for column FIRST_NAME (of EMPLOYEE table)
v_First_Name Varchar2(20);

-- Assign values to v_First_Name, taken from the query.
-- Exception may occur when length of variable < length of string value
Select Emp.First_Name
into v_First_Name
From Employee Emp
Where Emp.Emp_Id = 1;

-- Declaring a varchar2 variable, length 30.
-- This variable can also store value for the column FIRST_NAME
v_First_Name2 Varchar2(30);

-- Safe:
v_First_Name Employee.First_Name%Type;


 
Zum Beispiel
Declare
  v_Emp_Id     Employee.Emp_Id%Type := 1;
  v_First_Name Employee.First_Name%Type;
Begin
  Select Emp.First_Name
  Into   v_First_Name
  From   Employee Emp
  Where  Emp.Emp_Id = v_Emp_Id;
  ----
  Dbms_Output.Put_Line('v_First_Name= ' || v_First_Name);
Exception
  When No_Data_Found Then
     -- When SELECT .. INTO returns nothing.
     Dbms_Output.Put_Line('No data with emp_id= ' || v_Emp_Id);
End;
Das Typ eine Zeile (%Rowtype)
Die Syntax
-- Declare a variable.
-- Is row type

v_Variable_name Table_Name%Rowtype;

-- Example
v_Emp Employee%Rowtype;
Zum Beispiel
Declare
  v_Emp_Id Employee.Emp_Id%Type := 1;
  -- Declare a variable
  -- Is row type of Employee table.
  v_Emp Employee%Rowtype;
Begin
  Select * Into v_Emp From Employee Emp Where Emp.Emp_Id = v_Emp_Id;
  ----
  Dbms_Output.Put_Line(' First_Name= ' || v_Emp.First_Name);
  Dbms_Output.Put_Line(' Last_Name= ' || v_Emp.Last_Name);
Exception
  When No_Data_Found Then
     -- When SELECT .. INTO statement returns nothing.
     Dbms_Output.Put_Line('No data with emp_id= ' || v_Emp_Id);
End;
Das Ergebnis zur Beispiel-Durchführung
Das Typ Record
Sie können das Typ Record definieren, Das Typ kann einige Spalte enthalten. Die Syntax
-- Declare your data type.

TYPE Type_Record_Name IS
    RECORD  (
            Col1  Datatype1  [NOT NULL{:=|DEFAULT} expression],
            Col2  Datatype2  [NOT NULL{:=|DEFAULT} expression],
             ...
     );


-- Variable declaration using data type:
variable_name  Type_Record_Name;
Zum Beispiel
Declare
 v_Emp_Id Employee.Emp_Id%Type := 1;
 -- Define Record data type has 3 column.
 Type Emp_Name_Type Is Record(
     Emp_First_Name Employee.First_Name%Type
    ,Emp_Last_Name  Employee.Last_Name%Type
    ,Emp_Full_Name  Varchar2(50));
 ----
 -- Define a variable of type Emp_Name_Type
 v_Emp Emp_Name_Type;
Begin
 Select Emp.First_Name
       ,Emp.Last_Name
       ,Emp.First_Name || ' ' || Emp.Last_Name
 Into   v_Emp
 From   Employee Emp
 Where  Emp.Emp_Id = v_Emp_Id;
 ----
 Dbms_Output.Put_Line(' First_Name= ' || v_Emp.Emp_First_Name);
 Dbms_Output.Put_Line(' Last_Name= ' || v_Emp.Emp_Last_Name);
 Dbms_Output.Put_Line(' Full_Name= ' || v_Emp.Emp_Full_Name);
Exception
 When No_Data_Found Then
    -- When SELECT .. INTO statement return nothing.
    Dbms_Output.Put_Line('No data with emp_id= ' || v_Emp_Id);
End;
Das Ergebnis der Beispiel-Durchführung
Das Datentyp Table
Sie können ein neues Datentyp definieren. Es kann viele Elemente speichern. Das ist TABLE.
Die Eigenschaften vom Typ TABLE:
  • Das Daten TABLE ist wie ein Array, aber die Zahl der Element limitiert nicht.
  • Der Inden vom Typ TABLE ist unbedingt ununterbrochen nicht. Zum Beispiel TABLE hat 3 Elemente bei Index1, 3, 5.
Die Syntax
-- Syntax:

TYPE  <Table_Name>
IS TABLE OF  <Data_Type>   [NOT NULL]
INDEX BY BINARY_INTEGER;

-- Example
-- Define TABLE data type, contains elements of type VARCHAR2 (50)
TYPE My_Tbl
IS TABLE OF Varchar2(50)
INDEX BY BINARY_INTEGER;
Zum Beispiel
Declare
  -- Define TABLE data type:
  Type My_Tbl Is Table Of Varchar2(50) Index By Binary_Integer;
  -- Define varable of type My_Tbl.
  v_Emps My_Tbl;
Begin
  v_Emps(1) := 'One';
  v_Emps(2) := 'Two';
  v_Emps(3) := 'Three';
  ----
  Dbms_Output.Put_Line('Element Count = ' || v_Emps.Count);
  ---
  For i In v_Emps.First .. v_Emps.Last Loop
     Dbms_Output.Put_Line('Element at ' || i || ' = ' || v_Emps(i));
  End Loop;
End;
Das Ergebnis der Beispieldurchführung
Die Funktion des Typ TABLE:
Die Funktion/Attribut
Die Bedeutung
Das Beispiel
• DELETE
Die Zeile der Tabelle löschen
v_tbl.delete(3);
• EXISTS
TRUE rückgeben wenn die bestimmten Elemente in Tabelle existiert.
v_e:= v_tbl.exists(3);
• COUNT
Die Zahl der Elemente in der Tabelle rückgeben
v_count:=v_tbl.count;
• FIRST
Den Index der ersten Element in der Tabelle rückgeben
v_first_idx:=v_tbl.first;
• LAST
Den Index der letzten Element in der Tabelle rückgeben
v_last_idx:=v_tbl.last;
• NEXT
Den Index der nächsten Element in der Tabelle von dem bestimmten Index rückgeben
v_idx:= v_tbl.next(2);
• PRIOR
Den Index des vorigen Element rückgeben.
v_idx:=v_tbl.prior(2);
Zum Beispiel
Declare
  -- Define TABLE data type.
  Type t_City_Type Is Table Of Varchar2(30) Index By Binary_Integer;
  -- Declare a variable of type T_City_Type.
  t_City       t_City_Type;
  v_City_Index Binary_Integer;
  v_e          Boolean;
Begin
  t_City(100) := 'Chicago';
  t_City(101) := 'Chicago';
  t_City(200) := 'Hanoi';
  t_City(301) := 'Tokyo';
  Begin
     -- Check exists element at index 500.
     v_e := t_City.Exists(500);
     If v_e Then
        Dbms_Output.Put_Line('Exists element At 500');
     Else
        Dbms_Output.Put_Line('Not Exists element At 500');
     End If;
     --
     -- Delete element at index 101
     t_City.Delete(101);
     --
     -- First index
     v_City_Index := t_City.First;
     Dbms_Output.Put_Line('First= ' || v_City_Index);
     --
     Loop
        Dbms_Output.Put_Line('Element at ' || v_City_Index || ' = ' ||
                             t_City(v_City_Index));
        Exit When v_City_Index = t_City.Last;
        -- Returns the index of the next row in the table after the specified row.
        v_City_Index := t_City.Next(v_City_Index);
     End Loop;
     -- Raise No_Data_Found exception
     Raise No_Data_Found;
  Exception
     When No_Data_Found Then
        Dbms_Output.Put_Line('the Last City Has Been Reached.');
  End;
End;
Das Ergebnis der Beispieldurchführung
Der Array
Die Syntax
-- Define Array data type
TYPE <varray_type_name>
IS VARRAY(n)
OF <element_type>;

-- Example, declare an array, declare an array of 5 elements, and elements of type VARCHAR2(10);
TYPE cityarray
IS VARRAY(5)
OF Varchar2(10);
 
Ein Array hat N Elemente. Die Elemente des Array werden kontinuierlich vom 1 bis N gemarkiert.
Zum Beispiel
Declare
 -- Define Array data type.
 -- containing data type of VARCHAR2 (50)
 Type Emp_Array Is Varray(5) Of Varchar2(50);
 -- Define Array data type, containing data type of Integer
 Type Salary_Array Is Varray(5) Of Integer;
 ---
 v_Names    Emp_Array;
 v_Salaries Salary_Array;
 v_Count    Integer;
Begin
 -- Initialize the value of array elements.
 v_Names := Emp_Array('KING'
                     ,'JONES'
                     ,'FORD'
                     ,'SMITH'
                     ,'BLAKE');
 -- Initialize the value of array elements.
 v_Salaries := Salary_Array(5000
                           ,2975
                           ,3000
                           ,800
                           ,2850);
 -- Element count.                            
 v_Count := v_Names.Count;
 Dbms_Output.Put_Line('Count = ' || v_Count);
 ---
 For i In 1 .. v_Count Loop
    Dbms_Output.Put_Line('Employee = ' || v_Names(i) || ', Salary = ' ||
                         v_Salaries(i));
 End Loop;
End;
Das Ergebnis des Beispiel

7. Der Mauszeiger (Cursor)

Was ist der Mauszeiger?
Cursor ist das Typ von der strukturierte Variable, das Sie die mehren Zeilen Daten zu bearbeiten erlaubt. Die Anzahl der Zeile hängt von dem Befehl der Daten-Abfragen ab. Bei dem Bearbeiten können Sie mit Cursor durch die Datenzeile manipulieren. die Daten wird durch Cursor (Mauszeiger) spezifieren. Sie können durch die Bewegung des Cursor allen Daten einer Zeile aufnehmen
Die Syntax der Meldung des Mauszeiger
-- Cursor declaration has no parameters:
CURSOR <Cursor_Name>
IS
<Select_Statement>


-- Cursor declaration has parameters:
CURSOR <Cursor_Name>(<Parameter_List>)
IS
<Select_Statement>


 
Zum Beispiel
-- Cursor declaration has no parameters:
Cursor Emp_Cur Is
 Select Emp.Emp_Id
       ,Emp.First_Name
       ,Emp.Last_Name
 From   Employee Emp;

-- Cursor declaration has parameters:
Cursor Emp_Cur(p_Dept_Id   Number
        ,p_Branch_Id Number)
Is
Select Emp.Emp_Id
   ,Emp.First_Name
   ,Emp.Last_Name
   ,Emp.Assigned_Branch_Id
   ,Emp.Dept_Id
From   Employee Emp
Where  (Emp.Dept_Id = p_Dept_Id Or p_Dept_Id Is Null)
And    (Emp.Assigned_Branch_Id = p_Branch_Id Or p_Branch_Id Is Null);
Es gibt 2 Arten des Mauszeiger (Cursor):
  1. Der explizite Mauszeiger
  2. Der implizite Mauszeiger.
Der Begriff explizit hier bedeutet, dass Sie bei der Benutzung den Befehl zur Öffnung des Mauszeiger schreiben und den Befehl zur Schließung des Mauszeiger nach der Benutzuung klar schreiben. Mit dem impliziten Mauszeiger brauchen Sie den Befehl schreiben zu öffnen und schließen
Die Eigenschaften des Mauszeiger (Cursor)
Die Eigenschaften
Die Bedeutung
%isopen
True rückgeben wenn cursor öffnet
%notfound
True rückgeben wenn es keine nächsten Zeile gibt
%found
True rückgeben wenn es die nächsten Zeile gibt
%rowcount
Die Anzahl vom row , die durchgegangen wird, rückgeben
(Explicit Cursor)
Die Schritte der Meldung und Benutzung des expliziten Cursor
Zum Beispiel
Declare
    -- Declaring a Cursor with 2 parameters.
    Cursor Emp_Cur
    (
        p_Dept_Id   Number
      ,p_Branch_Id Number
    ) Is
        Select Emp.Emp_Id
                ,Emp.First_Name
                ,Emp.Last_Name
                ,Emp.Assigned_Branch_Id
                ,Emp.Dept_Id
        From   Employee Emp
        Where  (Emp.Dept_Id = p_Dept_Id Or p_Dept_Id Is Null)
        And    (Emp.Assigned_Branch_Id = p_Branch_Id Or p_Branch_Id Is Null);
    ---
    -- Declare a variable type of ROWTYPE, based on the newly created Cursor.
    v_Emp Emp_Cur%Rowtype;
    ---
    v_Dept_Id   Number := 1;
    v_Branch_Id Number;
    ---
    v_Row  Integer := 0;
    v_Open Boolean;
Begin
    -- Check cursor is openning?
    If Emp_Cur%Isopen Then
        Dbms_Output.Put_Line('Cursor opened');
    Else
        Dbms_Output.Put_Line('Cursor not open');
    End If;
    --
    Dbms_Output.Put_Line('Opening cursor...');
    -- Open Cursor (Pass input parameters).
    Open Emp_Cur(v_Dept_Id, v_Branch_Id);
    -- Using loop
    Loop
        -- Get row of data from Cursor
        -- Each time Fetch cursor moves one line
        -- (Downward).
        Fetch Emp_Cur
            Into v_Emp;
        -- Conditions to exit the loop
        Exit When Emp_Cur%Notfound;
        -- Process the data
        v_Row := v_Row + 1;
        Dbms_Output.Put_Line(v_Row || ' - First_Name: ' || v_Emp.First_Name || ' - Last_Name: ' || v_Emp.Last_Name);
    End Loop;
    --
    Dbms_Output.Put_Line('Closing cursor...');
    -- Close Cursor.
    Close Emp_Cur;
End;
Das Ergebnis der Beispiel-Durchführung
Implicit Cursor
Sie können für den impliziten Cursor den Befehl zur Öffnung oder Schließung klar schreiben
Benutzen Sie den BEfehl For um den Cursor nach der Syntax zu browsen:
-- Use the 'for loop' to fetch the Implicit cursor:

FOR <v_Record> in <cursor_name>(<Parameter_values>) LOOP

   -- Statements..

END LOOP;
Zum Beispiel
Declare
  -- Declaring a Cursor with 2 parameters.
  Cursor Emp_Cur(p_Dept_Id   Number
                ,p_Branch_Id Number) Is
     Select Emp.Emp_Id
           ,Emp.First_Name
           ,Emp.Last_Name
           ,Emp.Assigned_Branch_Id
           ,Emp.Dept_Id
     From   Employee Emp
     Where  (Emp.Dept_Id = p_Dept_Id Or p_Dept_Id Is Null)
     And    (Emp.Assigned_Branch_Id = p_Branch_Id Or p_Branch_Id Is Null);
  ---
  ---
  v_Dept_Id   Number := 1;
  v_Branch_Id Number;
  ---
  v_Row Integer := 0;
Begin
  -- Check cursor is open
  If Emp_Cur%Isopen Then
     Dbms_Output.Put_Line('Cursor opened');
  Else
     Dbms_Output.Put_Line('Cursor not open');
  End If;
  --
  -- Using loops to fetch cursor
  -- No need: open/close/fetch.
  --
  For v_Emp In Emp_Cur(v_Dept_Id
                      ,v_Branch_Id) Loop
     --
     v_Row := v_Row + 1;
     Dbms_Output.Put_Line(v_Row || ' - First_Name: ' || v_Emp.First_Name ||
                          ' - Last_Name: ' || v_Emp.Last_Name);
  End Loop;
End;

8. Der Verfahren (Procedure)

Eine Gruppe der Befehle, die eine Funktion durchgeführt hat, kann in einen Verfahren (procedure) sammeln um die Fähigkeiten der Behandlung, der allgemeinen Nutzung, des Geheimnis und der Datensicherheiten in der Entwicklung zu verbessern.
Der Verfahren kann in der Database wie ein Objekt von der DB gespeichert werden, sind sehr bereit um wieder zu benutzen. der Verfahren wird als Stored procedure genannt. Die Verfahren werden bei der Speicherung (save) in die Format von p-code kompiliert, deshalb kann es die Durchführungsfähigkeit zu verbessern
Der Verfahren gibt die direkte Wert wie eine Funktion nicht rück
Die Syntax zur Erstellung eines Verfahren
-- procedure_name:  Name of procedure
-- argument:  
-- mode:  IN or OUT or IN OUT, default is IN
-- datatype:  Data type

CREATE [OR REPLACE] PROCEDURE <procedure_name>
          [
           (argument1  [mode1]  datatype1,
            argument2  [mode2]  datatype2,
           ...)
          ]
     IS | AS
BEGIN
   -- PL/SQL Block;
END;
Zum Beispiel
-- For example a procedure with no parameters.
CREATE OR REPLACE Procedure Do_Something AS
   -- Declare variables here
Begin
  -- Do something here.
End;

-- For example a procedure with parameters
-- input parameters, and output parameters.
CREATE OR REPLACE Procedure Do_Something(p_Param1 Varchar2,
                                                                 v_Param Out Varchar2)
AS
   -- Declare variables here
Begin
  -- Do something here.
End;
Den Verfahren abwählen (drop procedure):
-- Drop procedure

DROP PROCEDURE <Procedure_Name>
Die Schritte zur Durchführung eines Verfahren
Zum Beispiel: die Erstellung eines Verfahren
Das ist ein Beispiel über die Erstellung eines ersten Verfahren auf PL/SQL Developer. Das Beispiel ist ein Muster , damit sie den Fehler prüfen wenn das Problem passiert
  • Einen Verfahren erstellen (Procedure)
  • Den Verfahren kompilieren
  • Den Verfahren laufen
  • Debug des Verfahren durch PL/SQL Developer um zu sehen wie das Programm funktioniert
Den Verfahren erstellen (Procedure):
Den Namen des Verfahren typen und der Parameter wird wie folgend geschrieben:
  • Get_Employee_Infos
Der Verfahren wird durch PL/SQL Developer erstellt. Allerdings sollen Sie die Liste des Parameter ändern und die Code für den Verfahren schreiben
Ihr Verfahren wie folgend ändern
-- Input parameter: p_Emp_Id
-- Output parameters: v_First_Name, v_Last_Name, v_Dept_Id.
Create Or Replace Procedure Get_Employee_Infos(p_Emp_Id     Number
                                             ,v_First_Name Out Varchar2
                                             ,v_Last_Name  Out Varchar2
                                             ,v_Dept_Id    Out Number) Is
Begin
  -- Print out console.
  -- Log - use for programmers
  Dbms_Output.Put_Line('Parameter p_Emp_Id = ' || p_Emp_Id);
  --
  -- If SELECT .. INTO statement return nothing
  -- it will throw an Exception - NO_DATA_FOUND:
  --
  --
  Select Emp.First_Name
        ,Emp.Last_Name
        ,Emp.Dept_Id
  Into   v_First_Name
        ,v_Last_Name
        ,v_Dept_Id
  From   Employee Emp
  Where  Emp.Emp_Id = p_Emp_Id;
  --
  -- Print out Console.
  --
  Dbms_Output.Put_Line('Found Record!');
  Dbms_Output.Put_Line(' v_First_Name= ' || v_First_Name);
  Dbms_Output.Put_Line(' v_Last_Name= ' || v_Last_Name);
  Dbms_Output.Put_Line(' v_Dept_Id= ' || v_Dept_Id);
Exception
  When No_Data_Found Then
     -- Print out Console.
     Dbms_Output.Put_Line('No Record found with p_Emp_Id = ' || p_Emp_Id);
End Get_Employee_Infos;
Klicken Sie auf dem Symbol Execute oder F8 um den Verfahren zu kompilieren. Falls die Code den Fehler hat, medet PL/SQL Developer Sie.
Test procedures in PL/SQL Developer
Doppelklicken Sie auf dem Verfahren Get_Employee_Infos , wählen Sie Test:
Den ersten Parameter typen, zum Beispiel
  • p_Emp_Id = 1
Das Ergebnis der Durchführung des Verfahren
Auf Console schauen:
Den anderen Fall mit der Werte prüfen
  • p_Emp_Id = 9999
Auf dem Console:
Debug procedures in PL/SQL Developer
Debug auf PL/SQL Developer erlaubt Sie zu wissen, wie ein Verfahren und eine Funktion nach den Befehl gelaufen werden, damit Sie die Fehlersposition leicht finden. SIe können die Anleitung bei... sehen
  • TODO

9. Die Funktion

Wie den Verfahren ist die Funktion (function) eine Gruppe des Befehl PL/SQL zur Durchführung einer Funktion. Änders als den Verfahren gibt die Funktion eine Werte bei ihrer Aufruf rück.
Die Funktion kann auf die Database in der Format vom Stored procedure gespeichert.
Die Syntax zur Erstellung der funktion
-- function_name:  Name of function
-- argument:  
-- mode: IN or OUT or IN OUT, default is IN
-- datatype:  Data type

CREATE [OR REPLACE] FUNCTION <function_name>
                [
                 (argument1  [mode1]  datatype1,
                  argument2  [mode2]  datatype2,
                  ...)
               ]
              RETURN  datatype
     IS | AS
BEGIN
   -- PL/SQL Block;
END;
Zum Beispiel
-- Function has 1 parameter:
CREATE OR REPLACE FUNCTION Sum(a Integer, b Integer)
RETURN Integer
AS
Begin
  return a + b;
End;

-- A function with no parameters:
CREATE OR REPLACE FUNCTION Get_Current_Datetime
RETURN Date
AS
Begin
  return sysdate;
End;
Die Funktion abwählen (Drop function):
-- Drop Function

DROP FUNCTION <function_name>;
Die Funktion aufrufen
-- When calling the function, must declare a variable

-- Declare variable c.
c Integer;
....

-- Call function
c := Sum(10, 100);
Zum Beispiel, eine Funktion erstellen
-- Function with input p_Emp_ID
-- And return First_Name of Employee.

Create Or Replace Function Get_Emp_First_Name(p_Emp_Id Number)
  Return Varchar2 As
  -- Declare variable v_Emp_First_Name
  v_Emp_First_Name Employee.First_Name%Type;
Begin
  Begin
     Select Emp.First_Name
     Into   v_Emp_First_Name
     From   Employee Emp
     Where  Emp.Emp_Id = p_Emp_Id;
  Exception
     When No_Data_Found Then
        -- Assigning null in case not found Employee
        v_Emp_First_Name := Null;
  End;
  --
  Return v_Emp_First_Name;
End;
Die Funktion, die keinen Parameter OUT hat,kann an den Befehl SQL teilnehmen. Zum Beispiel:
Select Emp.Emp_Id
     ,Get_Emp_First_Name(Emp.Emp_Id) Emp_First_Name
From   Employee Emp;
Das Ergebnis der Durchführung des SQL Befehl

10. Package

No ADS
Package ist eine Kollektion der Daten-Typen, der Variable zur Wertspeicherung und der Verfahren/FUnktion mit einer gebunden Beziehung. Die meist herausragende Eigenschaft vom package ist , wenn ein Element in der package geruft wird, wird die ganze Inhalt von package im System eingegeben. Deshalb kostet die Eingabe der anderen aufgeruften Element vom package in dem System nicht Zeit. Dann erhöht die Geschwindigkeit der Befehldurchführung der Funktion und des Verfahren in package.
Die Struktur vom Package:
Eine package hat 2 Teilen. Die Bezeichnung (specification) definiert die Kommunikation von package mit dem Außen. Der Körper (body) ist die Installation für die Kommunikation in die Bezeichnung
Die Struktur vom package hat 5 Elemente
  • Public variable (die öffentliche Variable): ist eine Variable, auf die die Applikation sich beziehen kann.
  • Public procedure (der öffentliche Verfahren): besteht aus den Verfahren und Funktion vom package , die aus der externen Applikation aufgeruft werden.
  • Private procedure (der private Verfahren): sind die Funktion, die Verfahren im package und nur durch die anderen Funktionen oder Verfahren in package aufgeruft werden.
  • Global variable (die globale Variable): sind die in package gemeldete Variable. Die Applikation von außen wird sich auf diese Variable bezogen .
  • Private variable (die private Variable): ist eine Variable, die in einer Funktion, einen Verfahren vom package gemeldet wird. Sie kann nur in der internen Funktion oder Verfahren benutzt werden
Package melden
-- Spec Package declaration:

CREATE [OR REPLACE] PACKAGE <package_name>
IS| AS
       -- public type and item declarations subprogram specifications
END <package_name>;

-- Body Package declaration:
CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS | AS


      -- private type and item declarations 
      -- subprogram bodies

END <package_name>;
Die Package auf PL/SQL Developer erstellen
PL/SQL Developer hilft Ihnen bei der schnellen Erstellung von package spec & package body.
Package wird durch PL/SQL Developer erstellt, und die Hinweise zum package schreiben werden automatisch erstellt. Sie können sie löschen
Sie können die automatisch durch PL/SQL Developer erstellte Code um eine leere package zu schaffen
  • PKG_EMP (Package Spec)
--
-- This is Package Spec of Package PKG_EMP
-- It declared two functions (While Package Body has 2 functions and 1 procedure).
-- The function or procedure is not declared on the Spec Package, meant only for use within the package.
--
Create Or Replace Package Pkg_Emp Is

 -- Function returns First_Name
 Function Get_First_Name(p_Emp_Id Employee.Emp_Id%Type)
    Return Employee.First_Name%Type;

 -- Function returns department name of employee
 Function Get_Dept_Name(p_Emp_Id Employee.Emp_Id%Type)
    Return Department.Name%Type;

End Pkg_Emp;
  • PKG_EMP (Package Body)
--
-- This is Package Body of Package PKG_EMP
--
Create Or Replace Package Body Pkg_Emp Is

 -- =====================================================
 -- The procedure returns the employee information
 -- Includes 2 output parameters v_First_Name, v_Last_Name
 -- =====================================================
 Procedure Get_Emp_Infos(p_Emp_Id     Employee.Emp_Id%Type
                        ,v_First_Name Out Employee.Emp_Id%Type
                        ,v_Last_Name  Out Employee.Last_Name%Type) As
 Begin
    Begin
       Select Emp.First_Name
             ,Emp.Last_Name
       Into   v_First_Name
             ,v_Last_Name
       From   Employee Emp
       Where  Emp.Emp_Id = p_Emp_Id;
    Exception
       -- Not found employee with p_Emp_Id
       When No_Data_Found Then
          v_First_Name := Null;
          v_Last_Name  := Null;
    End;
 End;

 -- =====================================================
 -- Function returns First_Name for Emp_ID
 -- =====================================================
 Function Get_First_Name(p_Emp_Id Employee.Emp_Id%Type)
    Return Employee.First_Name%Type As
    -- Declare a variable.
    v_First_Name Employee.First_Name%Type;
    v_Last_Name  Employee.Last_Name%Type;
 Begin
    -- Call procedure Get_Emp_Infos
    Get_Emp_Infos(p_Emp_Id
                 ,v_First_Name -- Out
                 ,v_Last_Name -- Out
                  );
    --
    Return v_First_Name;
 End;

 -- =====================================================
 -- Function returns Dept_Name for Emp_ID.
 -- (Department name of Employee)
 -- =====================================================
 Function Get_Dept_Name(p_Emp_Id Employee.Emp_Id%Type)
    Return Department.Name%Type As
    -- Declare a variable.
    v_Dept_Name Department.Name%Type;
 Begin
    Begin
       Select Dept.Name
       Into   v_Dept_Name
       From   Employee   Emp
             ,Department Dept
       Where  Emp.Dept_Id = Dept.Dept_Id
       And    Emp.Emp_Id = p_Emp_Id;
    Exception
       When No_Data_Found Then
          v_Dept_Name := Null;
    End;
    --
    Return v_Dept_Name;
 End;

End Pkg_Emp;
Test Package
Wie die Funktion und den Verfahren können Sie die Funktion/Verfahren auf Package prüfen,das Ihnen bei der Programmierung bei der Entdeckung des Fehler hilft
Test results:

11. Was ist Oracle Application Express ?

Oracle Application Express (Oracle APEX), vorher als HTML DB genannt, ist ein Tool zur schnellen Entwicklung der Website für die Database Oracle. Mit einem Webbrowser und die nicht-zu-viel Programmierserfahrungen können Sie die Applikation professionell entwickeln und implementieren. Sie sind sehr schnell und geheim. Oracle Application Express verbindet die Eigenschaften einer privaten Database produktiv, einfach zu nutzen, flexibel mit der Eigenschaften einer Unternehmendatabase geheim, integer, ausbaufähig, verfügbar für die Website. Application Express ist ein Tool um die Applikation auf die Website und die Entwiclklungsumgebung aufzubauen
Oracle APEX fordert, dass Sie nur Oracle PL/SQL beherrschen können. Sie können bei ... lernen, was Oracle Application Express ist
No ADS