quarta-feira, 4 de junho de 2014

GUOB TECH DAY - 2014



Apresentação

Com grande sucesso, o GUOB prepara mais uma edição de seu evento nacional no dia 02/08/2014 em São Paulo no Hotel Blue Tree Morumbi, o qual proporcionará um grande encontro de usuários de tecnologia Oracle do Brasil com a participação de palestrantes internacionais e nacionais.

Estarão presentes palestrantes como Alex Zaballa, Roy Swonger, Ronald Vargas, Francisco Alvarez, Gustavo Gonzalez, David Peake, Deiby Gomez, Gustavo Rene Antunez, Eduardo Guedes, Wagner Bianchi e Rodrigo Mufalani.

Como resultado esperado contaremos com a qualidade das palestras, as quais garantirão o investimento dos participantes em dedicar um dia para estar presente em nosso evento. Além do netwoking proporcionado aos associados do GUOB e aos profissionais usuários de tecnologia Oracle.


Participe da 5o. edição do GUOB TECH DAY 2014 / OTN TOUR LAD. Faça sua inscrição ainda hoje.


GUOB - Grupo de Usuários de Tecnologia Oracle do Brasil

segunda-feira, 2 de junho de 2014

12c – ASM – New asmcmd commands

No Oracle Database 12c, foram introduzidos novos comandos para o utilitário asmcmd.


Dentre eles, podemos destacar:


showclusterstate: Exibe o estado atual do cluster. Os possíveis valores retornados são normalin-upgrade, ou in-rollingpatch.


ASMCMD> showclusterstate
Normal

showclustermode: Exibe em que modo está o cluster do Oracle ASM. Os valores de retorno possíveis são ASM cluster : Flex mode enabled ou ASM cluster : Flex mode disabled.


ASMCMD> showclustermode
ASM cluster : Flex mode enabled

showversion: Exibe a versão do software do Oracle Cluster ASM.


ASMCMD> showversion
ASM version : 12.1.0.1.0

showpatches: Lista dos patches aplicados no Oracle Grid Infrastructure Home.


ASMCMD> showpatches
---------------
List of Patches
===============


No Oracle Database 12c, podemos armazenar o arquivo de senhas do ASM e do banco de dados dentro do ASM. Isso é útil para bancos de dados em RAC, pois não precisamos manter os arquivos em sincronia entre os servidores.

Comandos para o Gerenciamento do arquivo de senhas:

  • pwcopy: Copia um arquivo de senhas para o local especificado.
  • pwcreate: Cria um arquivo de senhas no local especificado.
  • pwdelete: Exclui um arquivo de senhas do local especificado.
  • pwget: Retorna a localização do arquivo de senhas.
  • pwmove: Troca a localização do arquivo de senhas.
  • pwset: Define o local do arquivo de senhas.
  • lspwusr: Lista os usuários de um arquivo de senhas do Oracle ASM.
  • orapwusr: Adiciona, remove, ou altera uma senha de usuário do Oracle ASM.

Estes comandos podem gerenciar o arquivo de senhas do ASM ou o arquivo de senhas do banco de dados.

Para diferenciar, é necessário utilizar um dos seguintes parâmetros:

  • --asm                   
  • --dbuniquename 


ASMCMD [+] > pwcopy --asm +DATA/orapwasm +FRA/orapwasm_bak
copying +DATA/orapwasm -> +FRA/orapwasm_bak




Mais detalhes podem ser vistos no My Oracle Support:

 Test Case: 12C ASMCMD New feature (Doc ID 1589249.1)




Abraço,


Alex Zaballa.

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.

segunda-feira, 28 de abril de 2014