sábado, 3 de maio de 2014

12c – PL/SQL From SQL

Antes do 12c, era necessário criar uma PL/SQL function/procedure (schema object) para utilizar em conjunto com um comando SQL e para isso era necessário ter privilégios de CREATE PROCEDURE.


Segue um exemplo retirado de uma apresentação do Tom Kyte:


SQL> create table t (x varchar2(5));


Table created.


SQL> insert into t values ( 'a' );

insert into t values ( '1' );

insert into t values ( null );


commit;

Como era antes do 12c:

SQL>create or replace
function is_number_old(x in varchar2) return varchar2 is
 Plsql_Num_Error exception;
 pragma exception_init(Plsql_Num_Error, -06502);
begin
 if (To_Number(x) is NOT null) then
  return 'Y';
 else
  return '';
  end if;
exception
 when Plsql_Num_Error then
  return 'N';
end;
/

Function created.


SQL> select rownum, x,
is_number_old(x) is_num
from t;

ROWNUM     X     IS_NUM

---------- ----- --------------------

1          a     N
2          1     Y
3

Trace após adicionar 110.000 registros na tabela, para comparar os tempos:





Como fica no 12c:

with
function Is_Number (x in varchar2) return varchar2 is
 Plsql_Num_Error exception;
 pragma exception_init(Plsql_Num_Error, -06502);
begin
 if (To_Number(x) is NOT null) then
   return 'Y';
 else
   return '';
 end if;
exception
 when Plsql_Num_Error then
  return 'N';
end Is_Number;

select rownum, x, is_number(x) is_num from t;


ROWNUM     X     IS_NUM
---------- ----- --------------------
1          a     N
2          1     Y
3






Podemos verificar uma diminuição significativa no tempo e cpu.


Abraço,


Alex Zaballa.

0 comentários: