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.

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.
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.
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.
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.
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.
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.





