Oracle PL/SQL-paket: Typ, Specifikation, Kropp [Exempel]

โšก Smart sammanfattning

PL/SQL-paket grupperar relaterade procedurer, funktioner, variabler, markรถrer och undantag i ett schemaobjekt med en specifikation och en brรถdtext. Specifikationen deklarerar det publika grรคnssnittet, medan brรถdtexten innehรฅller den privata implementeringen, vilket fรถrbรคttrar modularitet och prestanda.

  • ๐Ÿ“ฆ Paketdefinition: Ett paket รคr en logisk gruppping av relaterade delprogram och objekt, kompilerade och lagrade som ett enda databasobjekt.
  • ๐Ÿ“‹ Paketspecifikation: Deklarerar de publika variablerna, markรถrerna, typerna, undantagen, procedurerna och funktionerna som รคr tillgรคngliga utanfรถr paketet.
  • ๐Ÿงฑ Paketets innehรฅll: Definierar varje element som deklareras i specifikationen, plus privata element som endast kan anropas inifrรฅn paketet.
  • ๐Ÿ” ร–verbelastning: Flera underprogram kan dela samma namn nรคr deras parameternummer, parametertyper eller returtyp skiljer sig รฅt.
  • ๐Ÿ”— Refererande och beroende: Publika element anropas package_name.element_name, och brรถdtexten fรถrblir beroende av specifikationen.
  • ๐Ÿค– AI-hjรคlp: AI-assistenter som GitHub Copilot utkastar paketspecifikationer, brรถdtexter och รถverbelastade underprogram frรฅn en kommentar.

Oracle ร–versikt รถver PL/SQL-paketspecifikation och kroppsstruktur

Vad รคr paketet i Oracle?

Oracle PL / SQL paketet รคr en logisk gruppping av relaterade underprogram (procedur/funktion) till ett enda element. Ett paket kompileras och lagras som ett databasobjekt som kan รฅteranvรคndas senare.

Komponenter i paket

Ett PL/SQL-paket har tvรฅ komponenter.

  • Paketspecifikation
  • Paketkropp

Paketspecifikation

Paketspecifikationen bestรฅr av en deklaration frรฅn alla offentliga variabler, markรถrer, objekt, procedurer, funktioner och undantag.

Nedan fรถljer nรฅgra egenskaper hos paketspecifikationen.

  • Elementen som deklareras i specifikationen kan nรฅs utanfรถr paketet. Sรฅdana element kallas publika element.
  • Paketspecifikationen รคr ett fristรฅende element, vilket innebรคr att den kan existera ensam utan en paketkropp.
  • Nรคrhelst ett paket hรคnvisas till skapas en instans av paketet fรถr den specifika sessionen.
  • Efter att instansen har skapats fรถr en session รคr alla paketelement som initieras i den instansen giltiga till slutet av sessionen.

syntax

CREATE [OR REPLACE] PACKAGE <package_name> 
IS
<sub_program and public element declaration>
.
.
END <package name>

Ovanstรฅende syntax visar skapandet av paketspecifikationen.

Paketkropp

Paketets innehรฅll bestรฅr av definitionen av alla element som finns i paketspecifikationen. Det kan ocksรฅ innehรฅlla definitioner av element som inte deklareras i specifikationen; dessa element kallas privata element och kan endast anropas inifrรฅn paketet.

Nedan fรถljer egenskaperna hos en paketkropp.

  • Den bรถr innehรฅlla definitioner fรถr alla underprogram/markรถrer som har deklarerats i specifikationen.
  • Den kan ocksรฅ ha fler underprogram eller andra element som inte deklareras i specifikationen. Dessa kallas privata element.
  • Det รคr ett beroende objekt, och det beror pรฅ paketspecifikationen.
  • Paketets innehรฅllsdel fรฅr statusen "Ogiltig" varje gรฅng specifikationen kompileras. Dรคrfรถr mรฅste den kompileras om varje gรฅng efter att specifikationen har kompilerats.
  • De privata elementen bรถr definieras fรถrst innan de anvรคnds i paketets kropp.
  • Den fรถrsta delen av paketets innehรฅll รคr den globala deklarationsdelen. Denna inkluderar variabler, markรถrer och privata element (framรฅtdeklaration) som รคr synliga fรถr hela paketet.
  • Den sista delen av paketet รคr paketinitieringsdelen som kรถrs en gรฅng varje gรฅng ett paket refereras till fรถr fรถrsta gรฅngen i sessionen.

Syntax:

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<global_declaration part>
<Private element definition>
<sub_program and public element definition>
.
<Package Initialization> 
END <package_name>

Ovanstรฅende syntax visar skapandet av paketets brรถdtext.

Nu ska vi se hur man refererar till paketelement i programmet.

Refererande paketelement

Nรคr elementen har deklarerats och definierats i paketet mรฅste vi referera till elementen fรถr att anvรคnda dem.

Alla publika element i paketet kan anropas genom att anropa paketnamnet fรถljt av elementnamnet separerat med en punkt, t.ex. . '.

Paketets publika variabler kan ocksรฅ anvรคndas pรฅ samma sรคtt fรถr att tilldela och hรคmta vรคrden frรฅn dem, dvs. . '.

Skapa paket i PL/SQL

I PL/SQL, varje gรฅng ett paket hรคnvisas till eller anropas i en session, skapas en ny instans fรถr det paketet.

Oracle tillhandahรฅller en mรถjlighet att initiera paketelement eller att utfรถra nรฅgon aktivitet vid tidpunkten fรถr den hรคr instansen skapas genom "Paketinitiering".

Detta รคr inget annat รคn ett exekveringsblock som skrivs i paketets innehรฅll efter att alla paketelement har definierats. Detta block kommer att exekveras varje gรฅng ett paket refereras till fรถr fรถrsta gรฅngen i sessionen.

Skรคrmdumpen nedan visar hur paketinitieringsblocket placeras inuti paketets brรถdtext nรคr ett paket skapas.

Skapa ett PL/SQL-paket med ett paketinitieringsblock i paketets brรถdtext

syntax

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<Private element definition>
<sub_program and public element definition>
.
BEGIN
<Package Initialization> 
END <package_name>

Ovanstรฅende syntax visar definitionen av paketinitiering i paketets kropp.

Vidarebefordra deklarationer

En framรฅtdeklaration eller referens i paketet รคr inget annat รคn att deklarera de privata elementen separat och definiera dem i den senare delen av paketets brรถdtext.

Privata element kan endast refereras till om de redan รคr deklarerade i paketets innehรฅll. Av denna anledning anvรคnds framรฅtdeklaration. Men det รคr ganska ovanligt att anvรคnda det, eftersom privata element oftast deklareras och definieras i den fรถrsta delen av paketets innehรฅll.

Forward deklaration รคr ett alternativ som tillhandahรฅlls av OracleDet รคr inte obligatoriskt, och att anvรคnda det eller inte รคr upp till programmerarens krav.

Skรคrmdumpen nedan visar hur ett privat element framรฅtdeklareras och senare definieras i paketets brรถdtext.

Vidarebefordran av ett privat element i en Oracle PL/SQL-paketets brรถdtext

Syntax:

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<Private element declaration>
.
.
.
<Public element definition that refer the above private element>
.
.
<Private element definition> 
.
BEGIN
<package_initialization code>; 
END <package_name>

Ovanstรฅende syntax visar framรฅtriktad deklaration. De privata elementen deklareras separat i den frรคmre delen av paketet, och de har definierats i den senare delen.

Anvรคndning av markรถrer i paketet

Till skillnad frรฅn andra element mรฅste man vara fรถrsiktig nรคr man anvรคnder markรถrer inuti paketet.

Om markรถren รคr definierad i paketspecifikationen eller i den globala delen av paketets innehรฅll, kommer markรถren, nรคr den รถppnats, att finnas kvar till slutet av sessionen.

Sรฅ man bรถr alltid anvรคnda markรถrattributet '%ISOPEN' fรถr att verifiera markรถrens tillstรฅnd innan man refererar till den.

ร–verbelastning

ร–verbelastning รคr konceptet att ha mรฅnga delprogram med samma namn. Dessa delprogram skiljer sig frรฅn varandra genom antalet parametrar, typerna av parametrar eller returtypen. Med andra ord betraktas delprogram med samma namn men med ett annat antal parametrar, olika typer av parametrar eller en annan returtyp som รถverbelastning.

Detta รคr anvรคndbart nรคr mรฅnga delprogram behรถver utfรถra samma uppgift, men sรคttet att anropa vart och ett av dem bรถr vara olika. I det hรคr fallet hรฅlls delprogramnamnet detsamma fรถr alla, och parametrarna รคndras enligt anropskommandot.

Exempel 1: I det hรคr exemplet ska vi skapa ett paket fรถr att hรคmta och stรคlla in vรคrdena fรถr en anstรคllds information i tabellen 'emp'. Funktionen get_record returnerar posttypen fรถr det givna anstรคllningsnumret, och proceduren set_record infogar posttypen i tabellen 'emp'.

Steg 1) Skapande av paketspecifikation

Skรคrmdumpen nedan visar att paketspecifikationen fรถr guru99_get_set skapas i Oracle.

Skapa paketspecifikationen guru99_get_set med set_record och get_record i Oracle

CREATE OR REPLACE PACKAGE guru99_get_set
IS
PROCEDURE set_record (p_emp_rec IN emp%ROWTYPE);
FUNCTION get_record (p_emp_no IN NUMBER) RETURN emp%ROWTYPE;
END guru99_get_set;
/

Produktion:

Package created

Code Fรถrklaring

  • Code rad 1-5: Skapar paketspecifikationen fรถr guru99_get_set med en procedur och en funktion. Dessa tvรฅ รคr nu publika element i detta paket.

Steg 2) Paketet innehรฅller en paketkropp, dรคr sjรคlva definitionerna av alla procedurer och funktioner definieras. I detta steg skapas paketkroppen.

Skรคrmdumpen nedan visar definitionen av paketets guru99_get_set-kropp i Oracle.

Definiera paketets guru99_get_set-kropp med set_record, get_record och initialiseringsblocket

CREATE OR REPLACE PACKAGE BODY guru99_get_set
IS
PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO emp
VALUES(p_emp_rec.emp_name,p_emp_rec.emp_no, p_emp_rec.salary,p_emp_rec.manager);
COMMIT;
END set_record;
FUNCTION get_record(p_emp_no IN NUMBER)
RETURN emp%ROWTYPE
IS
l_emp_rec emp%ROWTYPE;
BEGIN
SELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_no;
RETURN l_emp_rec;
END get_record;
BEGIN
dbms_output.put_line('Control is now executing the package initialization part');
END guru99_get_set;
/

Produktion:

Package body created

Code Fรถrklaring

  • Code rad 7: Skapar paketets brรถdtext.
  • Code rad 9-16: Definiera elementet 'set_record' som deklareras i specifikationen. Detta รคr samma sak som att definiera en fristรฅende procedur i PL/SQL.
  • Code rad 17-24: Definiera elementet 'get_record'. Det รคr samma sak som att definiera en fristรฅende funktion.
  • Code rad 25-26: Definiera paketinitieringsdelen.

Steg 3) Skapar ett anonymt block fรถr att infoga och visa posterna genom att referera till det ovan skapade paketet.

Skรคrmdumpen nedan visar det anonyma blocket som anropar paketet, tillsammans med dess utdata i Oracle.

Anonymt blockanrop guru99_get_set fรถr att infoga och visa en anstรคllningspost med utdata

DECLARE
l_emp_rec emp%ROWTYPE;
l_get_rec emp%ROWTYPE;
BEGIN
dbms_output.put_line('Insert new record for employee 1004');
l_emp_rec.emp_no:=1004;
l_emp_rec.emp_name:='CCC';
l_emp_rec.salary:=20000;
l_emp_rec.manager:='BBB';
guru99_get_set.set_record(l_emp_rec);
dbms_output.put_line('Record inserted');
dbms_output.put_line('Calling get function to display the inserted record');
l_get_rec:=guru99_get_set.get_record(1004);
dbms_output.put_line('Employee name: '||l_get_rec.emp_name);
dbms_output.put_line('Employee number:'||l_get_rec.emp_no);
dbms_output.put_line('Employee salary:'||l_get_rec.salary);
dbms_output.put_line('Employee manager:'||l_get_rec.manager);
END;
/

Produktion:

Insert new record for employee 1004
Control is now executing the package initialization part
Record inserted
Calling get function to display the inserted record
Employee name: CCC
Employee number: 1004
Employee salary: 20000
Employee manager: BBB

Code Fรถrklaring:

  • Code rad 34-37: Fyller i data fรถr variabeln posttyp i ett anonymt block fรถr att anropa elementet 'set_record' i paketet.
  • Code rad 38: Ett anrop har gjorts till 'set_record' fรถr paketet guru99_get_set. Nu รคr paketet instansierat och det kommer att finnas kvar till slutet av sessionen. Paketinitialiseringsdelen kรถrs eftersom detta รคr det fรถrsta anropet till paketet, och posten infogas av elementet 'set_record' i tabellen.
  • Code rad 41: Anropar elementet 'get_record' fรถr att visa information om den infogade medarbetaren. Paketet refereras till fรถr andra gรฅngen under detta anrop, men initialiseringsdelen kรถrs inte igen, eftersom paketet redan har initialiserats i denna session.
  • Code rad 42-45: Skriver ut personaluppgifter.

Beroende i paket

Eftersom paketet รคr en logisk gruppping av relaterade saker har den vissa beroenden. Fรถljande รคr de beroenden som ska tas om hand.

  • En specifikation รคr ett fristรฅende objekt.
  • En paketkropp รคr beroende av specifikationen.
  • Paketets innehรฅll kan kompileras separat. Nรคrhelst specifikationen kompileras mรฅste innehรฅllet kompileras om, eftersom det blir ogiltigt.
  • Delprogrammet i paketets brรถdtext som รคr beroende av ett privat element bรถr definieras fรถrst efter deklarationen av det privata elementet.
  • De databasobjekt som det hรคnvisas till i specifikationen och brรถdtexten mรฅste ha giltig status vid tidpunkten fรถr paketkompileringen.

Paketinformation

Nรคr paketet har skapats finns paketinformationen, sรฅsom paketkรคlla, underprogramsinformation och รถverbelastningsinformation, tillgรคnglig i Oracle dataordbokstabeller.

Tabellen nedan visar dataordlistan och den paketinformation som finns tillgรคnglig i varje tabell.

Tabellnamn BESKRIVNING Frรฅga
ALLA_OBJEKT Ger detaljer om paketet som object_id, creation_date, last_ddl_time, etc. Den innehรฅller objekt som skapats av alla anvรคndare. SELECT * FROM all_objects dรคr objektnamn =' '
ANVร„NDAROBJEKT Ger detaljer om paketet som object_id, creation_date, last_ddl_time, etc. Den innehรฅller de objekt som skapats av den aktuella anvรคndaren. SELECT * FROM user_objects dรคr objektnamn =' '
ALL_SOURCE Anger kรคllan till objekten som skapats av alla anvรคndare. SELECT * FROM all_source dรคr namn=' '
USER_SOURCE Anger kรคllan till objekten som skapats av den aktuella anvรคndaren. SELECT * FROM user_source dรคr namn=' '
ALLA_PROCEDURER Ger underprogramsdetaljer som object_id, รถverbelastningsdetaljer etc. skapade av alla anvรคndare. Vร„LJ * FRร…N alla_procedurer Dรคr objektnamn=' '
USER_PROCEDURES Ger underprogrammet detaljer som object_id, รถverbelastningsdetaljer, etc. skapade av den aktuella anvรคndaren. Vร„LJ * FRร…N anvรคndarprocedurer Dรคr objektnamn=' '

UTL_FILE โ€“ En รถversikt

UTL_FILE รคr ett separat verktygspaket som tillhandahรฅlls av Oracle fรถr att utfรถra speciella uppgifter. Den anvรคnds huvudsakligen fรถr att lรคsa och skriva operativsystemfiler frรฅn PL/SQL-paket eller underprogram. Den har separata funktioner fรถr att lรคgga in information i och hรคmta information frรฅn filer. Den tillรฅter ocksรฅ lรคsning och skrivning i den ursprungliga teckenuppsรคttningen.

Programmeraren kan anvรคnda detta fรถr att skriva operativsystemfiler av alla typer, och filen kommer att skrivas direkt till databasservern. Namn och katalogsรถkvรคg nรคmns i skrivande stund.

Vanliga frรฅgor

Paket erbjuder modularitet, informationsdรถljning och enklare applikationsdesign. Specifikationen exponerar ett publikt grรคnssnitt medan brรถdtexten dรถljer implementeringen. Oracle laddar ett paket till minnet vid fรถrsta anropet, sรฅ att senare underprogramsanrop undviker disk-I/O och kรถrs snabbare.

Ett paket grupperar mรฅnga relaterade underprogram och delade objekt under ett namn, vilket separerar en publik specifikation frรฅn en privat enhet. En fristรฅende procedur eller funktion รคr ett enda, oberoende schemaobjekt utan den uppdelningen mellan grรคnssnitt och implementering.

Ja, om specifikationen endast deklarerar variabler, konstanter, typer eller undantag. En brรถdtext blir obligatorisk nรคr specifikationen deklarerar en procedur, funktion eller markรถr, eftersom brรถdtexten mรฅste tillhandahรฅlla deras implementering. Annars kan specifikationen stรฅ fristรฅende.

Anvรคnd DROP PACKAGE fรถr att ta bort bรฅde specifikationen och brรถdtexten, eller DROP PACKAGE BODY fรถr att bara ta bort brรถdtexten. Kompilera om ett ogiltigt paket med ALTER PACKAGE paketnamn COMPILE, eller COMPILE BODY fรถr att bara รฅterskapa brรถdtexten efter รคndringar.

Attributet %ROWTYPE deklarerar en post vars fรคlt matchar kolumnerna i emp-tabellen. Genom att anvรคnda emp%ROWTYPE hรฅlls parametrarna get_record och set_record i linje med tabellstrukturen, sรฅ kolumnรคndringar krรคver fรคrre kodredigeringar.

Ja. Varje session som refererar till ett paket fรฅr sin egen instansiering och paketstatus, som kvarstรฅr under hela sessionens livstid. Omkompilering av brรถdtexten ignorerar statusen och genererar ORA-04068-felet vid nรคsta anrop.

Ja. GitHub Copilot utkastar paketspecifikationer, matchande brรถdtexter och รถverbelastade underprogram frรฅn en kommentar, och fรถreslรฅr %ROWTYPE-parametrar. RevVisa de genererade grรคnserna, initialiseringsblocket och undantagshanteringen innan distribution.

AI-assistenter skannar ett paket efter ogiltiga tillstรฅnd, saknade definitioner av innehรฅll och beroendekedjor som bryts nรคr specifikationen รคndras. Denna granskning av maskininlรคrning flaggar tvetydiga รถverbelastade delprogram och risker fรถr omkompilering innan paketet nรฅr produktionskapacitet.

Sammanfatta detta inlรคgg med: