select object_name from all_objects where object_type='PACKAGE' order by 1;
DBMS_SQL.OPEN_CURSOR return integer
type t is table of varchar2(256) index by binary_integer;In acest caz procedura este:
PARSE(c in integer, instructiune in varchar2, inc in integer, sf in integer,
lf in boolean, versiune in integer);
Parametrul lf precizează cu true că se adaugă "newline" după fiecare linie din instrucţiune.
EXECUTE(c in integer) return integer;Valoarea funcţiei are sens la execuţia instrucţiunilor Insert, Delete, Update - şi precizează numărul de linii prelucrate
CLOSE_CURSOR(c in out integer);După apel valoarea parametrului c (identificarea cursorului) va fi null.
IS_OPEN(c in integer) return booleanse poate verifica dacă un cursor, dat printr-un număr, este deschis sau nu
--executia unui sir de caractere, interpretat ca o instructiune
create or replace function exec(sir in varchar2) return boolean
as
c integer;
n integer;
begin
-- deschide un cursor
c:=dbms_sql.open_cursor;
-- analizeaza instructiunea SQL data ca argument
dbms_sql.parse(c, sir, dbms_sql.native);
-- executa aceasta instructiune
n:=dbms_sql.execute(c);
-- inchide cursorul
dbms_sql.close_cursor(c);
return true;
exception
-- daca apare eroare, se inchide cursorul
when others then
dbms_sql.close_cursor(c);
return false;
end;
Utilizarea funcţiei precedente
set serveroutput on
declare
r boolean;
x char(2);
begin
dbms_output.enable;
r:=exec('create table test (nume char(20), prenume char(20), cnp char(13))');
if r then x:='Da'; else x:='Nu'; end if;
dbms_output.put_line(x);
end;
Funcţie pentru ştergerea unui tabel
create or replace function drop_table(nume_tabel in varchar2) return boolean
as
c integer;
n integer;
begin
-- deschide un cursor
c:=dbms_sql.open_cursor;
-- analizeaza o instructiune SQL ce sterge un tabel dat ca argument
dbms_sql.parse(c,'drop table ' || nume_tabel, dbms_sql.native);
-- executa aceasta instructiune
n:=dbms_sql.execute(c);
-- inchide cursorul
dbms_sql.close_cursor(c);
return true;
exception
-- daca apare eroare se inchide cursorul
when others then
dbms_sql.close_cursor(c);
return false;
end;
Utilizarea funcţiei precedente
set serveroutput on
declare
r boolean;
x char(2);
begin
dbms_output.enable;
r:=drop_table('test');
if r then x:='Da'; else x:='Nu'; end if;
dbms_output.put_line(x);
end;
create table temp(nume varchar2(20), prenume varchar2(20), cnp char(13), media number(5,2));
Următoarele instrucţiuni generează 10000 înregistrări în acest tabel:
declare
m number(5,2);
n integer;
cnp varchar2(13);
function gen_cnp return varchar2 as
--generarea unui cod numeric personal
i integer;
j integer;
c varchar2(13);
type t is VARRAY(12) of number(1);
a t:=t(2,7,9,1,4,6,3,5,8,2,7,9); --ponderi pentru primele 12 cifre
k integer;
begin
i:=dbms_random.value(1,2);
c:=to_char(i); -- prima pozitie din cnp
k:=i*a(1);
for j in 1..11 loop
i:=dbms_random.value(0,9);
c:=c || to_char(i);
k:=k+i*a(j+1);
end loop;
if mod(k,11)=10 then k:=k-9; end if;
k:=mod(k,11); --cifra de control
c:=c || to_char(k);
return c;
end;
begin
for n in 1..10000 loop
m:=dbms_random.value(5,10);
cnp:=gen_cnp;
insert into temp values(dbms_random.string('U', 1) || dbms_random.string('L', 19),
dbms_random.string('U', 1) || dbms_random.string('L', 19),cnp,m);
end loop;
end;
/
select * from temp;
--drop table temp;
DBMS_XPLAN.DISPLAY( table_name IN VARCHAR2 DEFAULT 'PLAN_TABLE', statement_id IN VARCHAR2 DEFAULT NULL, format IN VARCHAR2 DEFAULT 'TYPICAL');
Al treilea parametru precizează informaţiile care sunt furnizate:
BASIC, TYPICAL, ALL, SERIAL.
Pentru afişarea acestor informatii (cu instructiunea select-sql) se va folosi funcţia TABLE, care converteşte
colecţia de informaţii la un tabel.
Exemplu:
DECLARE
exp VARCHAR2(80) := 'horea@cs.ubbcluj.ro';
dest VARCHAR2(80) := 'horea@cs.ubbcluj.ro';
subiect VARCHAR2(80) := 'test subject';
server_mail VARCHAR2(30) := 'nessie.cs.ubbcluj.ro';
mail_conn utl_smtp.Connection;
crlf VARCHAR2(2) := chr(13) || chr(10);
BEGIN
Mail_Conn := utl_smtp.Open_Connection(server_mail, 25);
-- deschide o conectiune la un server de mail
-- 25 este portul implicit
utl_smtp.Helo(mail_conn, server_mail);
-- necesar dupa conectare (autentificare dupa conectare?)
utl_smtp.Mail(mail_conn, exp);
-- initiaza o tranzactie cu serverul de mail
utl_smtp.Rcpt(mail_conn, dest);
-- specifica destinatarul
utl_smtp.Data(mail_conn,
'Date: ' || to_char(sysdate, 'MONTH DD, YYYY, HH24:MI:SS') || crlf ||
'From: ' || exp || crlf ||
'Subject: '|| subiect || crlf ||
'To: ' || dest ||
crlf || crlf ||
'linie din mesaj'|| crlf ||
'alta linie din mesaj'|| crlf
);
-- continutul emailului, inclusiv headers
-- necesar "crlf || crlf" inainte de mesaj
utl_smtp.Quit(mail_conn);
EXCEPTION
WHEN utl_smtp.Transient_Error OR utl_smtp.Permanent_Error then
raise_application_error(-20000, 'Eroare: ' || sqlerrm);
END;