{"id":571,"date":"2025-06-21T20:05:11","date_gmt":"2025-06-21T17:05:11","guid":{"rendered":"https:\/\/eugo.ro\/?p=571"},"modified":"2025-06-27T15:15:51","modified_gmt":"2025-06-27T12:15:51","slug":"blocuri-pl-sql-2","status":"publish","type":"post","link":"https:\/\/eugo.ro\/?p=571","title":{"rendered":"Blocuri PL\/SQL"},"content":{"rendered":"<p>&nbsp;<br \/>\n<strong>Controlul execu\u0163iei unui bloc PL\/SQL<\/strong><br \/>\nPL\/SQL este un limbaj cu structur\u0103 de bloc, adic\u0103 programele sunt compuse din blocuri care pot fi complet separate sau imbricate.<br \/>\nStructura unui bloc poate fi ob\u0163inut\u0103 combin\u00e2nd subprograme, pachete, blocuri imbricate.<br \/>\nBlocurile pot fi folosite \u00een utilitarele Oracle.<br \/>\nPentru modularizarea unui program este necesar\u0103:<\/p>\n<ul>\n<li>gruparea logic\u0103 a instruc\u0163iunilor \u00een blocuri;<\/li>\n<li>imbricarea de subblocuri \u00een blocuri mai mari;<\/li>\n<li>descompunerea unei probleme complexe \u00eentr-o mul\u0163ime de module logice \u015fi implementarea<br \/>\nacestora cu ajutorul blocurilor;<\/li>\n<li>lasarea \u00een biblioteci a codului PL\/SQL reutilizabil, de unde poate fi folosit<br \/>\nde aplica\u0163ii;<\/li>\n<li>depunerea codului \u00eentr-un server Oracle, de unde este accesibil oric\u0103rei aplicatii care<br \/>\ninterac\u0163ioneaz\u0103 cu baza de date Oracle.<\/li>\n<\/ul>\n<p>Un program PL\/SQL poate cuprinde unul sau mai multe blocuri. Un bloc poate fi anonim sau neanonim.<\/p>\n<p>Blocurile anonime sunt blocuri PL\/SQL f\u0103r\u0103 nume, care sunt construite dinamic \u015fi sunt executate o singur\u0103 dat\u0103. Acest tip de bloc nu are argumente \u015fi nu returneaz\u0103 un rezultat. Ele sunt declarate \u00eentr-un punct al aplica\u0163iei, unde vor fi executate (trimise motorului PL\/SQL). \u00cen blocurile anonime pot fi declarate proceduri \u015fi func\u0163ii PL\/SQL.<\/p>\n<p>Blocurile anonime pot s\u0103 apar\u0103 \u00eentr-un program ce lucreaz\u0103 cu precompilator sau \u00een SQL*Plus.<br \/>\nDe obicei, blocurile anonime sunt plasate \u00eentr-un fi\u015fier, iar apoi fi\u015fierul este executat din SQL*Plus. De asemenea, declan\u015fatorii din componentele Developer Suite constau din astfel de blocuri.<\/p>\n<p>Blocurile neanonime sunt fie blocuri cu nume (etichetate) construite static sau dinamic \u015fi executate o singur\u0103 dat\u0103, fie subprograme, pachete sau declan\u015fatori.<br \/>\nSubprogramele sunt proceduri sau func\u0163ii depuse \u00een baza de date. Aceste blocuri sunt executate de mai multe ori \u015fi, \u00een general, nu mai sunt modificate dup\u0103 ce au fost construite. Procedurile \u015fi func\u0163iile stocate sunt depuse pe server-ul Oracle, accept\u0103 parametri \u015fi pot fi apelate prin nume. Procedurile \u015fi func\u0163iile aplica\u0163ie sunt depuse \u00eentr-o aplica\u0163ie Developer Suite sau \u00eentr-o bibliotec\u0103.<\/p>\n<p>Pachetele (stocate sau aplica\u0163ie) sunt blocuri neanonime care grupeaz\u0103 proceduri, func\u0163ii, cursoare, tipuri, constante, variabile \u00eentr-o unitate logic\u0103, \u00een baza de date.<\/p>\n<p> Declan\u015fatorii sunt blocuri PL\/SQL neanonime depuse \u00een baza de date, care pot fi asocia\u0163i bazei, iar \u00een acest caz sunt executa\u0163i implicit ori de c\u00e2te ori apare un anumit eveniment declan\u015fator (de exemplu, instruc\u0163iuni INSERT, UPDATE sau DELETE ce se execut\u0103 asupra unui tabel al bazei de date) sau pot fi asocia\u0163i uneiaplica\u0163ii (de exemplu, declan\u015fator SQL*Forms), ceea ce presupune c\u0103 se execut\u0103 automat, \u00een func\u0163ie de anumite condi\u0163ii sistem. <\/p>\n<p><b> Structura unui bloc PL\/SQL <\/b><\/p>\n<p> Un bloc PL\/SQL este compus din trei sec\u0163iuni distincte. <\/p>\n<ul>\n<li> Sec\u0163iunea declarativ\u0103 (op\u0163ional\u0103) con\u0163ine declara\u0163ii pentru toate variabilele, constantele, cursoarele \u015fi erorile definite de utilizator la care se face referin\u0163\u0103 \u00een sec\u0163iunea executabil\u0103 sau chiar \u00een cea declarativ\u0103. De asemenea, pot fi declarate subprograme locale care sunt vizibile doar \u00een blocul respectiv. <\/li>\n<li> Sec\u0163iunea executabil\u0103 con\u0163ine instruc\u0163iuni neprocedurale SQL pentru prelucrarea datelor din baza de date \u015fi instruc\u0163iuni PL\/SQL pentru prelucrarea datelor \u00een cadrul blocului. <\/li>\n<li> Sec\u0163iunea pentru tratarea erorilor (op\u0163ional\u0103) specific\u0103 ac\u0163iunile ce vor fi efectuate atunci c\u00e2nd \u00een execu\u0163ia blocului apar erori sau condi\u0163ii efectuate atunci c\u00e2nd \u00een execu\u0163ia blocului apar erori sau condi\u0163ii anormale. <\/li>\n<\/ul>\n<p>Blocul PL\/SQL are urm\u0103toarea structur\u0103 general\u0103:<\/p>\n<p><code><br \/>\n[bloc_name]<br \/>\n[<b>DECLARE<\/b><br \/>\ndeclaration instructions]<br \/>\n<b>BEGIN<\/b><br \/>\nexecutable statements(SQL sau PL\/SQL)<br \/>\n[<b>EXCEPTION<\/b><br \/>\nerror handling]<br \/>\n<b>END<\/b> [bloc_name];<br \/>\n<\/code><\/p>\n<p> Dac\u0103 blocul PL\/SQL este executat f\u0103r\u0103 erori, va ap\u0103rea mesajul: <\/p>\n<p><em>PL\/SQL procedure successfully completed<\/em><\/p>\n<p><b>Example (SELECT with INTO clause)<\/b><\/p>\n<p> Sa cream un bloc anonim \u00een care se declar\u0103 o variabil\u0103 <strong><em>v_job<\/em><\/strong> de tip<br \/>\n<strong><em>job_title (%TYPE)<\/em><\/strong> a c\u0103rei valoare va fi titlul jobului salariatului av\u00e2nd codul 200.<\/p>\n<p><code><br \/>\nSQL> SET SERVEROUTPUT ON<br \/>\nSQL> DECLARE<br \/>\n2 v_job jobs.job_title%TYPE;<br \/>\n3 BEGIN<br \/>\n4 SELECT job_title<br \/>\n5 INTO v_job<br \/>\n6 FROM employees e, jobs j<br \/>\n7 WHERE e.job_id=j.job_id<br \/>\n8 AND employee_id=200;<br \/>\n9 DBMS_OUTPUT.PUT_LINE('the job is '|| v_job);<br \/>\n10 END;<br \/>\n11 \/<br \/>\nthe job is Administration Assistant<br \/>\nPL\/SQL procedure successfully completed.<br \/>\n<\/code><\/p>\n<p><strong>Varianta 2<\/strong><\/p>\n<p> In exemplus de mai sus utilizam variabile de leg\u0103tur\u0103. S\u0103 se afi\u015feze rezultatul atat din bloc, c\u00e2t \u015fi din exteriorul acestuia.  <\/p>\n<p><code><br \/>\nSQL> VARIABLE result VARCHAR2(35)<br \/>\nSQL> BEGIN<br \/>\n2 SELECT job_title<br \/>\n3 INTO :result<br \/>\n4 FROM employees e, jobs j<br \/>\n5 WHERE e.job_id=j.job_id AND employee_id=200;<br \/>\n6 DBMS_OUTPUT.PUT_LINE('the result is '|| :result);<br \/>\n7 END;<br \/>\n8 \/<br \/>\nthe result is Administration Assistant<br \/>\nPL\/SQL procedure successfully completed.<br \/>\nSQL> PRINT RESULT<br \/>\nRESULT<br \/>\n------------------------------<br \/>\nAdministration Assistant<br \/>\n<\/code><\/p>\n<p><strong>Compatibilitate SQL<\/strong><\/p>\n<p>Din punct de vedere al compatibilit\u0103\u0163ii dintre PL\/SQL \u015fi SQL, se remarc\u0103 urm\u0103toarele reguli de baz\u0103:<\/p>\n<ul>\n<li>PL\/SQL furnizeaz\u0103 toate comenzile LMD ale lui SQL, comanda SELECT cu clauza INTO, comenzile LCD, func\u0163iile, pseudocoloanele \u015fi operatorii SQL;<\/li>\n<li>PL\/SQL nu furnizeaz\u0103 comenzile LDD.<\/li>\n<\/ul>\n<p>Totu\u015fi, \u00een ultimele sale versiuni, Oracle permite folosirea dinamic\u0103 a comenzilor SQL, utiliz\u00e2nd tehnica oferit\u0103 de SQL dinamic. \u00cen felul acesta, orice comand\u0103 SQL (inclusiv comand\u0103 LDD) poate s\u0103 fie utilizat\u0103 \u00een PL\/SQL.<\/p>\n<p>Majoritatea func\u0163iilor SQL sunt disponibile \u00een PL\/SQL. Exist\u0103 \u00eens\u0103 func\u0163ii specifice PL\/SQL, cum sunt func\u0163iile SQLCODE \u015fi SQLERRM. De asemenea,exist\u0103 func\u0163ii SQL care nu sunt disponibile \u00een instruc\u0163iuni procedurale (DECODE,func\u0163iile grup), dar care sunt disponibile \u00een instruc\u0163iunile SQL dintr-un bloc PL\/SQL. SQL nu poate folosi func\u0163ii sau atribute specifice PL\/SQL.<\/p>\n<p>Func\u0163iile grup trebuie folosite cu aten\u0163ie, deoarece clauza GROUP BY nu are sens s\u0103 apar\u0103 \u00een instruc\u0163iunea SELECT \u2026 INTO. Oracle9i introduce clauza OVER,care permite ca func\u0163ia grup c\u0103reia \u00eei este asociat\u0103 s\u0103 fie considerat\u0103 o func\u0163ie analitic\u0103 (poate returna mai multe linii pentru fiecare grup).<\/p>\n<p>Urm\u0103toarele func\u0163ii SQL nu sunt permise \u00een PL\/SQL: WIDTH_BUCKET,BIN_TO_NUM, COMPOSE, DECOMPOSE, TO_LOB, DECODE, DUMP,EXISTSNODE, TREAT, NULLIF, SYS_CONNECT_BY_PATH, SYS_DBURIGEN,EXTRACT.<\/p>\n<p><strong>Instruc\u0163iuni PL\/SQL<\/strong><\/p>\n<p>Orice program poate fi scris utiliz\u00e2nd structuri de control de baz\u0103 care sunt combinate \u00een diferite moduri pentru rezolvarea problemei propuse. PL\/SQL dispune de comenzi ce permit controlul execu\u0163iei unui bloc. Instruc\u0163iunile limbajului pot fi: iterative (LOOP, WHILE, FOR), de atribuire (:=), condi\u0163ionale (IF, CASE), de salt (GOTO, EXIT) \u015fi instruc\u0163iunea vid\u0103 (NULL).<\/p>\n<p><strong>Observa\u0163ii:<\/strong><\/p>\n<ul>\n<li> Comentariile sunt ignorate de compilatorul PL\/SQL. Exist\u0103 comentarii pe o singur\u0103 linie, prefixate de simbolurile \u201e&#8211;\u201c, care \u00eencep \u00een orice punct al liniei \u015fi se termin\u0103 la sf\u00e2r\u015fitul acesteia. De asemenea, exist\u0103 comentarii pe mai multe linii, care sunt delimitate de simbolurile \u201e\/*\u201c \u015fi \u201e*\/\u201c. Nu se admit comentarii imbricate. <\/li>\n<li>Caracterul \u201e;\u201c este separator pentru instruc\u0163iuni. <\/li>\n<li> Atat operatorii din PL\/SQL, c\u00e2t \u015fi ordinea de execu\u0163ie a acestora, sunt identici cu cei din SQL. \u00cen PL\/SQL este introdus un nou operator (\u201e**\u201c) pentru ridicare la putere.<\/li>\n<li>Un identificator este vizibil \u00een blocul \u00een care este declarat \u015fi \u00een toate subblocurile, procedurile \u015fi func\u0163iile imbricate \u00een acesta. Dac\u0103 blocul nu g\u0103se\u015fte identificatorul declarat local, atunci \u00eel caut\u0103 \u00een sec\u0163iunea declarativ\u0103 a blocurilor care includ blocul respectiv \u015fi niciodat\u0103 nu caut\u0103 \u00een blocurile \u00eencuib\u0103rite \u00een acesta.  <\/li>\n<li>Comenzile SQL*Plus nu pot s\u0103 apar\u0103 \u00eentr-un bloc PL\/SQL.  <\/li>\n<li>\u00cen comanda SELECT trebuie specificate variabilele care recupereaz\u0103 rezultatul ac\u0163iunii acestei comenzi. \u00cen clauza INTO, care este obligatorie,pot fi folosite variabile PL\/SQL sau variabile de leg\u0103tur\u0103.<\/li>\n<li>Referirea la o variabil\u0103 de leg\u0103tur\u0103 se face prin prefixarea acesteia cu simbolul \u201e:\u201c. <\/li>\n<li>Cererea dintr-o comand\u0103 SELECT trebuie s\u0103 returneze o singur\u0103 linie drept rezultat. Atunci c\u00e2nd comanda SELECT \u00eentoarce mai multe linii, apare eroarea TOO_MANY_ROWS, iar \u00een cazul \u00een care comanda nu g\u0103se\u015fte date se genereaz\u0103 eroarea NO_DATA_FOUND.  <\/li>\n<li>Un bloc PL\/SQL nu este o unitate tranzac\u0163ional\u0103. \u00centr-un bloc pot fi mai multe tranzac\u0163ii sau blocul poate face parte dintr-o tranzac\u0163ie. Ac\u0163iunile COMMIT, SAVEPOINT \u015fi ROLLBACK sunt independente de blocuri, dar instruc\u0163iunile asociate acestor ac\u0163iuni pot fi folosite \u00eentr-un bloc.<\/li>\n<li>PL\/SQL nu suport\u0103 comenzile GRANT \u015fi REVOKE, utilizarea lor fiind posibil\u0103 doar prin SQL dinamic. <\/li>\n<\/ul>\n<p>Fluxul secven\u0163ial de execu\u0163ie a comenzilor unui program PL\/SQL poate fi modificat cu ajutorul structurilor de control: IF, CASE, LOOP, FOR, WHILE, GOTO, EXIT. <\/p>\n<p><b>Instruc\u0163iunea de atribuire<\/b> <\/p>\n<p>Instruc\u0163iunea de atribuire se realizeaz\u0103 cu ajutorul operatorului de asignare (:=) \u015fi are forma general\u0103 clasic\u0103 (variabila := expresie). Comanda respect\u0103 propriet\u0103\u0163ile instruc\u0163iunii de atribuire din clasa LG3. De remarcat c\u0103 nu poate fi asignat\u0103 valoarea null unei variabile care a fost declarat\u0103 NOT NULL. <\/p>\n<p><b>Exemplu <\/b><\/p>\n<p>Urm\u0103torul exemplu prezint\u0103 modul \u00een care ac\u0163ioneaz\u0103 instruc\u0163iunea de atribuire \u00een cazul unor tipuri de date particulare.<\/p>\n<p><code><br \/>\nDECLARE<br \/>\nalfa INTERVAL YEAR TO MONTH;<br \/>\nBEGIN<br \/>\nalfa := INTERVAL '200-7' YEAR TO MONTH;<br \/>\nDBMS_OUTPUT.PUT_LINE(alfa);<br \/>\n-- alpha takes the value 200 years and 7 months<br \/>\nalfa := INTERVAL '200' YEAR;<br \/>\n-- only years can be specified<br \/>\nalfa := INTERVAL '7' MONTH;<br \/>\n-- only months can be specified<br \/>\nalfa := '200-7';<br \/>\n-- implicit conversion from character<br \/>\nEND;<\/p>\n<p>SQL> declare<br \/>\n2 alfa interval year to month;<br \/>\n3 begin<br \/>\n4 alfa :=interval '1 - 7' year to month;<br \/>\n5 DBMS_OUTPUT.PUT_LINE('alfa = '|| alfa);<br \/>\n6 end;<br \/>\n7 \/<br \/>\nalfa = +01-07<br \/>\nPL\/SQL procedure successfully completed.<\/p>\n<p>SQL> declare<br \/>\n2 alfa interval year to month;<br \/>\n3 begin<br \/>\n4 alfa :=interval '7' month;<br \/>\n5 DBMS_OUTPUT.PUT_LINE('alfa = '|| alfa);<br \/>\n6 end;<br \/>\n7 \/<br \/>\nalfa = +00-07<br \/>\nPL\/SQL procedure successfully completed.<\/p>\n<p>SQL> declare<br \/>\n2 alfa interval year to month;<br \/>\n3 begin<br \/>\n4 alfa := '10 - 8';<br \/>\n5 DBMS_OUTPUT.PUT_LINE('alfa = '|| alfa);<br \/>\n6 end;<br \/>\n7 \/<br \/>\nalfa = +10-08<br \/>\nPL\/SQL procedure successfully completed.<\/p>\n<p>DECLARE<br \/>\nbeta opera%ROWTYPE;<br \/>\ngama opera%ROWTYPE;<br \/>\ncursor epsilon IS SELECT * FROM opera;<br \/>\ndelta epsilon%ROWTYPE;<br \/>\nBEGIN<br \/>\nbeta := gama; -- correct<br \/>\ngama := delta; -- incorrect???-test it!<br \/>\nEND;<br \/>\n<\/code><\/p>\n<p><b><em>Instruc\u0163iunea IF<\/em> <\/b><\/p>\n<p>Un program PL\/SQL poate executa diferite por\u0163iuni de cod, \u00een func\u0163ie de rezultatul unui test. Instruc\u0163iunile care realizeaz\u0103 acest lucru sunt cele condi\u0163ionale (IF, CASE).<\/p>\n<p>Structura instruc\u0163iunii IF \u00een PL\/SQL este similar\u0103 instruc\u0163iunii IF din alte limbaje procedurale, permi\u0163\u00e2nd efectuarea unor ac\u0163iuni \u00een mod selectiv, \u00een func\u0163ie de anumite condi\u0163ii. Instruc\u0163iunea IF-THEN-ELSIF are urm\u0103toarea form\u0103 sintactic\u0103:<\/p>\n<p><code><br \/>\n<strong>IF<\/strong> condition1 <strong>THEN<\/strong><br \/>\nsequence_of_commands_1<br \/>\n[<strong>ELSIF<\/strong> condition2 <strong>THEN<\/strong><br \/>\nsequence_of_commands_2]<br \/>\n\u2026<br \/>\n[<strong>ELSE<\/strong><br \/>\nsequence_of_commands_n]<br \/>\n<strong>END IF<\/strong>;<br \/>\n<\/code><\/p>\n<p>O secven\u0163\u0103 de comenzi din IF este executat\u0103 numai \u00een cazul \u00een care condi\u0163ia asociat\u0103 este TRUE. Atunci c\u00e2nd condi\u0163ia este FALSE sau NULL, secven\u0163a nu este executat\u0103. Dac\u0103 pe ramura THEN se dore\u015fte verificarea unei alternative, se folose\u015fte ramura ELSIF (aten\u0163ie, nu ELSEIF) cu o nou\u0103 condi\u0163ie. Este permis un num\u0103r arbitrar de op\u0163iuni ELSIF, dar poate ap\u0103rea cel mult o clauz\u0103 ELSE. Aceasta se refer\u0103 la ultimul ELSIF.<\/p>\n<p><b>Exemplu<\/b><\/p>\n<p>S\u0103 se specifice dac\u0103 o galerie este mare, medie sau mica dup\u0103 cum num\u0103rul operelor de art\u0103 expuse \u00een galeria respectiv\u0103 este mai mare dec\u00e2t 200, cuprins \u00eentre 100 \u015fi 200 sau mai mic dec\u00e2t 100. <\/p>\n<p><code><br \/>\nDEFINE p_cod_gal = 753<br \/>\nDECLARE<br \/>\nv_cod_galerie opera.cod_galerie%TYPE := &p_cod_gal;<br \/>\nv_numar<br \/>\nNUMBER(3) := 0;<br \/>\nv_comentariu VARCHAR2(10);<br \/>\nBEGIN<br \/>\nSELECT COUNT(*)<br \/>\nINTO v_numar<br \/>\nFROM opera<br \/>\nWHERE cod_galerie = v_cod_galerie;<br \/>\nIF v_numar < 100 THEN\nv_comentariu := 'mica';\n<\/br>ELSIF v_numar BETWEEN 100 AND 200 THEN v_comentariu := 'medie';<br \/>\n<\/br> ELSE<br \/>\nv_comentariu := 'mare';<br \/>\n<\/br> END IF;<br \/>\nDBMS_OUTPUT.PUT_LINE('Galeria avand codul '||<br \/>\nv_cod_galerie ||' este de tip '|| v_comentariu);<br \/>\nEND;<br \/>\n<\/code><\/p>\n<p><b>Exemplu<\/b><\/p>\n<p>S\u0103 se specifice dac\u0103 un angajat are salariu mare, mediu sau mic dup\u0103 cum este mai mare dec\u00e2t 20000, cuprins \u00eentre 10000 \u015fi 20000 sau mai mic dec\u00e2t 10000.<\/p>\n<p><code><br \/>\nSQL> DEFINE p_cod_em = 201<br \/>\nSQL> DECLARE<br \/>\nv_cod_ang EMPLOYEES. EMPLOYEE_ID%TYPE := &p_cod_em;<br \/>\n v_sal EMPLOYEES.salary%type;<br \/>\n v_comentariu VARCHAR2(10);<br \/>\n BEGIN<br \/>\n SELECT salary<br \/>\n INTO v_sal<br \/>\n FROM EMPLOYEES<br \/>\n WHERE EMPLOYEE_ID = v_cod_ang;<br \/>\n  IF v_sal < 10000 THEN v_comentariu := 'mic';\n   <\/br> ELSIF v_sal BETWEEN 10000 AND 20000 THEN  v_comentariu := 'mediu';<br \/>\n   <\/br> ELSE<br \/>\n     v_comentariu:= 'mare';<br \/>\n   <\/br> END IF;<br \/>\n DBMS_OUTPUT.PUT_LINE('salariatul avand codul '|| v_cod_ang ||' are salariu '|| v_sal || ' considerat '|| v_comentariu);<br \/>\nEND;<br \/>\nold 2: v_cod_ang EMPLOYEES. EMPLOYEE_ID%TYPE := &p_cod_em;<br \/>\nnew 2: v_cod_ang EMPLOYEES. EMPLOYEE_ID%TYPE := 201;<br \/>\nsalariatul avand codul 201 are salariu 13000 considerat mediu<br \/>\nPL\/SQL procedure successfully completed.<br \/>\n<\/code><\/p>\n<p><b>Instruc\u0163iunea CASE<\/b><\/p>\n<p>Oracle9i furnizeaz\u0103 o nou\u0103 comand\u0103 (CASE) care permite implementarea<br \/>\nunor condi\u0163ii multiple. Instruc\u0163iunea are urm\u0103toarea form\u0103 sintactic\u0103:<\/p>\n<p><code><br \/>\n[label]<br \/>\nCASE test_var<br \/>\nWHEN value_1 THEN command_sequence_1;<br \/>\nWHEN value_2 THEN command_sequence_2;<br \/>\n\u2026<br \/>\nWHEN value_k THEN command_sequence_k;<br \/>\n[ELSE other sequence;]<br \/>\nEND CASE [label];<br \/>\n<\/code><\/p>\n<p>Se va executa secven\u0163a_de_comenzi_p, dac\u0103 valoarea selectorului test_vareste valoare_p. Dup\u0103 ce este executat\u0103 secven\u0163a de comenzi, controlul va trece la urm\u0103toarea instruc\u0163iune dup\u0103 CASE. Selectorul test_var poate fi o variabil\u0103 sau o expresie complex\u0103 care poate con\u0163ine chiar \u015fi apeluri de func\u0163ii.<\/p>\n<p>Clauza ELSE este op\u0163ional\u0103. Dac\u0103 aceast\u0103 clauz\u0103 este necesar\u0103 \u00een implementarea unei probleme, dar totu\u015fi lipse\u015fte, iar test_var nu ia nici una dintre valorile ce apar \u00een clauzele WHEN, atunci se declan\u015feaz\u0103 eroarea predefinit\u0103 CASE_NOT_FOUND (ORA &#8211; 06592). <\/p>\n<p>Comanda CASE poate fi etichetat\u0103 \u015fi, \u00een acest caz, eticheta poate s\u0103 apar\u0103 la sf\u00e2r\u015fitul clauzei END CASE. De remarcat c\u0103 eticheta dup\u0103 END CASE este permis\u0103 numai \u00een cazul \u00een care comanda CASE este etichetat\u0103.<\/p>\n<p>Selectorul test_var poate s\u0103 lipseasc\u0103 din structura comenzii CASE, care \u00een acest caz va avea urm\u0103toarea form\u0103 sintactic\u0103:  <\/p>\n<p><code><br \/>\n[label]<br \/>\nCASE<br \/>\nWHEN condition_1 THEN command sequence_1;<br \/>\nWHEN condition_2 THEN command sequence_2;<br \/>\n\u2026<br \/>\nWHEN condition_k THEN command sequence_k;<br \/>\n[ELSE other sequence;]<br \/>\nEND CASE [label];<br \/>\n<\/code><\/p>\n<p>Fiecare clauz\u0103 WHEN con\u0163ine o expresie boolean\u0103. Dac\u0103 valoarea lui condi\u0163ie_p este TRUE, atunci este executat\u0103 secven\u0163a_de_comenzi_p.<\/p>\n<p><strong>Example:<\/strong><\/p>\n<p>In func\u0163ie de o valoare introdus\u0103 de utilizator, care reprezint\u0103 abrevierea zilelor unei s\u0103pt\u0103m\u00e2ni, s\u0103 se afi\u015feze (\u00een cele dou\u0103 variante) un mesaj prin care este specificat\u0103 ziua s\u0103pt\u0103m\u00e2nii corespunz\u0103toare abrevierii respective.<\/p>\n<p\/>\n<p><strong>Varianta 1<\/strong><br \/>\n<code><br \/>\nSET SERVEROUTPUT ON<br \/>\nDEFINE p_day = x<br \/>\nDECLARE<br \/>\nv_day CHAR(2) := UPPER('&p_day');<br \/>\nBEGIN<br \/>\nCASE v_day<br \/>\nWHEN 'L' THEN DBMS_OUTPUT.PUT_LINE(' Today is Monday');<br \/>\nWHEN 'M' THEN DBMS_OUTPUT.PUT_LINE(' Today is Tuesday');<br \/>\nWHEN 'MI' THEN DBMS_OUTPUT.PUT_LINE(' Today is Wednesday');<br \/>\nWHEN 'J' THEN DBMS_OUTPUT.PUT_LINE(' Today is Thursday');<br \/>\nWHEN 'V' THEN DBMS_OUTPUT.PUT_LINE(' Today is Friday');<br \/>\nWHEN 'S' THEN DBMS_OUTPUT.PUT_LINE(' Today is Saturday');<br \/>\nWHEN 'D' THEN DBMS_OUTPUT.PUT_LINE(' Today is Sunday');<br \/>\nELSE DBMS_OUTPUT.PUT_LINE('is an error!');<br \/>\nEND CASE;<br \/>\nEND;<br \/>\n\/<br \/>\nSET SERVEROUTPUT OFF<br \/>\n<\/code><\/p>\n<p> <em>to be continued&#8230;<\/em> <\/p>\n<p><!-- Start of StatCounter Code --><br \/>\n  <script type=\"text\/javascript\">\nvar sc_project=5241295; \nvar sc_invisible=1; \nvar sc_security=\"f184e0a9\"; \n    <\/script><br \/>\n  <script type=\"text\/javascript\"\nsrc=\"http:\/\/www.statcounter.com\/counter\/counter.js\"><\/script><br \/>\n  <noscript><br \/>\n  <\/noscript>\n<\/div>\n<p><noscript><\/p>\n<div\nclass=\"statcounter\"><\/p>\n<div align=\"center\"><a title=\"weebly reliable statistics\"\nhref=\"http:\/\/www.statcounter.com\/weebly\/\"\ntarget=\"_blank\"><img class=\"statcounter\"\nsrc=\"http:\/\/c.statcounter.com\/5241295\/0\/f184e0a9\/1\/\"\nalt=\"weebly reliable statistics\" ><\/a><\/div>\n<\/div>\n<p><\/noscript><\/p>\n<div align=\"center\">\n    <!-- End of StatCounter Code --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Controlul execu\u0163iei unui bloc PL\/SQL PL\/SQL este un limbaj cu structur\u0103 de bloc, adic\u0103 programele sunt compuse din blocuri care pot fi complet separate sau imbricate. Structura unui bloc poate fi ob\u0163inut\u0103 combin\u00e2nd subprograme, pachete, blocuri imbricate. Blocurile pot fi folosite \u00een utilitarele Oracle. Pentru modularizarea unui program este necesar\u0103: gruparea logic\u0103 a instruc\u0163iunilor [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[],"class_list":["post-571","post","type-post","status-publish","format-standard","hentry","category-baze-de-date"],"_links":{"self":[{"href":"https:\/\/eugo.ro\/index.php?rest_route=\/wp\/v2\/posts\/571","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eugo.ro\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/eugo.ro\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/eugo.ro\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/eugo.ro\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=571"}],"version-history":[{"count":62,"href":"https:\/\/eugo.ro\/index.php?rest_route=\/wp\/v2\/posts\/571\/revisions"}],"predecessor-version":[{"id":678,"href":"https:\/\/eugo.ro\/index.php?rest_route=\/wp\/v2\/posts\/571\/revisions\/678"}],"wp:attachment":[{"href":"https:\/\/eugo.ro\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=571"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/eugo.ro\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=571"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/eugo.ro\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=571"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}