Sunteți pe pagina 1din 4

Funcţii

Exemplu de procedură care permite inserarea datelor într-o tabelă:

CREATE OR REPLACE PROCEDURE adaugare_debitor (p_coddeb NUMBER, p_dendeb


VARCHAR2) AS
BEGIN
INSERT INTO debitori (coddeb,dendeb) VALUES (p_coddeb, p_dendeb);
END adaugare_debitor;
/
EXECUTE adaugare_debitor(1200,'SC TEST SRL');

Pot fi scrise şi funcţii în locul procedurilor. Pentru aceasta, atunci când creăm o funcţie, în
secţiunea de declaraţii lista parametrilor va fi urmată de cuvântul RETURN şi de tipul valorii
rezultate:

CREATE FUNCTION <func_name>(<param_list>) RETURN <return_type> AS ...

În corpul defiirii funcţiei, "RETURN <expression>;" permite părăsirea funcţiei şi returnarea


valorii <expression>.

Pentru a vizualiza procedurile şi funcţiile existente, putem folosi următoarea interogare SQL:

select object_type, object_name


from user_objects
where object_type = 'PROCEDURE'
   or object_type = 'FUNCTION';

Pentru a şterge o procedură/funcţie salvată:


drop procedure <procedure_name>;
drop function <function_name>;

Variabile tiparibile

O altă modalitate de a tipări variabile este utilizarea instrucţiuni print, cu ajutorul unei variabile
de legătură. Variabilele de legătură trebuie să fie precedate de :, cum ar fi:new.

Următorii paşi trebuie urmăriţi:

1. Declararea variabilelor de legătură:

     VARIABLE <name> <type>


Unde tipul poate fi unul dintre: NUMBER, CHAR, sau CHAR(n).
2. Variabila trebuie asignată cu o valoare în cadrul unei declaraţii PL/SQL, dar cu prefixul :.
3. Se execută instrucţiunea următoare, în afara declaraţiei PL/SQL:

     PRINT :<name>;

Exemplul 1: Un exemplu banal pentru a afişa valoarea 1.


     VARIABLE x NUMBER
     BEGIN
          :x := 1;
     END;
     .
     run;
     PRINT :x;

Exemplul 2: Afişarea datelor dintr-un cursor:


VARIABLE debitori_info REFCURSOR
BEGIN
OPEN :debitori_info FOR SELECT coddeb,dendeb,termen,sumacr FROM debitori;
END;
/
PRINT debitori_info;

Exemplul 3:

SET AUTOPRINT ON
VARIABLE total_sumacr NUMBER
BEGIN
SELECT SUM(sumacr) INTO :total_sumacr FROM debitori;
END;
/
DECLARE
BEGIN
DBMS_OUTPUT.PUT_LINE('Total credite acordate = '||:total_sumacr);
END;
/

Triggere
create sequence seq_marca INCREMENT BY 1
MINVALUE 1010 MAXVALUE 5555 NOCYCLE NOCACHE ORDER;

create table personal (


marca integer not null primary key,
numepren varchar2(40) not null unique,
compart varchar2(5) default 'prod' not null,
datasv date default sysdate,
salarorar number(16,2) default 4.5,
salarorarco number(16,2) default 4,
colaborator char(1) default 'N' not null
);

create or replace trigger trg_personal_ins_befo_row


before insert on personal
referencing old as old new as new
for each row
begin
select seq_marca.nextval into:new.marca from dual;
end;
/

insert into personal (numepren,compart, datasv)


values ( 'Pop', 'Info',to_date('2007-01-12',’DD/MM/YYYY’));

insert into personal (numepren,compart,salarorar)


values ('Ion', 'Econ', 2.5);
Funcţii
create or replace function f_ec2(
a IN INTEGER, b IN INTEGER, c IN INTEGER) return VARCHAR2
AS
delta NUMBER(16,2);
x1 NUMBER(16,6);
x2 NUMBER(16,6);
sir VARCHAR2(100):='';

BEGIN
IF a=0 THEN
IF b=0 THEN
IF c=0 THEN
sir:='Nedeterminare';
ELSE
sir:='Imposibil';
END IF;
ELSE
sir:='Ecuatia este de gradul I';
x1:=-c/b;
sir:=sir ||',x='||x1;
END IF;
ELSE
delta:=b**2-4*a*c;
IF delta>0 THEN
x1:=(-b-SQRT(delta))/(2*a);
x2:=(-b+SQRT(delta))/(2*a);
sir:='x1='||x1||',x2='||x2;
ELSE
IF delta=0 THEN
x1:=-b/(2*a);
sir:='x1=x2='||x1;
ELSE
sir:='Radacinile sunt complexe!';
END IF;
END IF;
end if;
RETURN sir;
END;
/
Lansarea în execuţie
begin
dbms_output.Put_line(f_ec2 (24,555,67));
end;
/

Instrucţiunea IF
set serveroutput on;

drop table t3;

create table t3 (codf integer constraint pk_filme primary key, titlul


varchar2(30), regizor varchar2(30), durata integer, incasari integer,
an integer constraint ck_an check (an between 1940 and 2007));

insert into t3 values(100,'casino royale','martin campbell',144,22000,2006);


insert into t3 values(101,'scary movie','keenen nory wayans',88,15000,2000);
insert into t3 values(102,'american pie 5','joe mussbaun',97,17000,2006);
declare
v_codf number;
v_titlul varchar2(30);
v_reg varchar2(20);
v_dur number;
v_inc number;
v_an number;
begin
select codf, titlul, durata, incasari, an into v_codf, v_titlul, v_dur,
v_inc, v_an from t3 where codf=100;
if v_an=2006 then
if v_titlul='casino royale'
then dbms_output.put_line('Film cu audienta ridicata');
update t3 set incasari=incasari*1.1;
else
dbms_output.put_line('audienta scazuta');
end if;
end if;
end;
.
run;

Să se creeze o funcţie care să returneze numărul de înregistrări dintr-o tabelă introdusă ca


parametru al funcţiei. Să se apeleze această funcţie din cadrul unui bloc program.

CREATE OR REPLACE FUNCTION nr_inreg (nume_tabela VARCHAR2) RETURN INTEGER AS


coloane INTEGER;
BEGIN
EXECUTE IMMEDIATE 'SELECT COUNT(*) INTO '||coloane||' FROM '||nume_tabela;
RETURN coloane;
END;
/

DECLARE
tot_inreg INTEGER DEFAULT 0;
BEGIN
tot_inreg:=nr_inreg('debitori');
DBMS_OUTPUT.PUT_LINE('Nr. total de inregistrari ale tabelei debitori este =
'||tot_inreg);
END;
/

S-ar putea să vă placă și