Ricerca…
Sintassi
CREATE [O REPLACE] PACKAGE nome_pacchetto
[AUTHID {CURRENT_USER | DEFINER}]
{IS | COME}
[PRAGMA SERIALLY_REUSABLE;]
[collection_type_definition ...]
[record_type_definition ...]
[subtype_definition ...]
[collection_declaration ...]
[costante_declaration ...]
[exception_declaration ...]
[object_declaration ...]
[record_declaration ...]
[variable_declaration ...]
[cursor_spec ...]
[function_spec ...]
[procedura_spec ...]
[call_spec ...]
[PRAGMA RESTRICT_REFERENCES (asserzioni) ...]
END [nome_pacchetto];
CREA O REPLACE IL PACCHETTO Nome pacchetto IS
FUNCTION FunctionName (parametro1 IN VARCHAR2, parametro2 IN NUMERO) INVIO VARCHAR2;
END PackageName;
CREATE [O REPLACE] PACKAGE BODY nome_pacchetto
{IS | COME}
[PRAGMA SERIALLY_REUSABLE;]
[collection_type_definition ...]
[record_type_definition ...]
[subtype_definition ...]
[collection_declaration ...]
[costante_declaration ...]
[exception_declaration ...]
[object_declaration ...]
[record_declaration ...]
[variable_declaration ...]
[cursor_body ...]
[function_spec ...]
[procedura_spec ...]
[call_spec ...]
END [nome_pacchetto];
CREARE O SOSTITUIRE IL PACCHETTO DEL PACCHETTO ISTEMA
FUNCTION FunctionName (parametro1 IN VARCHAR2, parametro2 IN NUMBER) INVIO VARCHAR2 È
dichiarazioni
INIZIO
dichiarazioni da eseguire
RETURN variabile varchar2
END FunctionName;
END PackageName;
Uso del pacchetto
I pacchetti in PLSQL sono una raccolta di procedure, funzioni, variabili, eccezioni, costanti e strutture dati. Generalmente le risorse in un pacchetto sono correlate tra loro e svolgono compiti simili.
Perché usare i pacchetti
- modularità
- Migliori prestazioni / Funtionality
Parti di un pacchetto
Specifica: talvolta chiamata intestazione del pacchetto. Contiene dichiarazioni di variabili e tipo e le firme delle funzioni e procedure che sono nel pacchetto, che sono pubbliche di essere chiamato dal di fuori del pacchetto.
Corpo del pacchetto: contiene il codice e le dichiarazioni private .
La specifica del pacchetto deve essere compilata prima del corpo del pacchetto, altrimenti la compilazione del corpo del pacchetto segnalerà un errore.
Sovraccarico
Le funzioni e le procedure nei pacchetti possono essere sovraccaricate. Il seguente pacchetto TEST ha due procedure denominate print_number , che si comportano in modo diverso a seconda dei parametri con cui vengono chiamati.
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;
/
Chiamiamo entrambe le procedure. Il primo con parametro intero, il secondo con varchar2.
set serveroutput on;
-- call the first procedure
exec test.print_number(3);
-- call the second procedure
exec test.print_number('three');
L'output dello script precedente è:
SQL>
Digit: 3
PL/SQL procedure successfully completed
String: three
PL/SQL procedure successfully completed
Restrizioni al sovraccarico
Solo i sottoprogrammi locali o pacchettizzati o i metodi di tipo possono essere sovraccaricati. Pertanto, non è possibile sovraccaricare sottoprogrammi autonomi. Inoltre, non è possibile sovraccaricare due sottoprogrammi se i loro parametri formali differiscono solo in modalità nome o parametro
Definisci un'intestazione e un corpo del pacchetto con una funzione.
In questo esempio definiamo un'intestazione del pacchetto e un corpo del pacchetto con una funzione.
Dopodiché chiameremo una funzione dal pacchetto che restituisce un valore di ritorno.
Intestazione del pacchetto :
CREATE OR REPLACE PACKAGE SkyPkg AS
FUNCTION GetSkyColour(vPlanet IN VARCHAR2)
RETURN VARCHAR2;
END;
/
Corpo del pacchetto :
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;
/
Chiamando la funzione dal corpo del pacchetto :
DECLARE
vColour VARCHAR2(100);
BEGIN
vColour := SkyPkg.GetSkyColour(vPlanet => 'Earth');
DBMS_OUTPUT.PUT_LINE(vColour);
END;
/