terça-feira, 27 de maio de 2014

12c – RMAN SQL Interface Improvements

No Oracle Database 12c, o utilitário RMAN sofreu diversas melhorias. E uma dessas melhorias é que agora você pode executar a maioria dos comandos SQL diretamente no RMAN, sem precisar especificar a palavra-chave SQL + comando.


Como era antes do 12c:


[oracle@mesene2 ~]$ rman target /

Recovery Manager: Release 11.2.0.4.0 - Production on Tue May 20 12:42:47 2014
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
connected to target database: ORCL (DBID=4216109927)

RMAN> SQL 'create table tabela_teste (coluna1 number)';
using target database control file instead of recovery catalog
sql statement: create table tabela_teste (coluna1 number)

RMAN> SQL 'insert into tabela_teste values (1)';
sql statement: insert into tabela_teste values (1)

RMAN> SQL 'select * from tabela_teste';
sql statement: select * from tabela_teste



No 12c:

[oracle@oracle01 ~]$ rman target /


Recovery Manager: Release 12.1.0.1.0 - Production on Tue May 20 12:34:13 2014

Copyright (c) 1982, 2013, Oracle and/or its affiliates. All rights reserved.

connected to target database: ORCL (DBID=1356220819)


RMAN> create table tabela_teste (coluna1 number);

using target database control file instead of recovery catalog

Statement processed



RMAN> insert into tabela_teste values (1);

Statement processed



O resultado do SELECT agora é mostrado na tela:


RMAN> select * from tabela_teste;


COLUNA1

----------

1



E também podemos utilizar o comando DESCRIBE:

RMAN> desc tabela_teste;


Name                                         Null? Type

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

COLUNA1                                            NUMBER





Abraço,


Alex Zaballa.

terça-feira, 13 de maio de 2014

12c – SQL Text Expansion

No Oracle Database 12c, foi introduzida uma nova funcionalidade, o SQL Text Expansion.

E na package DBMS_UTILITY, foi adicionada a procedure EXPAND_SQL_TEXT.


SQL> variable retorno clob


SQL> begin
dbms_utility.expand_sql_text( input_sql_text => 'select * from emp', output_sql_text => :retorno );
end;
/

PL/SQL procedure successfully completed.



SQL> print retorno



RETORNO

--------------------------------------------------------------------------------
SELECT "A1"."EMPNO" "EMPNO","A1"."ENAME" "ENAME","A1"."JOB" "JOB","A1"."MGR" "MG
R","A1"."HIREDATE" "HIREDATE","A1"."SAL" "SAL","A1"."COMM" "COMM","A1"."DEPTNO"
"DEPTNO" FROM "SCOTT"."EMP" "A1"


Vamos verificar o efeito com uma política de VPD:


SQL> SELECT count(*)

FROM emp e, dept d

WHERE d.deptno = e.deptno;



COUNT(*)

----------

14

Criando a política de VPD, para mostrar apenas os dados referentes ao departamento 30:


SQL> CREATE OR REPLACE FUNCTION hide_sal_comm ( v_schema IN VARCHAR2, v_objname IN VARCHAR2) RETURN VARCHAR2 AS

 con VARCHAR2 (200);


BEGIN

 con := 'deptno=30';

 RETURN (con);

END hide_sal_comm;

/
Function created.

SQL> BEGIN
DBMS_RLS.ADD_POLICY ( object_schema => 'scott', object_name => 'emp',
policy_name => 'hide_sal_policy', policy_function => 'hide_sal_comm');

END;

/

PL/SQL procedure successfully completed.


SQL> SELECT count(*)
FROM emp e, dept d

WHERE d.deptno = e.deptno;

COUNT(*)
----------

6


Verificando o SQL gerado:


SQL> variable retorno clob


SQL> begin
dbms_utility.expand_sql_text( input_sql_text => 'SELECT count(*) FROM emp e, dept d WHERE d.deptno = e.deptno', output_sql_text => :retorno );
end;
/

PL/SQL procedure successfully completed.



SQL> print retorno



RETORNO

--------------------------------------------------------------------------------
SELECT COUNT(*) "COUNT(*)" FROM (SELECT "A3"."EMPNO" "EMPNO","A3"."ENAME" "ENAM
E","A3"."JOB" "JOB","A3"."MGR" "MGR","A3"."HIREDATE" "HIREDATE","A3"."SAL" "SAL"
,"A3"."COMM" "COMM","A3"."DEPTNO" "DEPTNO" FROM "SCOTT"."EMP" "A3" WHERE "A3"."DEPTNO"=30) "A2","SCOTT"."DEPT" "A1" WHERE "A1"."DEPTNO"="A2"."DEPTNO"



Abraço,


Alex Zaballa.

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.