jueves, 17 de mayo de 2012

String de conexión JDBC para Oracle RAC


Quizás varios de uds conocen la clásica conexión por JDBC a una single instance de Oracle, pues bien, si necesitamos conectarnos a un RAC con x cantidad de nodos dicho string de conexión sufre algunas modificaciones.

La clásica conexión a una single instance es

jdbc:oracle:thin:@:1521:

La conexión a un RAC presenta las siguientes diferencias:

jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)
 (ADDRESS=(PROTOCOL=TCP)(HOST=host1) (PORT=1521))
 (ADDRESS=(PROTOCOL=TCP)(HOST=host2) (PORT=1521))
 (CONNECT_DATA=(SERVICE_NAME=service)
   (FAILOVER_MODE =(TYPE = SELECT)(METHOD = BASIC))))

Espero les haya servido.

Saludos!
Gondalf.

jueves, 26 de abril de 2012

Empezando a trabajar con Fechas

Seguramente tuvimos varios problemas al tratar con fechas en Oracle. Se nos complico en sumar o restar horas, o cambiar los días.

Lo que vamos a tratar ahora es de dar unos ejemplos para que no vuelva a suceder. Antes de empezar, tengamos en cuenta que Oracle trabaja con la aritmética en función de un 1 día.

Teniendo entendido este concepto nos va a resultar más fácil la explicación.
Veamos algunos ejemplos:

        - Sumar días:
        'fecha' + 'días a sumar'
        Ejemplo: select sysdate + 1 from dual;
        - Sumar horas:
         'fecha' + 'horas a sumar / 24'
        Ejemplo: select sysdate + 3/24 from dual;
       - Sumar minutos:
         'fecha' + 'minutos a sumar / 1440'  
        Ejemplo: select sysdate + 25/1440 from dual;
      Sumar segundos:
         'fecha' + 'minutos a sumar / 86400' 
        Ejemplo: select sysdate + 1/86400 from dual;

Espero les haya servido.

Saludos!
Gondalf.


Pd: En el próximo post trabajaremos más a fondo con las fechas viendo algunas funciones que nos facilitaran mucho trabajo.

miércoles, 18 de enero de 2012

ORA-02287: sequence number not allowed here

Comencemos por la causa del mismo., curre cuando intentamos utilizar una secuencia donde no está permitido hacerlo.

Para ser un poco más explícitos, NO podemos utilizar secuencias en los siguientes casos:

- Dentro de una sentencias SELECT:

* En la claúsula WHERE

* En las claúsulas GROUP BY u ORDER BY
* En una claúsula DISTINCT
* Utilizando UNION o INTERSECT o MINUS
* En un Sub-Query

- En una VISTA o SNAPSHOT
- En una condición de DEFAULT o CHECK de una tabla

(Cabe aclarar que existen más excepciones pero que estas son las mas representativas)

Algunas posibles soluciones para nuestro problema serian:

- Si necesitamos utilizar nuestra secuencia en un WHERE o bien un ORDER BY o un Sub-Query, lo que hacemos es asignarla a una variable previa y dicha variable es la que podemos utilizar en los caso mencionados.

- Si necesitamos utilizar la secuencia para ser insertada tras la creación de las filas de una tabla lo que podemos hacer es utilizar un trigger "before insert" para que realice el trabajo.

- Si quisiéramos una secuencia en una vista podríamos crear la mismas sin la secuencia y luego al momento de llamarla utilizarla (ej: select a, b, "secuencia" from "nuestra vista").

- Si quisiéramos usar la secuencia en un query con una DISTINCT lo que podemos hacer es utilizar este en un Sub-Query y la secuencia en el query principal

Espero que les haya servido

Saludos!
Gondalf.

martes, 15 de noviembre de 2011

Parametros EXCLUDE e INCLUDE en DataPump

Los parametros EXCLUDE e INCLUDE están disponibles con DataPump (expdp, impdp), los mismos pueden ser utilizados para limitar lo que se importa o exporta, ya sean tablas, índices, triggers, funciones, vistas, procedures, paquetes o secuencias (creo que no me olvido de ningún otro).

La sintaxis de estos parámetros es la siguiente:
EXCLUDE=[object_type]:[name_clause],[object_type]:[name_clause]

INCLUDE=[object_type]:[name_clause],[object_type]:[name_clause]


Ejemplos:

expdp < paramentro varios > SCHEMAS=scott EXCLUDE=SEQUENCE,TABLE:”IN (’EMPLEADOS’,'DEPARTAMENTOS’)”;

En este ejemplo vemos que excluimos exportar todas las secuencias y tablas que se llamen EMPLEADOS o DEPARTAMENTOS del schema backup

impdp < paramentro varios > SCHEMAS=backup INCLUDE=TABLE:”=’OLD_TABLE’”

En este ejemplo vemos como hacemos un import incluyendo solo la tabla de nombre OLD_TABLE.

Espero les haya servido

Saludos!
Gondalf

jueves, 10 de noviembre de 2011

Diferencias entre los CharacterSet WE8ISO8859P1 y WE8MSWIN1252

Según oracle tenemos que el characterset definido en WE8ISO8859P1 es un “subgrupo” del characterset WE8MSWIN1252, es decir que este ultimo posee characters adicionales al primero.

Hilando un poco más fino, podemos decir que el characterset WE8MSWIN1252 posee 27 caracteres adicionales.

A continuación vemos la lista con las 27 diferencias:


Win-1251 Unicode Char Charact Descripción
0x80 0x20AC [€] [€] EURO SIGN
0x82 0x201A [‚] [‚] SINGLE LOW-9 QUOTATION MARK
0x83 0x0192 [ƒ] [ƒ] LATIN SMALL LETTER F WITH HOOK
0x84 0x201E [„] [„] DOUBLE LOW-9 QUOTATION MARK
0x85 0x2026 […] […] HORIZONTAL ELLIPSIS
0x86 0x2020 [†] [†] DAGGER
0x87 0x2021 [‡] [‡] DOUBLE DAGGER
0x88 0x02C6 [ˆ] [ˆ] MODIFIER LETTER CIRCUMFLEX ACCENT
0x89 0x2030 [‰] [‰] PER MILLE SIGN
0x8A 0x0160 [Š] [Š] LATIN CAPITAL LETTER S WITH CARON
0x8B 0x2039 [‹] [‹] SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C 0x0152 [Œ] [Œ] LATIN CAPITAL LIGATURE OE
0x8E 0x017D [Ž] [Ž] LATIN CAPITAL LETTER Z WITH CARON
0x91 0x2018 [‘] [‘] LEFT SINGLE QUOTATION MARK
0x92 0x2019 [’] [’] RIGHT SINGLE QUOTATION MARK
0x93 0x201C [“] [“] LEFT DOUBLE QUOTATION MARK
0x94 0x201D [”] [”] RIGHT DOUBLE QUOTATION MARK
0x95 0x2022 [•] [•] BULLET
0x96 0x2013 [–] [–] EN DASH
0x97 0x2014 [—] [—] EM DASH
0x98 0x02DC [˜] [˜] SMALL TILDE
0x99 0x2122 [™] [™] TRADE MARK SIGN
0x9A 0x0161 [š] [š] LATIN SMALL LETTER S WITH CARON
0x9B 0x203A [›] [›] SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C 0x0153 [œ] [œ] LATIN SMALL LIGATURE OE
0x9E 0x017E [ž] [ž] LATIN SMALL LETTER Z WITH CARON
0x9F 0x0178 [Ÿ] [Ÿ] LATIN CAPITAL LETTER Y WITH DIAERESIS


Esto quiere decir que si necesitamos utilizar por ejemplo el simbolo del Euro y nuestra base esta configurada en P1 deberiamos modificar el characterset de la base siguiente los siguientes pasos:

SQL> SHUTDOWN IMMEDIATE;

SQL> STARTUP MOUNT;

SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;

SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

SQL> Alter DATABASE OPEN;

SQL> ALTER DATABASE CHARACTER SET WE8MSWIN1252;

SQL> SHUTDOWN IMMEDIATE;

SQL> STARTUP;

Espero les haya servido.

Saludos!
Gondalf

martes, 8 de noviembre de 2011

Un poquito de PL/SQL, Packages

Un paquete es una agrupación lógica codigo PL/SQL.

Una de las ventajas que nos brinda como varios lenguajes de programación es la MODULARIDAD. Permitiendo agrupaciones lógicas y un diseño más sencillo, eficaz y un mejor rendimiento.

Otra ventaja es la de permitirnos la SOBRECARGA* de modo que podemos crear procedimientos o funciones con el mismo nombre y con diferentes parámetros en el mismo paquete

DESCRIPCION

Un paquete está compuesto de dos partes:

- Especificación
- Cuerpo

A su vez este puede contener métodos privados y públicos, todo procedimiento declarado en la "Especificación" tiene carácter público; mientras que todo procedimiento declarado y desarrollado en el cuerpo tiene carácter privado.

Las variable definida dentro de un subprograma son locales, mientras que las definidas fuera son globales.

SINTAXIS

Cabecera:

CREATE [o REPLACE ] PACKAGE "nombre_del_paquete"
IS | AS
< declaración de variables públicas >
< declaración de los miembros y funciones públicas >
END "nombre_del_paquete";


Cuerpo:

CREATE [ o REPLACE ] PACKAGE BODY "nombre_del_paquete"
IS | AS
< declaración de las variables privadas >
< cuerpo de los miembros y funciones >
END nombre_del_paquete;


(*)La sobrecarga de métodos es la técnica mediante la cual se utiliza el mismo nombre para diferentes subprogramas dentro de un paquete.
La diferencia entre los métodos es el número y orden de parámetros.


Espero les haya servido.

Saludos!
Gondalf.

viernes, 19 de agosto de 2011

Diferencias entre las lecturas "Sequential" y "Scattered" de los DBfiles

Ambos eventos significan tiempo esperado de E / S para completar las solicitudes de lectura.

- Lectura "sequential" de los DBfile:

Una operación de lectura de datos sequential lo hace dentro de memoria contigua (p3=1, pero pueden ser multiples bloques).
I/Os de single block son normalmente resultado del uso de índices.

Este evento es tambien utilizado durante los rebuilding de los controlfile y las lecturas de los datafile headers (P2=1).
Por lo general, este evento indica disk contention sobre las ecrituras de los índices.

- Lectura "scattered" de los DBfile:

Este tipo de lectura es similar a la anterior a excepción de que la sesión lee multiples bloques de datos y los "dispersa" (traduccion
literal de scattered) en diferentes y discontinuos buffers en la SGA.
Normalmente indican disk contention sobre full table scans. Rara vez, la datos proveninetes de un full table scan pueden ser puestos dentro de una buffer area contigua, entocnes estas esperas podrían mostrarse como lecturas "sequential" en lugar de "scattered".
Sin embargo estas lecturas nunca leeran solo un bloque (p3 siempre es >= 2)

Con el siguiente query podemos observar la diferencia de espera entra las lecturas sequential y scattered:

SELECT a.average_wait "SEQ READ", b.average_wait "SCAT READ"
FROM sys.v_$system_event a, sys.v_$system_event b
WHERE a.event = 'db file sequential read'
AND b.event = 'db file scattered read';


SEQ READ              SCAT READ
------------          ------------
.68                       1.5

Espero les haya servido.

Saludos!
Gondalf.