jueves, 28 de junio de 2007

Variables en SQL*Plus (parte 1)

Hay tres tipos de variables en SQL*Plus y suelen causar confusión.
Estas son: variables de usuario, variables de sustitución y bind variables.

Aquí va la primera de ellas, más adelante revisaremos las otras.

VARIABLES DE USUARIO

Se definen de la siguiente forma:

SQL> DEFINE u_nombre = ANDREA

Para confirmar que haya quedado el valor guardado:

SQL> DEFINE u_nombre
DEFINE U_VAR1 = "ANDREA" (CHAR)


El comando DEFINE nos permite definir una cadena que se sustituye textualmente en cualquier lugar de nuestro script. Aunque quede definida como CHAR realmente no importa el tipo ya que la sustitución se realiza antes de ejecutar el código y además no incluye comillas. Por estas razones podemos jugar a 'construir' el script con nuestras variables de sustitución.
Si queremos usar la entrada como varchar le agregamos las comillas nosotros, si queremos usarla como número no las agregamos. Para recuperar el contenido de la variable usamos el símbolo ampersand.

Por ejemplo: SELECT * FROM empleado WHERE nombre = '&u_var1';

Ahora definimos una variable con un número...

SQL> define u_edad = 25
SQL> define u_edad

DEFINE U_EDAD = "25" (CHAR)

...y la usamos de la misma forma pero sin incluir las comillas:

SELECT * FROM empleado WHERE edad = &u_edad;

Las variables de usuario son útiles cuando se define su valor al comienzo de un script y luego se utiliza varias veces en el código.

No solamente podemos sustituir valores de columnas, sino también nombres de columnas o de tablas, incluso fragmentos de código, permitiéndonos hacer scripts más dinámicos.

Un uso interesante es 'aceptar' el nombre de una columna y luego usarla para parametrizar el ORDER BY de un reporte.

Ver también:
Variables en SQLPlus (parte 2) - Sobre variables de sustitución
Variables en SQLPlus (parte 3) - Sobre variables bind

miércoles, 27 de junio de 2007

Webstats

La gente de MOTIGO Webstats toma las estadísticas de este blog, pero estoy comenzando a sospechar que sus números no son muy confiables...

For Export/Import

La base de datos Oracle XE es cada vez más popular en los hogares de los programadores que en sus trabajos utilizan la 9i.
Estos exportan un schema versión 9i y lo llevan a su flamante XE portátil. Hasta aquí no hay mayores dificultades, la instalación y configuración de XE se realiza sola, y basta leer el manual Database Utilities para aprender a utilizar exp e imp.

Un archivo dump de 9i se puede importar en 10g sin especificar ningún parámetro extra.

El asunto es que para migrar de la casa al trabajo con el programa exp tendremos un problema: el archivo dump generado por XE (10g) no se puede importar en 9i, no es compatible.

Import: Release 9.2.0.1.0 - Production on Thu Jun 28 18:31:04 2007

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

IMP-00010: not a valid export file, header failed verification
IMP-00000: Import terminated unsuccessfully

La solución es exportar desde XE con un exp 9i. El imp y el exp deben tener la misma versión cuando exportamos algo que es mas nuevo que la base destino.

No es necesario que instalemos una base de datos 9i en casa, alcanza simplemente con instalar el cliente el cual se puede descargar gratuitamente desde:

http://www.oracle.com/technology/software/products/oracle9i/htdocs/winsoft.html

Luego de instalar el cliente 9i, hay que tener en cuenta que éste utiliza su propio tnsnames.ora, por lo que vamos a tener que anexarle el servicio de nuestra base de datos XE. Finalmente ejecutaremos el export del cliente (por ejemplo: c:\oracle\ora92\bin\exp.exe) y exportaremos un archivo dump versión 9i que podrá ser importado sin problemas por otra 9i.

Un detalle: tendremos que ser cuidadosos al ejecutar programas como sql*plus, exp, imp. Cada uno de ellos referirán a sus respectivos tnsnames.ora donde están registradas nuestras bases de datos. Como al iniciarse siempre muestran la versión, sabremos cual tnsnames.ora están leyendo.