lunes, 12 de septiembre de 2011

USO DE SQLCODE Y SQLERRM

Al manejar una excepción es posible usar las funciones predefinidas SQLCode y SQLERRM para aclarar al usuario la situación de error acontecida.
    SQLcode devuelve el número del error de Oracle y un 0 (cero) en caso de exito al ejecutarse una sentencia SQL.
    Por otra parte, SQLERRM devuelve el correspondiente mensaje de error.
    Estas funciones son muy útiles cuando se utilizan en el bloque de excepciones, para aclarar el significado de la excepción OTHERS.
    Estas funciones no pueden ser utilizadas directamente en una sentencia SQL, pero sí se puede asignar su valor a alguna variable de programa y luego usar esta última en alguna sentencia.
DECLARE  err_num NUMBER;
  err_msg VARCHAR2(255);
  result  NUMBER;
BEGIN
  SELECT 1/0 INTO result
  FROM DUAL;
 
EXCEPTION 
WHEN OTHERS THEN 
  err_num := SQLCODE;
  err_msg := SQLERRM;
  DBMS_OUTPUT.put_line('Error:'||TO_CHAR(err_num));
  DBMS_OUTPUT.put_line(err_msg);
END;
También es posible entregarle a la función SQLERRM un número negativo que represente un error de Oracle y ésta devolverá el mensaje asociado.
DECLARE
  msg VARCHAR2(255);
BEGIN

  msg := SQLERRM(-1403);
  DBMS_OUTPUT.put_line(MSG);
END;

LA SENTENCIA RAISE

La sentencia RAISE permite lanzar una excepción en forma explícita. Es posible utilizar esta sentencia en cualquier lugar que se encuentre dentro del alcance de la excepción.
DECLARE -- Declaramos una excepcion identificada por VALOR_NEGATIVO
    VALOR_NEGATIVO EXCEPTION;
    valor NUMBER;
BEGIN
  -- Ejecucion
valor := -1;
               IF valor < 0 THEN
                               RAISE VALOR_NEGATIVO;
               END IF;

EXCEPTION
  -- Excepcion
WHEN VALOR_NEGATIVO THEN
               dbms_output.put_line('El valor no puede ser negativo');
END;
Con la sentencia RAISE podemos lanzar una excepción definida por el usuario o predefinida, siendo el comportamiento habitual lanzar excepciones definidas por el usuario.
    Recordar la existencia de la excepción OTHERS, que simboliza cualquier condición de excepción que no ha sido declarada. Se utiliza comúnmente para controlar cualquier tipo de error que no ha sido previsto. En ese caso, es común observar la sentencia ROLLBACK en el grupo de sentencias de la excepción o alguna de las funciones SQLCODESQLERRM, que se detallan en el próximo punto.

REGLAS DE ALCANCE

Una excepcion es válida dentro de su ambito de alcance, es decir el bloque o programa donde ha sido declarada. Las excepciones predefinidas son siempre válidas.
    Como las variables, una excepción declarada en un bloque es local a ese bloque y global a todos los sub-bloques que comprende.

EXCEPCIONES DEFINIDAS POR EL USUARIO

PL/SQL permite al usuario definir sus propias excepciones, las que deberán ser declaradas y lanzadas explícitamente utilizando la sentencia RAISE.
    Las excepciones deben ser declaradas en el segmento DECLARE de un bloque, subprograma o paquete. Se declara una excepción como cualquier otra variable, asignandole el tipo EXCEPTION. Las mismas reglas de alcance aplican tanto sobre variables como sobre las excepciones.
DECLARE -- Declaraciones
    MyExcepcion EXCEPTION;
BEGIN
  -- Ejecucion
EXCEPTION
  -- Excepcion
END;

EXCEPCIONES PREDEFINIDAS

    PL/SQL proporciona un gran número de excepciones predefinidas que permiten controlar las condiciones de error más habituales.
    Las excepciones predefinidas no necesitan ser declaradas. Simplemente se utilizan cuando estas son lanzadas por algún error determinado.
    La siguiente es la lista de las excepciones predeterminadas por PL/SQL y una breve descripción de cuándo son accionadas:

Excepcion
Se ejecuta ...
SQLCODE
ACCESS_INTO_NULL
El programa intentó asignar valores a los atributos de un objeto no inicializado
-6530
COLLECTION_IS_NULL
El programa intentó asignar valores a una tabla anidada aún no inicializada
-6531
CURSOR_ALREADY_OPEN
El programa intentó abrir un cursor que ya se encontraba abierto. Recuerde que un cursor de ciclo FOR automáticamente lo abre y ello no se debe especificar con la sentencia OPEN
-6511
DUP_VAL_ON_INDEX
El programa intentó almacenar valores duplicados en una columna que se mantiene con restricción de integridad de un índice único (unique index)
-1
INVALID_CURSOR
El programa intentó efectuar una operación no válida sobre un cursor
-1001
INVALID_NUMBER
En una sentencia SQL, la conversión de una cadena de caracteres hacia un número falla cuando esa cadena no representa un número válido
-1722
LOGIN_DENIED
El programa intentó conectarse a Oracle con un nombre de usuario o password inválido
-1017
NO_DATA_FOUND
Una sentencia SELECT INTO no devolvió valores o el programa referenció un elemento no inicializado en una tabla indexada
100
NOT_LOGGED_ON
El programa efectuó una llamada a Oracle sin estar conectado
-1012
PROGRAM_ERROR
PL/SQL tiene un problema interno
-6501
ROWTYPE_MISMATCH
Los elementos de una asignación (el valor a asignar y la variable que lo contendrá) tienen tipos incompatibles. También se presenta este error cuando un parámetro pasado a un subprograma no es del tipo esperado
-6504
SELF_IS_NULL
El parámetro SELF (el primero que es pasado a un método MEMBER) es nulo
-30625
STORAGE_ERROR
La memoria se terminó o está corrupta
-6500
SUBSCRIPT_BEYOND_COUNT
El programa está tratando de referenciar un elemento de un arreglo indexado que se encuentra en una posición más grande que el número real de elementos de la colección
-6533
SUBSCRIPT_OUTSIDE_LIMIT
El programa está referenciando un elemento de un arreglo utilizando un número fuera del rango permitido (por ejemplo, el elemento “-1”)
-6532
SYS_INVALID_ROWID
La conversión de una cadena de caracteres hacia un tipo rowid falló porque la cadena no representa un número
-1410
TIMEOUT_ON_RESOURCE
Se excedió el tiempo máximo de espera por un recurso en Oracle
-51
TOO_MANY_ROWS
Una sentencia SELECT INTO devuelve más de una fila
-1422
VALUE_ERROR
Ocurrió un error aritmético, de conversión o truncamiento. Por ejemplo, sucede cuando se intenta calzar un valor muy grande dentro de una variable más pequeña
-6502
ZERO_DIVIDE
El programa intentó efectuar una división por cero
-1476

EXCEPCIONES DE ORACLE

MANEJO DE EXCEPCIONES
    En PL/SQL una advertencia o condición de error es llamada una excepción.
    Las excepciones se controlan dentro de su propio bloque.La estructura de bloque de una excepción se muestra a continuación.
DECLARE
 -- Declaraciones
BEGIN

  -- Ejecucion
EXCEPTION

  -- Excepcion
END;
Cuando ocurre un error, se ejecuta la porción del programa marcada por el bloque EXCEPTION, transfiriéndose el control a ese bloque de sentencias.
    El siguiente ejemplo muestra un bloque de excepciones que captura las excepciones NO_DATA_FOUND y ZERO_DIVIDE. Cualquier otra excepcion será capturada en el bloque WHEN OTHERS THEN.
DECLARE -- Declaraciones
BEGIN

  -- Ejecucion
EXCEPTION

WHEN NO_DATA_FOUND THEN

  -- Se ejecuta cuando ocurre una excepcion de tipo NO_DATA_FOUND
WHEN ZERO_DIVIDE THEN

  -- Se ejecuta cuando ocurre una excepcion de tipo ZERO_DIVIDE

WHEN OTHERS THEN

  -- Se ejecuta cuando ocurre una excepcion de un tipo no tratado
  -- en los bloques anteriores

END; 
Como ya hemos dicho cuando ocurre un error, se ejecuta el bloque EXCEPTION, transfiriéndose el control a las sentencias del bloque. Una vez finalizada la ejecución del bloque de EXCEPTION no se continua ejecutando el bloque anterior.
    Si existe un bloque de excepcion apropiado para el tipo de excepción se ejecuta dicho bloque. Si no existe un bloque de control de excepciones adecuado al tipo de excepcion se ejecutará el bloque de excepcion WHEN OTHERS THEN (si existe!). WHEN OTHERS debe ser el último manejador de excepciones.
    Las excepciones pueden ser definidas en forma interna o explícitamente por el usuario. Ejemplos de excepciones definidas en forma interna son la división por cero y la falta de memoria en tiempo de ejecución. Estas mismas condiciones excepcionales tienen sus propio tipos y pueden ser referenciadas por ellos: ZERO_DIVIDE y STORAGE_ERROR.
    Las excepciones definidas por el usuario deben ser alcanzadas explícitamente utilizando la sentencia RAISE.
    Con las excepciones se pueden manejar los errores cómodamente sin necesidad de mantener múltiples chequeos por cada sentencia escrita. También provee claridad en el código ya que permite mantener las rutinas correspondientes al tratamiento de los errores de forma separada de la lógica del negocio.

miércoles, 24 de agosto de 2011

LEYES DE MURPHY ORIENTADAS A SISTEMAS

Ley de Murphy:
Si hay posibilidad de que algo salga mal, saldrá mal.
Corolarios:
Nada es tan fácil como parece
Todo lleva más tiempo del que usted piensa
Las cosas que se dejan para que se arreglen por sí solas, tienden a empeorar
Si existe la posibilidad de que varias cosas vayan mal, la que cause más perjuicios será la única que vaya mal.
Si usted intuye que hay cuatro posibilidades de que una gestión vaya mal y las evita, al momento aparecerá espontáneamente una quinta posibilidad.
En cuanto se ponga a hacer algo, se dará cuenta de que hay otra cosa que debería haber hecho antes.
Cualquier solución entraña nuevos problemas.
Es inútil hacer cualquier cosa a prueba de tontos, porque los tontos son muy ingeniosos.
La naturaleza siempre está de parte de la imperfección oculta.
La Madre Naturaleza es una perezosa

Lema de Murphy:
Sonría. Mañana puede ser peor.

Comentario de O'Toole:
Murphy era un optimista

Ley de la gravedad selectiva:
Los objetos tienden a caer en el punto en que más daño ocasionen.

Constante de Murphy:
La Materia se daña en proporción a su valor

Ley de la dinámica rotacional de la tostada que cae:
La tostada caerá con la cara que contenga la mermelada hacia abajo.

Ley de Chisholm:
Cuando las cosas vayan bien, algo habrá que haga que vayan mal.
Corolarios:
Cuando parece que ya nada puede ir peor, empeora.
Cuando le parezca que las cosas van mejor, es que se le ha pasado algo por alto

Máxima de Manly:
La Lógica es un método sistemático para llegar con absoluta certeza a la conclusión equivocada.

Paradoja de Murphy:
Siempre es más fácil hacerlo de la forma más difícil

Ley de Murphy sobre la Termodinámica:
Todo empeora a altas presiones

Ley de Gumperson:
La probabilidad de que ocurra un evento E es inversamente proporcional a la conveniencia de E

De la distancia mínima:
El camino mas corto entre dos puntos está prohibido o se encuentra inaccesible

Revisión cuantificada de la ley de Murphy
Todo va mal a la vez

Ley de Pudder:
Todo lo que empieza bien, acaba mal.
Lo que empieza mal, acaba de la puta pena.

Principio de Incertidumbre de Heissemberg:
La localización de todos los objetos no se puede conocer de forma simultánea.
Corolario: Si se encuentra un objeto que estaba perdido, desaparecerá otro.

Ley de Maryann:
Siempre se puede hallar lo que no se busca

Observación de Oiens:
La forma más rápida de encontrar algo es empezar a buscar otra cosa

Ley de Boob:
Las cosas siempre se encuentran en el último sitio en que se mira

Fenómenos Telefónicos de Frank:
Si tiene lápiz, no tiene papel
Si tiene papel, no tiene lápiz
Si tiene papel y lápiz, nadie le dejará recados

Síntesis de Schnatterly sobre los corolarios:
Si algo no puede salir mal, saldrá mal

Paradoja de Siverman:
Si la ley de Murphy tiene que salir mal, saldrá mal.

Extención a la ley de Murphy:
Si una serie de sucesos puede salir mal, saldrá mal en la peor secuencia posible

Corolario de Farndick del quinto corolario:
Después que las cosas hayan ido de mal en peor, el ciclo se repetirá.

Extensión de Gattusso de la ley de Murphy
Nada es tan malo nunca como para que no pueda empeorar

Anexo a la ley de Murphy
En términos matemáticos precisos, 1+1=2, donde "=" significa "rara vez, si acaso"

Cita de Grossman sobre Mencken
Los problemas complejos, tienen soluciones erróneas sencillas y fáciles de entender

Ley de Imbesi sobre la conservación de la suciedad
Para limpiar algo, hay que ensuciar otra cosa.

Extensión de Freeman
Pero se puede ensuciar todo sin limpiar nada

Ley Inaplicable
Lavar el carro para que llueva, suele no dar resultado

Ley de Perrusel
No hay tarea tan simple que no pueda hacerse mal

Leyes de Lackland
Nunca sea el primero
Nunca sea el último
Nunca se ofrezca de voluntario

Ley de Allen
Casi siempre es más fácil entrar que salir

Ley de Frothingham
La urgencia de algo es inversamente proporcional a su importancia

Ley de Young sobre la movilidad inanumada
Todos los objetos inanimados, pueden moverse lo suficiente como para estorbar.

Postulado de Harrison
Para cualquier acción, exite una crítica igual y opuesta

Ley de la perversidad de la naturaleza
No se puede determinar de antemano de que lado del pan se unta la manteca (Colaboración de Go,Ve,F4)

Principio de Pfeifer
Nunca tome una decisión si puede lograr que la tome otro en su lugar
Corolario: Nadie lleva un registro de las decisiones que usted pudo haber tomado, pero se evitaron. Todo el mundo lleva un registro de las que tomó y resultaron un desastre

Ley de Wellington sobre la Autoridad
La crema sube a la superficie
La mierda, también

Placebo de Peter
Un gramo de imagen equivale a un kilo de rendimiento

Axioma de Vail
En cualquier empresa humana, el trabajo busca el nivel jerárquico inferior.

Problemática.
LEY DE SMITH.
* Ningún problema verdadero tiene solución.

LEY DE HOARE SOBRE LOS GRANDES PROBLEMAS.
* En cada problema grande hay un problema pequeño que lucha por salir.

LEY INVERSA DE SCHAINKER A LA LEY DE HOARE SOBRE LOS GRANDES PROBLEMAS.
* En cada problema pequeño hay un problema grande que lucha por salir.