Zoeken…
Syntaxis
CREATE [OF REPLACE] PACKAGE pakketnaam
[AUTHID {CURRENT_USER | DEFINER}]
{IS | NET ZO}
[PRAGMA SERIALLY_REUSABLE;]
[collection_type_definition ...]
[record_type_definition ...]
[subtype_definition ...]
[collection_declaration ...]
[constante_declaration ...]
[exception_declaration ...]
[object_declaration ...]
[record_declaration ...]
[variable_declaration ...]
[cursor_spec ...]
[function_spec ...]
[procedure_spec ...]
[call_spec ...]
[PRAGMA RESTRICT_REFERENCES (beweringen) ...]
END [pakketnaam];
PAKKET MAKEN OF VERVANGEN Pakketnaam IS
FUNCTIE Functienaam (parameter1 IN VARCHAR2, paramter2 IN NUMMER) RETURN VARCHAR2;
END Pakketnaam;
CREATE [OF VERVANG] PACKAGE BODY pakketnaam
{IS | NET ZO}
[PRAGMA SERIALLY_REUSABLE;]
[collection_type_definition ...]
[record_type_definition ...]
[subtype_definition ...]
[collection_declaration ...]
[constante_declaration ...]
[exception_declaration ...]
[object_declaration ...]
[record_declaration ...]
[variable_declaration ...]
[cursor_body ...]
[function_spec ...]
[procedure_spec ...]
[call_spec ...]
END [pakketnaam];
PAKKET LICHAAM MAKEN OF VERVANGEN Pakketnaam IS
FUNCTIE Functienaam (parameter1 IN VARCHAR2, paramter2 IN NUMMER) RETOUR VARCHAR2 IS
declaraties
BEGINNEN
uit te voeren verklaringen
RETOUR varchar2-variabele
END Functienaam;
END Pakketnaam;
Pakket gebruik
Pakketten in PLSQL zijn een verzameling procedures, functies, variabelen, uitzonderingen, constanten en gegevensstructuren. Over het algemeen zijn de bronnen in een pakket aan elkaar gerelateerd en vervullen ze vergelijkbare taken.
Waarom pakketten gebruiken
- modulariteit
- Betere prestaties / funtionaliteit
Delen van een pakket
Specificatie - Soms een pakketkop genoemd. Bevat variabele en typeverklaringen en de handtekeningen van de functies en procedures in het pakket die openbaar van buiten het pakket kunnen worden opgeroepen.
Pakketlichaam - Bevat de code en privéverklaringen .
De pakketspecificatie moet vóór de pakketbody worden gecompileerd, anders zal de pakketcompilatie een fout melden.
overbelasting
Functies en procedures in pakketten kunnen worden overbelast. Het volgende pakket TEST heeft twee procedures genaamd print_number , die zich anders gedragen, afhankelijk van de parameters waarmee ze worden aangeroepen.
create or replace package TEST is
procedure print_number(p_number in integer);
procedure print_number(p_number in varchar2);
end TEST;
/
create or replace package body TEST is
procedure print_number(p_number in integer) is
begin
dbms_output.put_line('Digit: ' || p_number);
end;
procedure print_number(p_number in varchar2) is
begin
dbms_output.put_line('String: ' || p_number);
end;
end TEST;
/
We noemen beide procedures. De eerste met de parameter integer, de tweede met varchar2.
set serveroutput on;
-- call the first procedure
exec test.print_number(3);
-- call the second procedure
exec test.print_number('three');
De output van het bovenstaande script is:
SQL>
Digit: 3
PL/SQL procedure successfully completed
String: three
PL/SQL procedure successfully completed
Beperkingen op overbelasting
Alleen lokale of verpakte subprogramma's of typemethoden kunnen worden overbelast. Daarom kunt u zelfstandige subprogramma's niet overbelasten. Ook kunt u twee subprogramma's niet overbelasten als hun formele parameters alleen verschillen in naam of parametermodus
Definieer een pakketkop en hoofdtekst met een functie.
In dit voorbeeld definiëren we een pakketkop en een pakket met een functie.
Daarna roepen we een functie uit het pakket aan die een retourwaarde retourneert.
Pakketkop :
CREATE OR REPLACE PACKAGE SkyPkg AS
FUNCTION GetSkyColour(vPlanet IN VARCHAR2)
RETURN VARCHAR2;
END;
/
Pakket lichaam :
CREATE OR REPLACE PACKAGE BODY SkyPkg AS
FUNCTION GetSkyColour(vPlanet IN VARCHAR2)
RETURN VARCHAR2
AS
vColour VARCHAR2(100) := NULL;
BEGIN
IF vPlanet = 'Earth' THEN
vColour := 'Blue';
ELSIF vPlanet = 'Mars' THEN
vColour := 'Red';
END IF;
RETURN vColour;
END;
END;
/
De functie oproepen vanuit de body van het pakket :
DECLARE
vColour VARCHAR2(100);
BEGIN
vColour := SkyPkg.GetSkyColour(vPlanet => 'Earth');
DBMS_OUTPUT.PUT_LINE(vColour);
END;
/