curs sql plsql

Upload: mihai-sorin-leu

Post on 08-Jan-2016

367 views

Category:

Documents


2 download

DESCRIPTION

documentatie

TRANSCRIPT

CURS ORACLE

SQL si PL/SQLSUPORT DE CURS

Data crearii:11 Decembrie 2009Autor:Bogdan OlteiCuprins2Cuprins

41. INTRODUCERE - EVOLUTIA SI FACILITTILE SISTEMULUI ORACLE

72. CONCEPTE GENERALE

83. PREZENTAREA UNELTEI DE MANIPULARE A BAZEI DE DATE (PL/SQL Developer)

124. OBIECTELE SCHEMEI BAZEI DE DATE

155. TIPURI DE DATE

176. PRODUSELE ORACLE UNELTE DE DEZVOLTARE (RAPOARTE SI FORME)

187. SELECTAREA DATELOR DIN BAZA DE DATE

187.1 COMANDA SELECT

207.2 UTILIZAREA CLAUZEI FROM

217.3 DELIMITATORI

237.4 UTILIZAREA CLAUZEI WHERE

257.5 UTILIZAREA CLAUZEI ORDER BY - ordonarea liniilor rezultate in urma unei cereri

267.6 UTILIZAREA CLAUZEI GROUP BY - functii de grupare

277.7 SELECTAREA DATELOR DIN MAI MULTE TABELE

287.8 REALIZAREA CERERILOR INCLUSE

307.9 Functii de conversie

307.10 Functii de prelucrare caractere

327.11 Functii aritmetice

337.12 Functii pentru prelucrarea datelor calendaritice

337.13 Functii generale

347.14 Functii de grup

347.15 OPERATORUL ROLLUP

357.16 OPERATORII PENTRU MULTIMI

367.17 OPERATII PE TABELE STRUCTURATE ARBORESCENT

367.18 STRUCTURA SINTAXA CASE SI WITH

388. LIMBAJ DE DEFINIRE A DATELOR

388.1 CREATE CREATE

398.2 COMANDA ALTER

398.3 COMANDA DROP

408.4 COMANDA INSERT

418.5 COMANDA UPDATE

428.6 COMANDA DELETE

438.7 COMANDA TRUNCATE

459. LIMBAJ DE CONTROL AL DATELOR

4610. CREARE, UTILIZARE, STEGERE VIZUALIZARI

4911. INTRODUCERE IN PL/SQL

4911. 1 CE ESTE PL/SQL?

4911. 2 AVANTAJELE PL/SQL

5011. 3 STRUCTURA PL/SQL

5111. 4 FACILITATILE PL/SQL

5111. 5 SINTAXA DE BA ZA A PL/SQL

5211.5. 1 BLOCURI INCLUSE

5311.5.2 TIPURI DE DATE SCALARE

5411. 6 DECLARAREA VARIABILELOR

5511.7 DECLARAREA CONSTANTELOR

5511.8 ATRIBUIRILE SI EXPRESIILE

5611.9 STRUCTURA DE CONTROL

5711.9.1 TIPURI DE DATE COMPUSE

5911.10 TRIGGERI - DECLANSATOARE

6011.11 CURSOARE descriere si utilizare

6411.12 PROCEDURI SI FUNCTII

1. INTRODUCERE - EVOLUTIA SI FACILITTILE SISTEMULUI ORACLEOracle este un sistem de gestiune a bazelor de date complet relational, extins, cu facilitati din tehnologia orientata obiect (OO). Sistemul Oracle este realizat de firma Oracle Corporation care a fost infiintata in anul 1977 in SUA - California si acum este cel mai mare furnizor de software de gestiunea datelor. Acesta este operational pe toata gama de calculatoare (micro, mini, mainframe) sub diverse sisteme de operare. Prima versiune de SGBD Oracle a fost realizata la sfarsitul anilor '70 respectand teoria relationala. In cadrul sistemului a fost implementat de la inceput limbajul relational SQL pe care l-a dezvoltat ulterior fata de versiunea standard rezultand SQL*Plus. Incepand cu versiunea 5. 0 SGBD Oracle are urmatoarele facilitati suplimentare: functioneaza in arhitectura client/server; are limbaj procedural propriu PL/SQL; are recompilatoare ca interfata cu limbajele universale. In iunie 1997 s-a lansat SGBD Oracle versiunea 8. 0, inclusiv in Romania, care a marcat o noua generatie de baze de date Oracle deoarece initiaza trecerea de la arhitectura client/server la arhitectura NC (Network Computing), are o mare deschidere, are optimizari performante si pune accent mai mare pe analiza (modelare-functionalitate) fata de programare (codificare). In noiembrie 1998 s-a lansat SGBD Oracle 8i ca sistem de baze de date pe Internet. Aceasta versiune are urmatoarele caracteristici:

Este reproiectat arhitectural in mod fundamental si se incadreaza in tendinta de trecere de la arhitectura client/server la arhitectura NC;

Permite dezvoltarea unei baze de date de orice dimensiune, in mod centralizat sau distribuit;

Are facilitati de salvare/restaurare automate si inteligente;

Permite partitionarea integrala pentru tabele si indecsi;

Are mesagerie integrala, prin comunicarea intre aplicatii si procesare offline (chiar daca aplicatiile nu sunt conectate);

Prelucrarea paralela pentru: replicare, cereri de regasire, actualizare;

Ofera facilitati din tehnologia OO, prin care se permite definirea si utilizarea de obiecte mari si complexe;

Optimizeaza cererile de regasire prin reutilizarea comenzilor SQL identice lansate de utilizatori diferiti si prin realizarea unui plan de executie a instructiunilor SQL;

Are un grad de securitate sporit prin: server de criptare, control trafic retea, niveluri de parolare etc. ;

Permite lucrul cu depozite de date (Data Warehouse) care contin date multidimensionale (cu tehnologia OLAP);

Contine foarte multe produse ceea ce-l face sa fie o platforma pentru baze de date: servere (Oracle 8, Application, Security, Internet Commerce etc), instrumente (Designer, Developer, Express, WebDB etc), aplicatii (Financials, Projects, Market Manager, Manufacturing etc);

Este primul SGBD pentru Internet cu server Java inclus;

Reduce drastic costurilor pentru realizarea unei aplicatii(de cca 10 ori fata de versiunea anterioara);

Este o platforma multipla permitand lucrul pe orice calculator, orice sistem de operare, orice aplicatie, orice utilizator;

Are instrumente diverse pentru dezvoltarea aplicatiilor: bazate pe modelare (Designer, Developer, Application Server), bazate pe componente (Java), bazate pe HTML (browsere, editoare Web) si XML, prin programare: proceduri stocate (PL/SQL, Java), obiecte standard, obiecte ODBC, obiecte JDBC, fraze SQL etc., tip internet (WebDB);

Ofera servicii multiple de Internet (Web, E_mail, e_bussines, etc) integrate cu servicii Intranet. Ulterior a fost lansat sistemul Oracle 9i care a marcat trecerea la o noua generatie de servicii internet. El este mai mult decat un suport pentru baze de date deoarece ofera o infrastructura completa de software pentru afaceri electronice (e-business) si ruleaza pe o varietate de sisteme de calcul si de operare: SUN-SOLARIS, HP-UX, IBM-AIX, PC_WINDOWS, XX-LINUX. Componenta Oracle WebDB a evoluat in Oracle Portal. Oracle 9i DATABASE are fata de versiunea anterioara o protectie ridicata si automatizata, iar costul administrarii bazei de date scade in mod drastic. Oracle 9i REAL APPLICATION CLUSTERS (RAC) se bazeaza pe o noua arhitectura de BD numita imbinare ascunsa (Cache Fusion). Aceasta este o noua generatie de tehnologie de clustere. Conform acestei arhitecturi la adaugarea unui calculator inr-o retea cu BD Oracle, clusterele se adapteaza automat la noile resurse, fara sa fie necesara redistribuirea datelor sau rescrierea aplicatiei. Posibilitatea aparitiei unei erori la o configuratie cu 12 calculatoare sub Oracle 9i RAC este foarte mica, esimata ca durata in timp la cca 100. 000 de ani. In Oracle 9i APPLICATION SERVER se pot creea si utiliza aplicatii Web care sunt foarte rapides i permit integrarea serviciilor de Internet. Oracle 9i DEVELOPER SUITE este un mediu complet pentru dezvoltarea aplicatiilor tip afaceri electronice (e-business) si tip Web. El se bazeaza pe tehnologiile Java si XML si permite personalizarea (Oracle Personalization). In anul 2003 a fost lansata versiunea Oracle 10g care adauga noi facilitati sistemului Oracle 9i. 2. CONCEPTE GENERALEIn 1974 a fost lansat proiectul System/R de catre firma IBM. Tot in acest an a aparut limbajul structurat de programare SEQUEL (Structured English as Query Language) autori fiind Chamberlin si Boyce. In 1976 apare un nou limbaj SEQUEL 2 care a fost declarat limbajul de interogare al SGBD System/R. Denumirea limbajului este schimbata de Chamberlin in SQL (Structured Query Language) in anul 1980. Ulterior limbajul a fost perfectionat fiind considerat cel mai raspandit limbaj de interogare a bazelor de date relationale. Institutul National pentru Standarde in anul 1982 a lansat un proiect de lucru pentru standardizarea limbajelor de interogare care a fost finalizat in 1986 aparand standardul ANSI SQL-86. Acesta defineste comenzile de baza ale SQL, dar nu contine partea de actualizare si acordarea drepturilor de acces la o baza de date. Prin revizuire acest limbaj apare in 1989 SQL-1 ca fiind limbajul fundamental al SGBD ralationale. In 1992 apare versiunea SQL-2 care ofera noi facilitati cum ar fi:

jonctiune externa, implementarea restrictiei referentiale, modificarea schemei bazei de date, etc. Cel mai recent standard este SQL-3 care a fost lansat in anul 1999, acesta este considerat un limbaj complet in vederea definirii si gestiunii obiectelor complexe. Se considera ca prin publicarea standardului propus in acest an a fost depasita bariera relationalului, el fiind mult mai mult decat un instrument de consultare a bazelor de date. 3. PREZENTAREA UNELTEI DE MANIPULARE A BAZEI DE DATE (PL/SQL Developer)

Asa cum s-a descris in documentul de conectare la baza de date, fereastra de mai jos este cunoscuta si vom executa pasii stiuti. Se introduce userul si parola bazei de date si apoi se alege din lista, baza la care dorim sa ne conectam. Dupa ce se accepta userul si parola, aplicatia este activa, iar ecranul principal este descris in imaginea alaturata.

Meniul uneltei PL/SQL Developer este unul relativ comun pentru operatiile minimale dar este si destul de complex in cazul unei aprofundari mai amanuntite.Astfel vom descrie meniul pe componente principale:

a) Meniul principal este cel din bara cea mai de sus.

b) Meniu de acces rapid (shortcut-uri).

c) In parea stanga jos se afla meniul de obiecte.

d) In centru se afla ecranul de vizualizare.

Pentru a deschide o fereastra se apasa pe butonul NEW , iar apoi din lista aparuta se alege SQL WINDOW:

Astfel in partea ecranului de vizualizare va aparea un ecran pentru interogare SQL. In aceasta fereastra se vor scrie interogarile dorite.

O interogare simpla se scrie in ecran , iar pentru vizualizarea datelorse apasa pe butonul RUN , sau se poate apasa F8 de la tastatura.

Exemplu simplu de interogare :

PL/SQL Developer este o unealta usor de utilizat si ofera o miltime de facilitati itlizatorilor, printre care amintim :

Interogare simpla a bazei de date (sql window) Creare de rapoarte in mod vizualizare (report window) Ofera posibilitatea de import \export date , tabele sripturi

Ofera posibilitatea de a gestiona cu usurinta datele.

Etc.

4. OBIECTELE SCHEMEI BAZEI DE DATESQL este un limbaj neprocedural si opereaza asupra datelor normalizate. Conceptele necesare a fi cunoscute pentru lucrul cu acest limbaj sunt: tabela, cheie primara, coloana, rind, viziune, index, sinonim, cluster, baza de date relationala, comanda, blocul, cererea, raportul etc. Asa cum am descris anterior, exista un meniu cu obiecte ale bazei de date:

Tabela sau relatia este un ansamblu format din n coloane (atribute/subansambluri) si m randuri (tupluri/linii) care respecta urmatoarele conditii minime:

nu contine date la nivel agregat (valorile aflate la intersectia liniilor cu coloanele sa fie la un nivel elementar);

liniile sunt distincte unele fata de altele; nu contine coloane repetitive in descriere.

Cheia primara este un atribut care are valori distincte. Deci, fiecare linie se identifica printr-o valoare distincta. Doua sau mai multe attribute care pot fi chei primare se numesc chei candidate. Coloana tabelei este formata din valorile pe care le ia atributul in liniile tabelei respective. Randul/tuplul/linia este format din valorile coloanelor ce se refera la o entitate a tabelei. Baza de date relationala este un ansamblu de tabele normalizate, grupate in jurul unui subiect, in principiu, bine definit. Intr-o baza de date relationala, entitatile si legaturile sunt transpuse in tabele. Pentru realizarea unor operatii sau pentru a utiliza in cereri nume mai scurte, se pot defini sinonime ale unor nume de tabele sau viziuni (views). Viziunea (view) este o tabela logica si reprezinta o fereastra la date, dintr-una sau mai multe tabele. Pentru ca accesul la date sa se faca mai rapid, se utilizeaza indexarea. Un index reprezinta o cheie pe una sau mai multe coloane. Indexarea este dinamica deoarece se pot adauga sau sterge indecsi oricind, fara ca datele memorate sau aplicatiile scrise sa fie afectate. Un cluster reprezinta o anumita modalitate de grupare a randurilor uneia sau mai multor tabele. Aceasta grupare mareste viteza de executie a unor operatii consumatoare de timp. Comanda este o instructiune emisa din SQL*Plus catre o baza de date Oracle. Blocul reprezinta un grup de instructiuni SQL si PL/SQL. Cererea este o comanda SQL (SELECT) care regaseste date din baza de date. Rezultatul cererii il formeaza datele regasite din baza de date. Numele unei baze de date, al unei tabele, coloane sau variabile utilizator trebuie sa aiba lungimea intre 1 si 30 caractere. Un nume nu poate contine apostrofuri. Cu atit mai putin, un nume utilizat intr-o comanda nu va fi introdus intre apostrofuri. Literele mici si mari sunt echivalente (nu se face distinctia intre literele mici si mari). Un nume trebuie sa inceapa cu o litera, sa contina numai anumite caractere (A-Z, 0-9, $, #, @, -), sa nu duplice numele unui alt obiect de acelasi tip si sa difere de un cuvant rezervat ORACLE. 5. TIPURI DE DATEPentru memorarea datelor numerice, tipurile cele mai frecvent folosite sunt: NUMBER, INTEGER, FLOAT, DECIMAL.

Pentru memorarea irurilor de caractere, cele mai frecvent tipuri de date utilizate sunt: CHAR, VARCHAR2 i LONG. Exist restricii referitoare la folosirea tipului de date LONG.

- ntr-un tabel poate s fie o singur coloan de tip LONG.

- Nu pot fi comparate dou iruri de caractere de tip LONG.

- O coloan de tip LONG nu poate fi parametru ntr-o procedur.

- O funcie nu poate ntoarce ca rezultat o valoare de tip LONG.

- O coloan de tip LONG nu poate fi folosit n clauzele WHERE, ORDER BY, GROUP BY, CONNECT.

- Operatorii sau funciile Oracle nu pot fi folosii n SQL pentru a modifica coloane de tip LONG.

- O coloan de tip LONG nu poate fi indexat.

Alte tipuri de date scalare furnizate de SQL sunt NCHAR i NVARCHAR2, folosite pentru reprezentarea caracterelor limbilor naionale.Informaii relative la timp sau dat calendaristic se obin utiliznd tipul DATE. Pentru fiecare dat de tip DATE sunt depuse: secolul, anul, luna, ziua, ora, minutul, secunda. Pentru o coloan de tip DATE sistemul rezerv 7 bytes, indiferent dac se memoreaz doar timpul, sau doar data calendaristic.Formatul implicit al datei se definete cu ajutorul parametrului de iniializare NLS_DATE_FORMAT. n general, acest parametru este setat la forma DD-MON-YY. Dac nu este specificat timpul, timpul implicit este 12:00:00.n Oracle8, alturi de aceste tipuri scalare, au fost introduse tipurile de date LOB (Large Objects), care specific locaia unor obiecte de dimensiuni mari.

Oracle9i introduce noi tipuri de date pentr timp:

- TIMESTAMP (precizie_fraciuni_secund) cuprinde valori pentru anul, luna i ziua unei date calendaristice, dar i valori pentru or, minut, secund. - INTERVAL YEAR (precizie_an) TO MONTH stocheaz o perioad de timp specificat n ani i luni, unde precizie_an reprezint numrul de cifre din cmpul YEAR. - INTERVAL DAY (precizie_zi) TO SECOND (prec_fraciuni_sec) stocheaz o perioad de timp reprezentat n zile, ore, minute i secunde.6. PRODUSELE ORACLE UNELTE DE DEZVOLTARE (RAPOARTE SI FORME)Realizarea unui raport care sa arate asa cum dorim este o sarcina destul de dificila, din cauza multiplelor modalitati in care se pot combina datele extrase din baza de date. Reports Builder este folosit pentru a realize rapoarte profesionale, cu un design de calitate. Se pot crea rapoarte intro combinatie de stiluri si se pot lista intr-o varietate de formate, inclusiv HTML, XLS sau PDF. Fundamentul rapoartelor sunt datele extrase din baze de date Oracle sau non-Oracle cu ajutorul interogarilor SQL. Oracle Reports presupune 3 componente care conlucreaza, dar considerate oarecum distincte: Reports Builder, Reports Compiler si Reports Runtime.

Exista 2 tipuri astfel de elemente: grupuri de inregistrari (record groups), cuprinzand datele fundamentale ale raportului si grupuri de separare (break groups) folosite pentru a concura o structura ierarhica intr-un raport si deci a imparti datele in subgrupuri tinand seama de anumite criterii. Suprafata imprimabila are 3 zone mari:

Header (inceputul raportului);

Main (zona principala a raportului);

Trailer (zona finala a raportului).

Regiunile Body and Margins definesc cuprinsul, antetul si subsolul paginii. Reprezentarea vizuala a datelor are loc prin plasarea pe raport a unor obiecte de tip Field. Datele sunt insotite de texte explicative si de reprezentari grafice diverse.

De asemenea in raport se pot adauga imagini bitmap, spre a le spori expresivivitatea. Delimitarea grupurilor de inregistrari se efectueaza cu ajutorul obiectelor de tip Frame (chenar sau cadru) ce alcatuiesc la randul lor o ierarhie. 7. SELECTAREA DATELOR DIN BAZA DE DATE7.1 COMANDA SELECTPentru a selecta datele din una sau mai multe tabele se utilizeaza comanda SELECT a carei sintaxa este:

SELECT [ALL | DISTINCT] {[nume-tabela. ]* |

expr [sinonim], expr [sinonim], }

FROM nume-tabela [@ legatura][sinonim], nume-tabela [@ legatura][sinonim], [WHERE conditie]

[ CONNECT BY conditie [START WITH conditie] ]

[ GROUP BY { expr, expr.. | CUBE ( expr, expr.. ) | ROLLUP ( expr, expr ) } ] [HAVING conditie]

[ {UNION | INTERSECT | MINUS} SELECT]

[ ORDER BY {expr | numar-pozitie} [ASC | DESC] {expr | numar-pozitie}[ASC | DESC],

[ FOR UPDATE OF nume-col, nume-col, [NOWAIT] ];

Clauzele comenzii trebuie utilizate in ordinea specificata in sintaxa, exceptie facand clauzele CONNECT BY, START WITH, GROUP BY si HAVING (care pot fi specificate in orice ordine). Clauzele ORDER BY si FOR UPDATE OF pot fi schimbate intre ele. Clauza ALL determina afisarea tuturor randurilor rezultate in urma cererii, spre deosebire de clauza DISTINCT care determina eliminarea duplicatelor, afisind doar randurile distincte. Utilizarea caracterului asterisc (*) are ca efect selectarea tuturor coloanelor din tabela specificata prin clauza FROM, in ordinea in care au fost definite la creare. In situatia finala, fiecare expresie formulata in comanda devine un nume de coloana. Totodata, orice sinonim, daca este specificat, este folosit in scopul etichetarii expresiei precedente din tabela afisata. Daca sinonimul contine blancuri sau caractere speciale cum sunt + si -, trebuie incluse intre apostrofuri. Pentru a evita ambiguitatea, in cazul in care tabelele contin coloane cu acelasi nume, este necesara calificarea coloanelor cu numele tabelei. Identificarea tabelelor in care trebuie cautate datele corespunza-toare coloanelor specificati se face prin specificarea numelor lor dupa clauza FROM. In locul numelor de tabele se pot folosi sinonimele aces-tora. Clauza WHERE specifica o conditie care este folosita pentru a selecta randurile. Clauza CONNECT BY indica faptul ca randurile formeaza o structura arborescenta. Prin aceasta clauza sunt definite relatiile necesare pentru a conecta randurile tabelei intr-un arbore. Operatorul PRIOR folosit inaintea uneia din cele doua parti ale conditiei, defineste nodul parinte iar in cealalta parte nodul fiu. Clauza START WITH, prin specificarea unei conditii care trebuie satisfacuta, stabileste randul folosit ca radacina a arborelui. Daca se omite, comanda SELECT va returna o serie de arbori incepand cu fiecare rand selectat. Existenta clauzei CONNECT BY intr-o comanda SELECT permite utilizarea pseudocoloanei LEVEL, care returneaza valoarea 1 pentru nodul radacina, 2 pentru fiii nodului radacina, 3 pentru nepoti etc. Clauzele GROUP BY si HAVING determina afisarea unor informatii sintetice despre grupuri de randuri care au aceeasi valoare in una sau mai multe coloane. Aceste coloane sunt, in general, functii de grup. ROLLUP activeaza o comanda SELECT pentru a calcula mai multe niveluri de subtotaluri dintr-un grup specificat de dimensiuni. Calculeaza de asemenea si un total general. ROLLUP este o extensie simpla a clauzei GROUP BY, deci sintaxa este foarte usor de folosit. Extensia ROLLUP este foarte eficienta si nu ingreuneaza o cerere. Rolul extensiei ROLLUP este foare clar: creaza subtotaluri care pornesc de la cel mai detaliat nivel pana la un total general dupa gruparea care a fost precizata in clauza ROLLUP. CUBE actioneaza asupra unui grup specificat de coloane si creaza subtotaluri pentru toate combinatiile posibile intre acestea. Daca s-a specificat de exemplu: CUBE (timp, regiune, department), rezultatul va include toate valorile care ar fi incluse intr-un ROLLUP plus combinatii aditionale. Pentru a combina rezultatele a doua comenzi SELECT intr-un singur rezultat, se folosesc operatorii UNION, INTERSECT si MINUS. UNION returneaza rezultatele obtinute de la fiecare cerere in parte, INTERSECT returneaza doar rezultatele comune celor doua cereri iar MINUS returneaza rezultatele obtinute de la prima cerere si care nu apar in urma celei de a doua selectii. Pentru a putea folosi aceste clauze este necesar ca numarul si tipul coloanelor selectate de fiecare comanda SELECT sa fie aceleasi, lungimile lor putand fi diferite. Daca sunt combinate mai mult de doua comenzi SELECT, ele vor fi evaluate de la stinga la dreapta. Pentru a schimba ordinea de evaluare pot fi folosite parantezele. Totodata, cei trei operatori impun utilizarea cuvantului DISTINCT in toate comenzile SELECT. Clauza ORDER BY specifica ordinea in care trebuie returnate randurile distincte ale unei tabele. Clauza FOR UPDATE determina blocarea randurilor selectate ale tabelei astfel incat acestea nu vor mai putea fi actualizate de alti utilizatori pana la deblocarea lor cu una din comenzile COMMIT sau ROLL BACK. Comanda SELECT... FOR UPDATE trebuie urmata de una sau mai multe comenzi UPDATE... WHERE. Daca se foloseste clauza NOWAIT, selectia este considerata terminata chiar daca randurile selectate de FOR UPDATE nu pot fi blocate deoarece alt utilizator lucreaza cu ele. 7.2 UTILIZAREA CLAUZEI FROMPentru a selecta una sau mai multe tabele si pentru a specifica, eventual, identificatorul proprietarului si legatura cu reteaua se foloseste secventa:SELECT... FROM [ident-proprietar] tabela [@LINK],... ;

Exemple:

a) Sa se selecteze toate coloanele din tabela employees: Select * from hr.employees _;

sau

Select * from employees _;

sau

Select all from employees _;

b) Sa se selecteze coloanele EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, SALARY :

EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,SALARY

select * from employeesorder by first_name;Sa se selecteze din tabela employees toate inregistrarile ordonate dupa numele angajatului care au salariul mai mare egal ca 5000. where salary >=5000order by first_name;7.6 UTILIZAREA CLAUZEI GROUP BY - functii de grupare

Rezultatele obtinute in urma selectarilor pot fi grupate cu ajutorul clauzei GROUP BY. Secventa utilizata pentru aceasta operatie este:

SELECT

GROUP BY tabela. coloana1, tabela. coloana2, HAVING conditie

;

Prin parcurgerea secventei se obtine cate un rand pentru inregistrarile care au aceleasi valori in coloanele specificate in clauza GROUP BY. Prezenta clauzei HAVING determina obtinerea acelor grupuri care indeplinesc conditiile specificate. Este de retinut faptul ca GROUP BY si HAVING trebuie sa fie declarate dupa clauzele WHERE, CONNECT BY si START WITH, in cazul cind acestea exista in comanda.

Exemplu:

Sa se selecteze cea mai mica data de angajare, grupat dupa employee_id, first_name, last_name.

SELECT MIN(hire_date)

FROM employees GROUP BY employee_id, first_name, last_name7.7 SELECTAREA DATELOR DIN MAI MULTE TABELEOperatia prin care se selecteaza si se grupeaza coloanele din tabele diferite, in scopul obtinerii unor informatii coerente, poarta numele de jonctiune (JOIN). Pentru a realiza o jonctiune si pentru a preciza corespondenta intre randurile tabelelor, se utilizeaza urmatoarea secventa:

SELECT... FROM nume-tab1, nume-tab2,... WHERE conditie ;

unde:

conditie reprezinta orice expresie care compara campurile diferitelor tabele. Folosirea aliasului pentru tabele.

select a.EMPLOYEE_ID

from employees a

sau fara alias

select employees.EMPLOYEE_ID

from employees

Sa se afiseze id-ul angajatului , numele si prenumele avand tabele cu alias a.

select a.EMPLOYEE_ID,

a.FIRST_NAME || a.LAST_NAME ,a.SALARY

from employees a

Vor fi selectate randurile pentru care conditia este indeplinita. In conditie poate fi folosit operatorul (+) care simuleaza existenta unor randuri vide in tabelele pentru care nu se gasesc corespondente. Exemplu:

Sa se selecteze numele prenumele si denumirea departamentului in care lucreaza angajatii. select a.first_name, a.last_name, d.department_namefrom employees a, departments dwhere a.department_id=d.department_idSa se selecteze numele prenumele si denumirea departamentului in care lucreaza angajatii si au salariul mai mare ca 4000. select a.first_name, a.last_name, d.department_namefrom employees a, departments dwhere a.department_id=d.department_idand salary >4000

Sa se selecteze numele prenumele si denumirea departamentului in care lucreaza angajatii si au salariul mai mare ca 4000. select a.first_name, a.last_name, d.department_namefrom employees a, departments dwhere a.department_id=d.department_idand salary >4000Sa se selecteze numele, prenumele si denumirea tarii pentru fiecare angajat:select a.first_name, a.last_name, r.country_name from employees a, departments d, locations l, countries r where a.department_id = d.department_id and d.location_id = l.location_id and l.country_id = r.country_id7.8 REALIZAREA CERERILOR INCLUSESubcererile reprezinta cereri incluse in clauzele unor comenzi SQL. Randurile selectate de o subcerere nu sunt afisate, ele fiind utilizate in continuare de o comanda SQL. Daca subcererea este folosita in partea dreapta a unei expresii logice sau a unei expresii de atribuire, ea va returna o singura valoare sau o coloana de valori. Compunerea valorii rezultate cu cea din stanga expresiei se face in conformitate cu operatorul care face legatura intre cele doua parti. In cazul in care subcererea este folosita pentru a specifica valori in comenzi ca INSERT, CREATE TABLE, UPDATE, ea va returna cate o valoare pentru fiecare coloana specificata in comanda. Clauze ca ORDER BY, FOR nu pot fi folosite in subcereri. Subcererile apar, in general, in urmatoarele comenzi:

COPY [FROM nume-utilizator/parola@baza-de-date] [TO nume-utilizator/parola@baza-de-date] {APPEND | CREATE | INSERT | REPLACE} Tabela (col1, col2, ) USING cerere;;

CREATE TABLE tabela

AS cerere ;

INSERT INTO tabela | [(col1, col2, )]

[VALUES (val1, val2,... ) | cerere];

UPDATE tabela [sinonim]

SET (col1, col2, ) = (cerere) [WHERE conditie];

Exista si subcereri corelate cu cererile din comanda principala, care apar doar in clauza WHERE a comenzii SELECT. Ele pot utiliza sinonime pentru tabela precizata in comanda SELECT si sunt evaluate cate o data pentru fiecare rand selectat in comanda principala. Subcererile corelate pot apare in formule ca:

1). SELECT

coloana1, coloana2,... FROM tabela1, tabela2 tab2,... WHERE coloana1 IN

(SELECT coloana1

FROM tabela1

WHERE conditie)

2) SELECT

coloana1, coloana2,... FROM tabela1 tab1, tabela2 tab2,... WHERE coloana2 IN

(SELECT functie (coloana)

FROM tabela2 tab2

WHERE tab2. coloana=coloana)

7.9 Functii de conversie

- de la VARCHAR2 sau CHAR la NUMBER;

- de la NUMBER la VARCHAR2 sau CHAR;

Conversiile explicite se realizeaz cu ajutorul funciilor de tipTO_{tip}

FuncieSemnificaieExemplu

TO_CHAR (expr_number_sau_date[, format][, nlsparameters])Convertete o valoare de tip numeric sau dat calendaristic, la un ir de caractere conform cu formatul specificat sau cu setrile naionale specificate (NLS - National Language Support). Daca formatul sau parametrii lipsesc se utilizeaz formatul i parametrii implicii. Formatul este case sensitive.TO_CHAR('3') = ' 3' TO_CHAR(-12) = '-12' TO_CHAR(sysdate, 'DDMMYYYY')

= ' 09122004' TO_CHAR (sysdate + 365 * 57, 'ddmmyyyy') = ' 25112061'

TO_NUMBER (expr_char[, format][, nlsparameters])Convertete o valoare de tip ir de caractere la o valoare numeric conform cu formatul specificat. Dac formatul sau parametrii lipsesc se utilizeaz formatul i parametrii implicii.TO_NUMBER ('-12.22', 'S99.99') = -12.22

TO_DATE (expr_char[, format][, nlsparameters]) Convertete o valoare de tip ir de caractere la o valoare de tip dat calendaristic n conformitate cu formatul specificat. Dac formatul sau parametrii lipsesc se utilizeaz formatul i parametrii implicii.TO_DATE ('15-feb-2004','dd-mon-yyyy')

7.10 Functii de prelucrare caractereFuncieSemnificaieExemplu

LOWER (expresie)Convertete un ir de caractere la minuscule.LOWER ('AbCdE') = 'abcde'

UPPER (expresie)Convertete un ir de caractere la majuscule.UPPER ('AbCdE') = 'ABCDE'

INITCAP (expresie)Convertete un ir de caractere la un ir care ncepe cu majuscul i continu cu minuscule.INITCAP ('AbCdE') = 'Abcde'

CONCAT (expr1, expr2)Concateneaz doua expresii de tip caracter. Echivalent cu operatorul de concatenare '||'.CONCAT ('Ab', 'CdE') = 'AbCdE'

SUBSTR (expresie, m[, n])Extrage din expresia de tip caracter, n caractere ncepnd cu poziia m. Dac lipsete argumentul n, atunci extrage toate caracterele pn la sfritul irului. Dac m este negativ numrtoarea poziiilor ncepe de la sfritul irului de caractere spre nceput.SUBSTR ('AbCdE', 2, 2) = 'bC' SUBSTR ('AbCdE', 2) = 'bCdE' SUBSTR ('AbCdE', -2) = 'dE'

LENGTH (expresie)Returneaz numrul de caractere al expresiei.LENGTH ('AbCdE') = 5

INSTR (expresie, expr1[, m][, n])Returneaz poziia la care se gsete a n-a ocurent a expresiei 'expr1' n cadrul expresiei 'expresie', cutarea ncepnd de la poziia m. Daca m sau n lipsesc, valorile implicite sunt 1 pentru ambele.INSTR (LOWER('AbC aBcDe'), 'ab', 5, 2)

= 0 INSTR (LOWER('AbCdE aBcDe'), 'ab', 5)

= 7

LPAD (expresie, n[, expr1]) sau RPAD (expresie, n[, expr1])Completeaz expresia caracter dat ca parametru (expresie), la stnga (LPAD), respectiv la dreapta (RPAD) cu caracterele specificate n expresia expr1, pn la lungimea specificat de parametrul n. Implicit, dac lipsete, expr1 este ' ' un spaiu.RPAD (LOWER('AbCdE'), 10, 'X')

= 'abcdeXXXXX' LPAD (LOWER('AbCdE'),10)

= ' abcde'

LTRIM (expresie[, expr1]) sau RTRIM (expresie[, expr1])Reversul funciilor LPAD, RPAD. Truncheaz expresia caracter la stnga sau la dreapta prin eliminarea succesiv a caracterelor din expresia expr1. Implicit, daca lipsete, expr1 este ' ' un spaiu.RTRIM ('abcdeXXXX', 'X')

= 'abcde' LTRIM (' abcde') = 'abcde'

TRIM (LEADING | TRAILING | BOTH caractere_trim FROM expresie)Permite eliminarea caracterelor specificate (caractere_trim) de la nceputul (leading) , sfritul (trailing) sau din ambele pri, dintr-o expresie caracter data.TRIM (LEADING 'X' FROM 'XXXabcdeXXX') = 'abcdeXXX' TRIM (TRAILING 'X' FROM 'XXXabcdeXXX') = 'XXXabcde' TRIM ( BOTH 'X' FROM 'XXXabcdeXXX') = 'abcde' TRIM ( BOTH FROM ' abcde ') = 'abcde'

REPLACE (expr, expr1, expr2)nlocuiete n prima expresie toate ocurentele irului expr1 cu irul expr2.REPLACE ('%1%11','%','2') = '21211' REPLACE ('%1%11','%1','23') = '23231' REPLACE ('%1%11','%') = '111'

TRANSLATE(expr, expr1, expr2)Fiecare caracter din irul de caractere expr care apare i n expr1 este transformat n caracterul corespunztor (aflat pe aceeai poziie ca i n expr1) din irul de caractere expr2.TRANSLATE('%1%11','%','2') = '21211'TRANSLATE('%1%111','%1','23')

= ' 232333'

ASCII (expresie)Returneaz codul ASCII al primului caracter din irul 'expresie'.ASCII ('curs') = ASCII ('c') = 99

CHR(expresie)ntoarce caracterul corespunztor codului ASCII specificat.CHR(99)= 'c'

7.11 Functii aritmeticeCele mai importante funcii aritmetice sunt: ABS (valoarea absolut), ROUND (rotunjire cu un numr specificat de zecimale), TRUNC (trunchiere cu un numr specificat de zecimale), EXP (ridicarea la putere a lui e), LN (logaritm natural), LOG (logaritm ntr-o baz specificat), MOD (restul mpririi a dou numere specificate), POWER (ridicarea la putere), SIGN (semnul unui numr), COS (cosinus), COSH (cosinus hiperbolic), SIN(sinus), SQRT(rdcina ptrat), TAN(tangent), funciile LEAST i GREATEST, care returneaz cea mai mic, respectiv cea mai mare valoare a unei liste de expresii etc.

FuncieSemnificaieExemplu

ROUND (expresie [, n])Returneaz valoarea rotunjit a expresiei pn la n zecimale. Daca n este negativ sunt rotunjite cifre din stnga virgulei. Valoarea implicit pentru n este 0.ROUND(1.6) = 2

ROUND(1.4) = 1ROUND (1234.56,1) = 1234.6ROUND (1230.56, -2) = 1200ROUND (1260.56, -2) = 1300

CEIL(n)Partea ntreag superioarCEIL(1.4) = 2

CEIL(1.6) = 2

CEIL(1234.56) = 1235

CEIL(-1234.56)= -1234

FLOOR (n)Partea ntreag inferioareFLOOR(1.4) = 1

FLOOR(1.6) = 1

FLOOR (1234.56) = 1234 FLOOR (-1234.56) = -1235

TRUNC (expresie[, n])Returneaz valoarea trunchiat a expresiei pn la n zecimale. Daca n este negativ sunt trunchiate cifre din stnga virgulei. Valoare implicit pentru n este 0.TRUNC (1234.56) = 1234TRUNC (123456, -2) = 123400 TRUNC (1234.56) = 1234TRUNC (1234.56,1) = 1234.5

MOD (m,n)Returneaz restul mpririi lui m la n. MOD (11, 4) = MOD (11, -4) = 3 MOD(-11, 4) = MOD (-11, -4) = -3

ABS(n)Valoarea absolutABS(-2) = 2

SQRT(n)Rdcina ptrat

EXP(n)Ridicarea la putere a lui e

LN(n)Logaritm natural

LOG (n,m)Logaritm n baz n din m

POWER(n,p)Ridicarea la putere; n la puterea p

SIGN(n)Semnul unui numr

COS, COSHCosinus, cosinus hiperbolic

SIN, SINHSinus, sinus hiperbolic

TAN, TANHTangent, tangent hiperbolic

STDDEVDeviaia standard

VARIANCEDispersia

7.12 Functii pentru prelucrarea datelor calendariticeFuncieSemnificaieExemplu

SYSDATEntoarce data i timpul curent

MONTHS_BETWEEN (date1, date2)Returneaz numrul de luni dintre data date1 i data date2. Rezultatul poate fi pozitiv sau negativ dup cum date1 este mai recent sau nu fa de date2. Zecimalele reprezint pari dintro luna!ROUND(MONTHS_BETWEEN (SYSDATE + 30, SYSDATE)) = 1

ADD_MONTHS (date, n)Adaug n luni la o data specificat. Valoarea n trebuie s fie ntreag (pozitiv sau negativ).MONTHS_BETWEEN (ADD_MONTHS(SYSDATE, 3), SYSDATE) = 3

NEXT_DAY (date, char)Returneaz data corespunztoare primei zile a sptmnii specificate (char) care urmeaz dup date. NEXT_DAY('15-dec-2004','Monday') = '20-dec-2004'NEXT_DAY ('15-dec-2004',1) = '20-dec-2004'

LAST_DAY (date)Returneaz data corespunztoare ultimei zile din luna calendaristic ce conine data specificat. LAST_DAY ('15-feb-2004') = '29-feb-2004'

ROUND (date [, format)Returneaz data calendaristic rotunjit dup formatul specificat Valoarea implicit este 'DAY'. TO_CHAR (ROUND (TO_DATE ('15-feb-2004 13:50','dd-mon-yyyy hh24:mi')), 'dd-mm-yyyy hh24:mi') = '16-02-2004 00:00'

TRUNC (date [, format)Returneaz data calendaristic trunchiat dup formatul specificat. Valoarea implicit este 'DAY'. TO_CHAR (TRUNC (TO_DATE ('15-feb-2004 13:50','dd-mon-yyyy hh24:mi')), 'dd-mm-yyyy hh24:mi') = '15-02-2004 00:00'

LEAST(d1, d2, , dn)

GREATEST(d1, d2, , dn)Dintr-o list de date calendaristice, funciile ntorc prima, respectiv ultima dat n ordine cronologic.

7.13 Functii generale FuncieSemnificaieExemplu

NVL (expr1, expr2)Returneaz expr1 dac aceasta nu este NULL, expr2 n caz contrar. Cele 2 expresii trebuie s aib acelai tip sau expr2 s permit conversia implicit la tipul expresiei expr1.NVL(NULL, 1) = 1 NVL(2, 1) = 2 NVL('c', 1) = 'c' -- face conversieNVL(1, 'c') -- eroare --nu face conversie

NVL2 (expr1, expr2, expr3)Dac expr1 este nenul atunci returneaz expr2, altfel Returneaz expr3NVL2 (NULL, 1, 2) = 2

NULLIF (expr1, expr2)Daca expr1 = expr2 atunci funcia returneaz NULL, altfel returneaz expresia expr1. Echivalent cu CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 ENDNULLIF (1, 2) = 1 NULLIF (1,1) = NULL

COALESCE (expr1, expr2, ... , exprn)Returneaz expr1 dac nu este NULL, altfel expr2, dac expr2 nu este NULL, altfel... exprn , dac expr2 nu este NULL.COALESCE (NULL, NULL, 1) = 1

UID, USERntorc ID-ul, respectiv username-ul utilizatorului ORACLE curent

VSIZE(expresie)ntoarce numrul de octei ai unei expresii de tip DATE, NUMBER sau VARCHAR2SELECT VSIZE(hire_date)

FROM employees

WHERE employee_id=104;

7.14 Functii de grup AVG (media aritmetic),

COUNT(*) (numrul de linii returnate de o cerere),

COUNT ([DISTINCT] numrul valorilor unui expresii),

SUM (suma valorilor unei expresii),

MIN (valoarea minim a unei expresii),

MAX (valoarea maxim a unei expresii),

STDDEV (deviaia standard),

VARIANCE (dispersia).Observaii: Funciile grup ignor valorile null.

Orice funcie grup ntoarce o singur valoare.

Ele ntorc valoarea null cnd sunt aplicate unei mulimi vide, cu excepia operatorului COUNT care ntoarce valoarea zero.

Spre deosebire de funciile COUNT, MIN i MAX care pot fi aplicate unor cmpuri numerice sau nenumerice, restul funciilor grup se aplic doar cmpurilor numerice.

Funciile grup pot s apar n lista de la SELECT sau n clauza HAVING.7.15 OPERATORUL ROLLUPOperatorul ROLLUP creeaz grupri prin deplasarea ntr-o singur direcie, de la dreapta la stnga, de-a lungul listei de coloane specificate n clauza GROUP BY. Apoi, se aplic funcia agregat acestor grupri. Dac sunt specificate n expresii n operatorul ROLLUP, numrul de grupri generate va fi n + 1. Liniile care se bazeaz pe valoarea primelor n expresii se numesc linii obinuite, iar celelalte se numesc linii superagregat.S se afieze codurile de galerii mai mici dect 50, iar pentru fiecare dintre acestea i pentru fiecare autor care are opere expuse n galerie, s se listeze valoarea total a lucrrilor sale. De asemenea, se cere valoarea total a operelor expuse n fiecare galerie. Rezultatul va conine i valoarea total a operelor din galeriile avnd codul mai mic dect 50, indiferent de codul autorului.

7.16 OPERATORII PENTRU MULTIMI

Operatorii de multimi combina doua sau mai multe interogari, efectuand operatii specifice multimilor: reuniune, intersectie, diferenta. Acesti operatori se mai numesc si operatori verticali deoarece combinarea celor doua interogari se face coloana cu coloana. Din acest motiv, numarul total de coloane si tipurile de date ale coloanelor coresondente din cele doua interogari trebuie sa coincida:

Exista urmatorii operatori pentru multimi:

UNION Returneaza rezultatele a doua sau mai multe interogari eliminind toate inregistrarile duplicat;

UNION ALL - Returneaza rezultatele a doua sau mai multe interogari incluzand inregistrarile duplicat;

INTERSECT - Returneaza toate inregistrarile distincte gasite in ambele interogari;

MINUS - Returneaza toate inregistrarile distincte care se gasesc in prima interogare dar nu in a doua interogare.

Exemple:

Sa se selecteze toate elementele din tabela employees unde salariul este mai mic decat 5000 dar sa se excluda si cei cu salariul 4800:

Select * from employees where salaryPentru tergerea ntregului coninut al unui tabel i eliberarea spaiului de memorie ocupat de acesta, sistemul Oracle ofer instruciunea:

Fiind o instruciune LDD, aceasta nu poate fi anulat ulterior (printr-o operaie ROLLBACK). Ea reprezint o alternativ a comenzii DELETE din limbajul de prelucrare a datelor. De remarcat c instruciunea DELETE nu elibereaz spaiul de memorie. Comanda TRUNCATE este mai rapid deoarece nu genereaz informaie ROLLBACK i nu activeaz declanatorii asociai operaiei de tergere. Dac tabelul este printele unei constrngeri de integritate referenial, el nu poate fi trunchiat. Pentru a putea fi aplicat instruciunea TRUNCATE, constrngerea trebuie s fie mai nti dezactivat.

COMMIT - folosit pentru permanentizarea modificrilor executate asupra BD (modificrile sunt nregistrate i sunt vizibile tuturor utilizatorilor);

Execuia unei comenzi COMMIT implic anumite modificri.

Comanda se refer numai la schimbrile fcute de utilizatorul care d comanda COMMIT.

Starea anterioar a datelor este pierdut definitiv.

Blocrile asupra liniilor afectate sunt eliberate; liniile pot fi folosite de ali utilizatori pentru a face schimbri n date.

10. CREARE, UTILIZARE, STEGERE VIZUALIZARITextul cererii care definete vizualizarea este salvat n DD. Nucleul Oracle determin fuzionarea cererii relative la vizualizare cu comanda de definire a vizualizrii, analizeaz rezultatul fuziunii n zona partajat i execut cererea.

Dac sunt utilizate clauzele UNION, GROUP BY i CONNECT BY, atunci Oracle nu determin fuzionarea, el va rezolva vizualizarea i apoi va aplica cererea rezultatului obinut.

Vizualizrile sunt definite pentru:

simplificarea formulrii unei cereri;

afiarea datelor ntr-o alt reprezentare dect cea a tabelelor de baz;

asigurarea confidenialitii anumitor informaii;

restricionarea acesului la date.Vizualizrile pot fi simple i complexe. O vizualizare simpl extrage date dintr-un singur tabel, nu conine funcii sau grupri de date i asupra ei pot fi efectuate operaii LMD.

Operaiile LMD asupra vizualizrilor complexe sunt restricionate de urmtoarele reguli:

- nu se poate aduga sau modifica o linie dintr-o vizualizare, dac aceasta conine coloane definite prin expresii;

Pentru a obine informaii referitoare la vizualizrile definite, se pot interoga vizualizrile USER_VIEWS i ALL_VIEWS din dicionarul datelor. Textul instruciunii SELECT care definete o vizualizare este stocat ntr-o coloan de tip LONG, numit TEXT.recupereaz definiia acesteia din USER_VIEWS;

convertete cererea ntr-o operaie echivalent asupra tabelelor de baz.CREATE[ORREPLACE][FORCE | NOFORCE] VIEW

AS

READONLY }];

- FORCE creeaz vizualizarea chiar dac tabelul de baz nu exist sau chiar dac vizualizarea face referin la obiecte care nc nu sunt create. Dei vizualizarea va fi creat, utilizatorul nu poate s o foloseasc.

Cererea este o comand SELECT care poate s conin alias pentru coloane.

- WITH READ ONLY asigur c nici o operaie LMD nu poate fi executat asupra vizualizrii.

Sa se creeze o vedere cu optiunea with check option si sa aduca toate datele dar ce au conditia ca salariul sa fie mai mare ca 5000.AS SELECT*

WHERESALARY>5000Evenimentul sau comanda declansatoare (Triggering Event). Un INSERT, UPDATE, sau DELETE pe o anume tabela (sau view, in unele

Database startup sau instance shutdown

Un user logon or logoff Actiunea trigger-ului nu este executata daca restrictia e evaluata ca FALSE sau UNKNOWN. In exemplu, restrictia e:Asadar trigger-ul nu se declanseaza decat daca numarul de piese disponibile este mai mic decat o valoare de la care se face reordonarea.Actiunea trigger-ului este procedura (bloc PL/SQL , program Java sau rutina C) ce contine comenzile SQL si codul ce trebuie executat in cazurile urmatoare: Restrictia trigger-ului este evaluata pe TRUE.

- Row Triggers si Statement Triggers

- INSTEAD OF Triggers

Exemplu:

DECLARE CURSOR c1 IS SELECT employee_id, first_name, last_name, salary FROM employees; result NUMBER; BEGIN FOR rec IN c1 LOOP result := rec.salary / 2; INSERT INTO aaa a VALUES (rec.employee_id, result); END LOOP; COMMIT; END; /11.12 PROCEDURI SI FUNCTIISintaxa comenzii pentru crearea une proceduri permite specificarea explicita a parametrilor de intrare IN si iesire OUT sau de intrare iesire IN OUT :PROCEDURE nume _procedura (par1 OUT tip [:=expr] [AUTHID DEFINER ]

AS

Var2 tip2;

BEGIN

.......

Comenzi tratare erori ...

END nume_procedura;

Procedurile fara CREATE sunt proceduri standalone si nu se memoreaza.

Sintaxa comenzii de creare a unei functii este asemanatoare cu cea procedurii dar ea returneaza o singura valoare si poate fi utilizata ca operator in expresii:FUNCTION nume _functie (par1 tip [:=expr] [AUTHID DEFINER ]

AS

Var2 tip2;

BEGIN

.......

EXCEPTION

.......

/

52CURS ORACLE SQL PL/SQL- SUPORT DE CURS

if "" = "Error! No text of specified style in document." ""