Note PL/SQL
Note PL/SQL
Istorie
PL/SQL a apărut pentru prima dată înOracle Formsv3. Câț iva ani mai târziu, a fost inclus în
theOracle Databaseserver v7 (ca proceduri de bază de date, funcț ii, pachete, declanș atoare ș i
blocuri anonime) urmate deOracle Reportsv2.
Funcț ionalitate
PL/SQL suportă următoarele:variabile, condiț ii, arrays, ș excepț
i ii.
Implementările din versiunea 8 a Oracle Database încoace au inclus caracteristici
asociat cuorientare obiect.
Funcț iile SQL de bază ca unlimbaj declarativ. SQL standard—spre deosebire de unele
limbaje de programare funcț ionalănu necesită implementări pentru a convertiapeluri de final
la salturi. Standardul deschis SQL nu oferă în mod obiș nuit "prima linie" ș i "restul tabelei"
accesorii, ș i nu poate efectua cu uș urinț ă unele construcț ii precumbuclucă. PL/SQL, totuș i,
ca uncomplet Turinglimbaj procedural care umple aceste goluri, permite baza de date Oracle
dezvoltatori pentru a interacț iona cu bazabază de date relaț ionalăîntr-o manieră imperativă.
Declaraț iile SQL pot efectua apeluri explicite în linie la funcț ii PL/SQL sau pot cauza PL/SQL
declanș atoarea trage asupra predefinitLimbaj de manipulare a datelor(DML) evenimente.
În timp ce programatorii pot încorpora cu uș urinț ă instrucț iuni SQL DML în PL/SQL (ca ș i cursor
definiț ii, de exemplu, sau utilizând sintaxa SELECT ... INTO),Limbaj de Definire a Datelor
(DDL) instruc ț iunile precum CREATE TABLE/DROP INDEX etc. necesită utilizarea de
SQL dinamic. Versiunile anterioare ale Oracle Database necesită utilizarea unui complex încorporat
DBMS_SQLpachet pentru SQL dinamic unde sistemul trebuie să analizeze explicit ș i
executa o declaraț ie SQL. Versiuni ulterioare au inclus unEXECUTĂ IMEDIATsintaxă
numit „SQL dinamic nativ”, care simplifică considerabil lucrurile. Orice utilizare a DDL în
o bază de date Oracle va duce la un angajament implicit. Programatorii pot folosi, de asemenea, dinamic
SQL pentru a executa DML unde nu cunosc conț inutul exact al afirmaț iei în
avansează.
PL/SQL oferă mai multe pachete predefinite pentru scopuri specifice. Astfel de pachete PL/SQL
inclus
• DBMS_OUTPUT - pentru operaț iuni de ieș ire către destinaț ii non-bază de date
• DBMS_JOB - pentru a rula proceduri/funcț ii specifice la un moment dat (de exemplu.
programare
• DBMS_XPLAN - pentru formatarea ieș irii "Explain Plan"
• DBMS_SESSION - oferă acces la SQL ALTER SESSION ș i SET ROLE
declaraț ii ș i alte informaț ii din sesiune.
• DBMS_METADATA - pentru extragerea metadatelor din dicț ionarul de date (cum ar fi
Declaraț ii DDL
• UTL_FILE - pentru citirea ș i scrierea fiș ierelor pe disc
• UTL_HTTP - pentru a face cereri către servere web din baza de date
• UTL_SMTP - pentru trimiterea de emailuri din baza de date (printr-un server SMTP)
Oracle Corporation adaugă în mod obiș nuit mai multe pachete ș i/sau îmbunătăț eș te funcț ionalitatea pachetelor
cu fiecare lansare succesivă a Oracle Database.
Programele PL/SQL constau din proceduri, funcț ii ș i blocuri anonime. Fiecare dintre
acestea sunt formate din unitatea de bază PL/SQL care estebloc. Blocurile iau generalul
formă
DECLARE
-- Bloc de declaraț ie (opț ional)
ÎNCEPE
-- Program corect
EXCEPȚ IE
-- Tratarea excepț iilor (opț ional)
SFÂRȘ IT
/* Comentariu exemplar ce se întinde
linii multiple... */
Excepț ii, erori care apar în timpul executării codului, au unul dintre cele două tipuri:
1. excep ț ii predefinite
2. excep ț ii definite de utilizator.
Programatorii trebuie să ridice excepț ii definite de utilizatori în mod explicit. Ei pot face asta folosind
comanda RAISE, cu sintaxa:
Secț iunea DECLARE defineș te ș i (opț ional) iniț ializează variabile. Dacă nu este iniț ializată
în mod specific, acestea se setează implicit la NULL.
De exemplu:
DECLARA
number1 NUMĂR(2);
NUMĂR(2) := 17;
Salut lume
DATA := SYSDATE; -- data ș i ora curentă
ÎNCEPE
SELECT numărul_străzii
ÎN NUMĂRUL1
ADRESĂ DE LA
UNDE numele = 'Smith';
SFÂRȘ IT;
Simbolul := funcț ionează ca un operator de asignare pentru a stoca o valoare într-o variabilă.
Funcț iile în PL/SQL sunt o colecț ie deSQLș i instrucț iuni PL/SQL care efectuează o sarcină
ș i ar trebui să returneze o valoare mediului apelant.
ÎNCEPE
Bloc Pl/SQL;
EXCEPȚ IE
SFÂRȘ IT;
Variabile numerice
float binar
numeric, real, smallint, binary_integer
Variabile de caracter
varchar, char, long, raw, long raw, nchar, nchar2, clob, blob, bfile
Variabile de dată
data := '01-Ian-2005';
Oracle oferă o serie de tipuri de date care pot stoca date (DATE, DATETIME,
TIMESTAMP etc), totuș i DATE este cel mai frecvent utilizat.
Programatorii definesc variabile de dată prin ataș area codului de tip de date "DATE" la o variabilă
nume. TheDATA_INfuncț ia poate fi utilizată pentru a converti ș iruri în valori de dată. Funcț ia
transformă prima frază între ghilimele într-o dată, folosind ca definiț ie a doua frază între ghilimele,
de exemplu:
DATA('31-12-2004','zz-ll-aaaa')
sau
Variable_name Table_name.Column_name%tip;
De exemplu:
DECLARĂ
TIP t_adresa ESTE ÎNREGISTRARE (
nume adresă.nume%TIP
adresa.strada%TIP
numărul_străzii address.street_number%TIP
cod poș tal address.cod_poș tal%TIP);
v_adresa
ÎNCEPUT
SELECT nume stradă număr_stradal cod poș tal ÎN v_adresa DE LA
adresa UNDE ROWNUM = 1;
SFÂRȘ IT;
Acest program exemplu îș i defineș te propriul tip de date, numit t_address, care conț ine câmpurile
nume
aș adar, conform exemplelor, suntem capabili să copiem datele din baza de date în câmpuri în
program. Folosind acest tip de date, programatorul a definit o variabilă numită v_adresă ș i
l-a încărcat cu date din tabela ADDRESS.
Programatorii pot accesa atributele individuale dintr-o astfel de structură prin intermediul punctului.
notare, astfel: "v_address.street := 'High Street';"
Dacă x = 1 ATUNCI
secvenț ă_de_declaraț ii_1;
DACA x = 2 ATUNCI
secvenț ă_de_devise_2;
ELSIF x = 3 ATUNCI
secvenț a_de_afirmaț ii_3;
ELSIF x = 4 ATUNCI
secvenț a_de_afirmatii_4;
ELSIF x = 5 ATUNCI
secvenț a_de_declaraț ii_5;
ALTFEL
secvenț a_de_afirmaț ii_N;
SFÂRȘ IT DACĂ;
CAZ
CÂND x = 1 ATUNCI secvenț a_de_instrucț iuni_1;
CÂND x = 2 ATUNCI secvenț a_de_instrucț iuni_2;
CAND x = 3 ATUNCI secvenț a_de_instrucț iuni_3;
CÂND x = 4 ATUNCI secvenț a_de_instrucț iuni_4;
CAND x = 5 ATUNCI secvenț a_de_instrucț iuni_5;
ALTFEL secvenț a_de_instrucț iuni_N;
ÎNCHEIE CAZUL;
CAS x
CĂND 1 ATUNCI secvenț a_de_declaratii_1;
CAND 2 ATUNCI secvenț a_de_instrucț iuni_2;
CAND 3 ATUNCI secvenț a_de_instrucț iuni_3;
CÂND 4 ATUNCI secvenț a_de_instrucț iuni_4;
CĂND 5 ATUNCI secvenț a_de_declaraț ii_5;
ALTFEL secvenț a_de_instrucț iuni_N;
ÎNCHIDE CAZUL;
Gestionarea array-urilor
PL/SQL se referă laarray-urica "colecț ii". Limbajul oferă trei tipuri de colecț ii:
Programatorii trebuie să specifice o limită superioară pentru varray-uri, dar nu este necesar pentru tabelele indexate.
pentru tabele imbricate. Limba include mai multe colecț iimetodefolosit pentru a manipula
elementele colec ț iei: de exemplu PRIMUL, ULTIMUL, URMĂTORUL, PRECEDENTUL, EXTINDERE, TRIMARE,
Ș tergeț i, etc. Tabelele indexate pot fi folosite pentru a simula arrays asociative, ca în aceasta
exemplu de funcț ie memo pentru funcț ia Ackermann în PL/SQL.
Ciclare
Ca un limbaj procedural prin definiț ie, PL/SQL oferă mai multeiterareconstructe
inclusiv declaraț ii de bază LOOP,Buclele WHILE, Bucle FOR, ș i buclele Cursor FOR.
Declaraț ii LOOP
Sintaxă:
CICLU
declaraț ie1;
declaraț ie2;
FINALIZARE CICLU;
Loop-urile pot fi terminate folosindIEȘ IREcuvânt cheie, sau prin ridicarea unuiexcepț ie.
Bucle WHILE
Sintaxă:
BUCLOOP
...fă ceva...
SFÂRȘ ITUL CICLULUI;
Buclă FOR
Bucllele cursor-for deschid automat un cursor, citesc datele lor ș i închid din nou cursorul.
DECLARA
CURSOR cursor_person ESTE
SELECT cod_persoană DIN tabel_persoane;
ÎNCEPUT
PENTRU RecordIndex ÎN cursor_person
BUCLOTE
DBMS_OUTPUT.PUT_LINE(RecordIndex.person_code);
ÎNCHID LOOP;
FINALIZARE;
Exemplu
DECLARĂ
var NUMĂ;/* acest "var" nu este în acelaș i domeniu cu "var" din ciclul for
o referinț ă la "var" după "end loop;" ar găsi-i
valoarea să fie null */
ÎNCEPE
/*Atenț ie. pentru ciclul variabile în pl/sql sunt nou declaraț ii, cu
domeniu doar în interiorul buclei */
PENTRU var ÎN 0 ..10 LOOP
DBMS_OUTPUT.put_line(var);
FINALIZAȚ I CICLUL;
SFÂRȘ IT;
0
1
2
3
4
5
6
7
8
9
10
Tipuri de date numerice
nchar(dimensiune)
Dimensiune maximă Dimensiune maximă Dimensiune maximă Unde este numărul de
de 2000 de octeti. de 2000 de biți. de 2000 de biți. caractere de stocat. NLS de lungime fixă
șir cu spații adăugate.
nvarchar2(size) Dimensiunea maximă Dimensiunea maximă Dimensiunea maximă Unde size este numărul de
de 4000 de octeți. de 4000 de octeți. de 4000 de octeți. caractere de stocat. Lungime variabilă
Șir NLS.
varchar2(size) Dimensiunea maximă Dimensiunea maximă Dimensiunea maximă Unde size este numărul de
de 4000 de octeți. de 4000 de octeți. de 4000 de octeți. caractere de stocat. Lungime variabilă
șir.
Scrierea unui program simplu
5. Închide cursorul.
Sintaxa pentru declararea unui cursor este următoarea:
CURSOR cursor_name ESTE
SELECT_statement;
unde
numele_cursorului specifică numele cursorului.
SELECT_statement este o instrucțiune SELECT.
Deschizi un cursor folosind instrucțiunea OPEN, care trebuie plasată în secțiunea executabilă a blocului.
Pentru a citi fiecare rând din cursor, poți folosi instrucțiunea FETCH.
Declarația FETCH citește valorile coloanelor în variabilele pe care le specificați;
FETCH foloseș te următoarea sintaxă:
FETCH cursor_name
ÎN variable[, variable ...];
Unde
1. numele_cursorului specifică numele cursorului.
2. variabila este o variabilă declarată anterior în care sunt introduse valorile din instrucțiunea SELECT a cursorului.
stocat.
Odată ce ai terminat cu cursorul, ultimul pas este să închizi cursorul folosind instrucțiunea CLOSE.
Închiderea cursorilor tăi eliberează resursele sistemului
Funcții
O funcție este similară cu o procedură, cu excepția faptului că o funcție trebuie să returneze o valoare.
Creezi o funcție folosind instrucțiunea CREATE FUNCTION.
Sintaxa simplificată pentru declarația CREATE FUNCTION este următoarea:
CREAȚI[SA ÎNLOCUIȚI] FUNCȚIA nume_funcț ie
[(numele_parametrului [IN | OUT | IN OUT] tip [, ...])]
Tip RETURN
{ESTE | SUNT}
ÎNCEPE
corpul_functiei
SFÂRȘ ITfuncț ie_nume;
Unde
1. OR REPLACE specifică funcția care urmează să înlocuiască o funcție existentă, dacă este prezentă.
2. tipul specifică tipul PL/SQL al parametrului.
3. Corpul unei funcții trebuie să returneze o valoare de tip PL/SQL specificată în clauza RETURN.
Declanșatori
Un trigger este o procedură care este rulată automat de baza de date atunci când se efectuează un INSERT, UPDATE DML SQL specificat.
sau instrucțiunea DELETE este executată împotriva unui tabel.
Declanșatoarele sunt utile pentru a face lucruri precum auditarea avansată a modificărilor efectuate asupra valorilor coloanelor dintr-un tabel.
Când se activează un Trigger
1. Un trigger poate fi activat înainte sau după ce instrucțiunea SQL rulează.
2. O declanșare poate fi executată o dată pentru fiecare rând afectat. O astfel de declanșare este cunoscută sub numele de declanșare la nivel de rând.
3. Un trigger poate fi rulat pentru toate rândurile. Un astfel de trigger este cunoscut sub numele de trigger la nivel de declarație.
4. Un trigger la nivel de rând are acces la valorile vechi și noi ale coloanelor atunci când triggerul este activat ca rezultat al unei
Declarația UPDATE pe acea coloană.
Așa cum s-a menționat, tranzacțiile sunt unități logice de muncă pe care le folosești pentru a împărți activitățile tale de bază de date.
O tranzacție are atât un început, cât și un sfârșit.
O tranzacție începe atunci când unul dintre următoarele evenimente are loc:
1. Te conectezi la baza de date și efectuezi prima declarație DML.
7. Efectuezi o declarație DML care eșuează, caz în care se efectuează automat un ROLLBACK pentru aceasta.
declarație DML individuală.
O tranzacție este un set de instrucțiuni SQL între orice două COMMIT și ROLLBACK
declarații.
Un cursor implicit este un cursor care este creat intern de Oracle. Este creat de Oracle
pentru fiecare individSQL.
Răspuns: PL/SQL este extensia de limbaj procedural a Oracle pentru SQL. Limbajul include obiecte
orientatprogramaretehnici precum încapsularea, suprascrierea funcțiilor, ascunderea informațiilor
(toate, cu excepția moștenirii), și astfel, aduce programare de vârf la baza de date Oracleserverși
o varietate de instrumente Oracle.
Răspuns: În prezent, dimensiunea maximă analizată/compilată a unui bloc PL/SQL este de 64K și maximul
dimensiunea codului este de 100K. Puteți rula următoarea declarație select pentru a interoga dimensiunea unui existent
pachet sau procedură. SQL> select * from dba_object_size where name = 'numele_procedurii'
Răspuns: PL/SQL V2.2, disponibil cu Oracle7.2, implementează un wrapper binar pentru PL/SQL
programe pentru a proteja codul sursă. Acest lucru se face printr-o utilitate independentă care transformă
Codul sursă PL/SQL în cod obiect binar portabil (puțin mai mare decât originalul). În acest fel
poți distribuisoftwarefără a fi nevoie să vă faceți griji cu privire la expunerea algoritmilor dumneavoastră proprietari și
metodele SQL*Plus și SQL*DBA vor înțelege și vor ști în continuare cum să execute astfel de scripturi. Doar
fii atent, nu există comanda "decode" disponibilă. Sintaxa este: înfășurați iname=myscript.sql
xxxx.yyy
6.Poate cineva să folosească SQL dinamic în cadrul PL/SQL? SAU Poț i folosi un DDL într-o procedură? Cum?
Răspuns: Din PL/SQL V2.1 se poate folosi pachetul DBMS_SQL pentru a executa SQL dinamic
declarații.
Ex: CREAZĂ SAU ÎNLOCUIEȘTE PROCEDURA DYNSQL CA
cur integer;
rc număr întreg;
ÎNCEPE
cur := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cur,'CREAȚI TABELA X (Y DATA)', DBMS_SQL.NATIVE);
rc := DBMS_SQL.EXECUTE(cur);
DBMS_SQL.CLOSE_CURSOR(cur);
SFÂRȘIT;