Mostrando entradas con la etiqueta Oracle. Mostrar todas las entradas
Mostrando entradas con la etiqueta Oracle. Mostrar todas las entradas

Generar infinitas filas en Oracle

En Oracle podemos obtener la cantidad que deseemos de filas sin usar ninguna tabla en especial. Usando cualquier tabla (por ejemplo, "dual") podemos obtener infinitas filas o una cantidad específica. Por ejemplo:

Infinitas filas (tuplas):
select * 
from dual 
connect by level > 0;

N filas:
select * 
from dual 
connect by level <= N;

Y mi pregunta es... ¿qué devuelve la siguiente consulta?:
select count(*)
from dual 
connect by level > 0;

SQL: Diferencia entre YYYY y RRRR

Cuando trabajamos en Oracle con fechas, puede interesarnos el año en formato de 4 dígitos. En este momento, ¿qué máscara debemos utilizar con la función "to_date" o "to_char"?, ¿YYYY o RRRR?.

Para elegir una u otra opción, consideremos lo siguiente:

1. No importa usarla con mayúsculas o minúsculas (YYYY o yyyy).

2. No es recomendable usar la función "trunc" antes de cualquiera de las dos funciones mencionadas porque perderemos los dos dígitos más a la izquierda del año (19 ó 20 normalmente).

3. El formato RRRR está pensado para evitar el Efecto 2000. De manera que, si tenemos una fecha con formato "dd/mm/yy" y aplicamos una máscara RRRR se calcularán los dos dígitos del año que faltan presuponiendo que se trata de una fecha posterior a 1950. Es decir, aplicando la función "to_date" (no "to_char") se realiza la siguiente conversión:
3.1. Si YY está entre 00 y 49, con la máscara RRRR conseguiremos 20YY. Por ejemplo, 12/08/01 será 12/08/2001. En caso de usar la máscara YYYY, conseguiríamos 12/08/0001.
3.2. Si YY está entre 50 y 99, con la máscara RRRR conseguiremos 19YY. Por ejemplo, 12/08/83 será 12/08/1983. En caso de usar la máscara YYYY, conseguiríamos 12/08/0083.

4. Debemos tener en cuenta que "to_date" y "to_char" nos devuelven resultados distintos al aplicar YYYY sobre una fecha con un año de dos dígitos. Veamos cuál es el resultado de aplicar las máscaras con una y otra función usando como ejemplo la variable "sysdate" que, por defecto, almacena solo los dos últimos dígitos del año:

select to_date(sysdate, 'dd/mm/rrrr') from dual; -- Devuelve 27/08/2010.
select to_char(sysdate, 'dd/mm/rrrr') from dual; -- Devuelve 27/08/2010.
select to_date(sysdate, 'dd/mm/yyyy') from dual; -- Devuelve 27/08/0010.
select to_char(sysdate, 'dd/mm/yyyy') from dual; -- Devuelve 27/08/2010.

Oracle Certification: 5 días = 2000€

Así te quedas cuando quieres prepararte una certificación Oracle por profesores de la Oracle University.

Empiezas a buscar academias, libros para prepararla por ti mismo, cursos oficiales... todo para comparar y encontrar la mejor opción. En cuanto a academias, la oferta se limita principalmente a Madrid y Barcelona. Si buscas libros, encuentras varios, siendo los más recomendados de Oracle Press, pero siempre te queda la duda de si este material será suficiente o si éstos libros forman parte del negocio. Como última opción, optando por un curso por el personal oficial de Oracle, te vas a consultar los precios y entonces... te caes de boca y te partes la mandíbula: ¡¡cursos de 5 días por 2000 ó 3000 euros!!

Es evidente que si te sobra el dinero, podrás optar por esta última opción que, supuestamente, es con la que mejor cualificación se consigue de cara al examen. Pero, ¿de verdad es posible asimilar todo el temario (normalmente bastante extenso) en 5 días?. Si se recibe todo el material necesario y suficiente para aprobar, ¿es justo un precio de 2000€ para una tutorización de sólo 5 días?.

Por otra parte, las academias no oficiales suelen tener bolsa de trabajo con un porcentaje alto de garantía de contratación. Algo que, según el caso, puede interesar bastante.

Yo seguramente acabe optando por comprarme los libros y dedicarle tiempo. Ya veremos.

SQL: Importación de la BD

Teniendo el fichero .dmp (creado como se indica en la entrada anterior del blog), la importación podemos realizarla de forma interactiva usando el ejecutable $ORACLE_HOME/bin/imp. En la secuencia de preguntas, podemos ir respondiendo como sigue:

1. ... nombre del fichero .dmp
2. ... 500002.
3. ... No.
4. ... No.
5. ... Sí.
6. ... Sí.

Al igual en la exportación, podremos elegir trabajar exclusivamente con tablas concretas, esquemas o la base de datos al completo. 

IMPORTANTE: Para realizar la importación de datos de una tabla que ya existe, conviene usar una tabla provisional en la que volcar los datos. Posteriormente podremos tratarlos para incluirlos en la tabla de destino. Esta idea es extrapolable al nivel de esquema.

SQL: Exportación de la BD

Autenticarse como usuario "oracle". Podemos hacerlo rápidamente desde el usuario root:
sudo -i
su oracle
Conviene realizar todas las operaciones desde el mismo directorio. Así será más cómodo referenciar a los ficheros necesarios (por ejemplo, /oracle/export)

De forma interactiva

1. $ORACLE_HOME/bin/exp
2. Usuario: system; Contraseña: ****
3. Tamaño del buffer: Cantidad máxima de bytes (por ejemplo, 50000)
4. Archivo: 'expdat.dmp' (este es el nombre por defecto)
5. Elegir la opción por defecto en el resto de preguntas

Usando un fichero de parámetros

Si queremos evitar este proceso interactivo, podemos usar un fichero de parámetros (con extensión 'par'). Este es un ejemplo: exportacion.par
userid=system/****
full=y
file=/oracle/export/full_20_00.dmp
log=/oracle/export/full_20_00.log
consistent=y
buffer=50000
direct=y
Donde cada parámetro significa:

userid: Usuario y contraseña del usuario system
full: Indicación de si queremos una exportación completa (esquemas, datos, usuarios, permisos...)
file: Fichero de exportación
log: Fichero de log del proceso de exportación
consistent: Indicación de si queremos recoger los cambios realizados
durante el proceso de exportación
buffer: Memoria a emplear en el proceso
direct: (aumenta la velocidad del proceso)

Así podríamos usarlo:
exp parfile=exportacion.par

De forma programada

1. Creamos un fichero con la asignación variables de entorno. Esto es necesario para su lectura desde el cron. Este es un ejemplo (entorno.txt):
#ORACLE_BASE=/app/oracle; export ORACLE_BASE
ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server ; export ORACLE_HOME
ORACLE_SID=XE; export ORACLE_SID
PATH=$PATH:$ORACLE_HOME/bin; export PATH
PATH=$PATH:/usr/ccs/bin; export PATH
LANGUAGE=spanish_spain.AL32UTF8
NLS_LANG=spanish_spain.AL32UTF8
export LANGUAGE NLS_LANG
ORACLE_OWNER=oracle;export ORACLE_OWNER

2. Creamos un script para llevar a cabo todo el proceso (copia.sh)
. /oracle/export/entorno
cd /oracle/export
$ORACLE_HOME/bin/exp parfile=/oracle/export/exportacion.par

3. Creamos un cron (cron.txt):
#Min.   Horas   Dia     Mes     Dia S   Comando
#(0-59) (0-23)  (1-31)  (1-12)  (0-6)
#------ ------  ------  ------  ------  --------------------------------
00      20      *       *       *       /oracle/export/copia.sh >/oracle/export/exportacion.log 2>&1

4. Incluimos el cron en el conjunto de tareas programadas:
crontab cron.txt

5. Podemos visualizar la lista de tareas ejecutadas como cron:
crontab -l

Así, la relación de llamadas en los ficheros usados como ejemplo quedaría: 'cron.txt' define el cron que ejcutará a 'copia.sh' que a su vez usará a 'exportacion.par' y a 'entorno'.

SQL: Usar privilegios DBA sin autenticación

Para trabajar con los privilegios del usuario SYS, SYSTEM o SYSMAN sin necesidad de autenticarse, es necesario seguir los siguientes pasos:

1. Entrar en el sistema operativo como usuario con privilegios suficientes para
gestionar los servicios de Oracle. En Ubuntu, por defecto, es "oracle". Por lo que
tendríamos que ejecutar el siguiente comando:

su oracle

2. A continuación ejecutar SQL*Plus con:

sqplus / as sysdba

A partir de entonces, podremos realizar cualquier operación como DBA. Operaciones tales como manipular bloqueos o clave de los usuarios SYS o SYSTEM.