Archivo de Julio 2007

Capitulo 4

Julio 14, 2007

Identificadores

Un identificador es un nombre para las unidades de PL/SQL, las cuales pueden ser:

  • Constantes
  • Variables
  • Excepciones
  • Cursores
  • Variables de cursor
  • Sub programas
  • Paquetes

Un identificador consiste de letras seguidas de manera opcional por más letras, numerales, underscores, hasta un máximo de 30 caracteres además que debe comenzar con una letra. Otros caracteres como guiones(-), diagonales(/) y espacios no son aceptados.

Ejemplos invalidos:

Hombre&mujeres: no es valido por el ampersand.

Debito-total: no es valido por el guion.

On/off: no es valido por la diagonal.

User id: no es valido por los espacios.

 

Ejemplos validos:

Total$endolares

No#Emp

User_id

 

El nombre del identificador puede ir en mayúsculas o minúsculas, para PL/SQL no hay diferencia al respecto.

Los siguientes significan lo mismo:

Apellido_parterno

APELLIDO_PATERNO

 

Palabras reservadas

Algunos identificadores llamados palabras reservadas tienen un significado especial para PL/SQL. Por ejemplo las palabras BEGIN y END son reservadas.

 

Identificadores entre comillas “”

Para flexibilidad PL/SQL permite tener identificadores entre comillas.

Ejemplos:

“X+Y”

“apellido paterno”

“on/off”

Aunque anterior mente se menciono que no era posible tener caracteres “raros” en el nombre, en el caso que se utilice un identificador entre comillas este puede contener cualquier carácter.

 

NOTA.- Aunque PL/SQL permite declarar este tipo de identificadores en mi experiencia nunca he tenido la necesidad de hacerlo. Otra cosa que hay que tener en cuenta es que una vez que se declara un identificador de esta manera cualquier referencia dentro del código debe ser de esa misma manera.

 

Literales

Una literal es un valor explicito que no representa un identificador como números, caracteres, cadenas de caracteres.

Números

.- Dos tipos de literales numéricas existen para las operaciones: enteros y reales. Un entero es un numero completo sin punto decimal y puede tener signo (+,-). Un número real es aquel que es completo o fraccional con el punto decimal además de tener signo.

Ejemplos:

Entero: 030, 6, -20, +45677

Real: 6.666, 0.0, -15.9

 

 

Notación Científica

Los números también pueden especificarse en notación científica por medio de la letra E o e.

Ejemplos:

2E5, 1.03E-7, 3.14159e0, -1E23, -9.7e-23

 

Literales de Carácter y cadenas

Los caracteres y cadenas en PL/SQL son encerrados entre comillas sencillas (apostrofes). Estos pueden contener todo tipo de caracteres desplegables dentro del set de caracteres de PL/SQL como: letras, números, espacios y símbolos especiales.

Ejemplos:

‘Z’, ‘%’,'75656ddff’, ‘34435%$#%$)’

 

NOTA.- Cuidado de no confundir el nombre de un identificador con comillas dobles (“valor-total”) con el valor de una literal de caracteres (‘valor-total’), estas son dos cosas diferentes para PL/SQL. Recuerde que siempre que desee utilizar una cadena(string) debe hacerlo en comillas sencillas.

Literales Booleanas

Estas literales únicamente tienen los valores predefinidos TRUE, FALSE y NULL. Recuerde que este tipo de literales son valores y no cadenas de caracteres.

 

Literales de tiempo/fecha

Este tipo puede tener varios formatos dependiendo el tipo de dato.

Ejemplo:

DECLARE

d1 DATE := DATE ‘1998-12-25′;

t1 TIMESTAMP := TIMESTAMP ‘1997-10-22 13:01:01′;

t2 TIMESTAMP WITH TIME ZONE := TIMESTAMP ‘1997-01-31 09:26:56.66 +02:00′;

– Tres años y dos meses

– Para mayor precision se utiliza el intervalo day-to-second

i1 INTERVAL YEAR TO MONTH := INTERVAL ‘3-2′ YEAR TO MONTH;

– Cinco dias, cuatro horas, 3 minutos, 2 segundos y 1 centesima de segundo i2 INTERVAL DAY TO SECOND := INTERVAL ‘5 04:03:02.01′ DAY TO SECOND;

 

Comentarios en PL/SQL

PL/SQL ignora los comentarios que encuentra en el código. Los comentarios agregan comprensión sobre que esta realizando el programa. Generalmente se recomienda utilizar comentarios para explicar que es lo que esta haciendo un determinado bloque de código. En PL/SQL existen dos tipos de comentarios: por línea y multi linea.

Línea simple

Este tipo de comentarios comienza con doble guion (–).

Ejemplo:

BEGIN

-- la siguiente linea no hace nada.

   Null;

   Dbms_output.put_line('esta es una prueba');--imprimir mensaje

END;

/

 

Multi linea

Este tipo de comentarios inicia con (/*) y termina por (*/) teniendo los comentarios entre esos dos delimitadores.

Ejemplo:

DECLARE

   some_condition BOOLEAN;

   pi NUMBER := 3.1415926;

   radius NUMBER := 15;

   area NUMBER;

BEGIN

  /* Hacer una verificacion de codigo */

  IF 2 + 2 = 4 THEN

    some_condition := TRUE; /* Cuando entre aqui va a regresar TRUE */

  END IF;

  /* La siguiente linea calcula el area

Del circulo usando PI, una vez

Calculada el area esta es desplegada en la pantalla.

 */

  area := pi * radius**2;

  DBMS_OUTPUT.PUT_LINE('The area is: ' || TO_CHAR(area));

END;

/

 

NOTA.- No se puede tener comentarios anidados.

Ejemplo:

Begin

/* comentario

/* otro comentario

Bla bla bla

*/

Blablabla

*/

End;

 

Capitulo 3

Julio 3, 2007

Aunque los bloques anónimos son muy útiles, sobre todo en la creación de scripts para ejecución batch ó de otro tipo. Regularmente se utilizan los bloques nombrados, algunos ejemplos que ya se mencionaron son los stored procedures, functions, triggers,etc.

Bloques anidados

En el capitulo anterior mencione que se pueden tener bloques dentro de otros bloques, a este tipo de diseño se le conoce como bloques anidados (nested blocks). Como ya se mencionó anteriormente, PL/SQL esta basado en el lenguaje de programación ADA y por consiguiente Pascal, PL/SQL es un lenguaje de bloques estructurados. En los ejemplos anteriores mencione que un bloque anónimo puede contener otro bloque anónimo; en el caso de los bloques nombrados sucede lo mismo, éstos pueden tener bloques anónimos y/o nombrados dentro de ellos.

Ejemplo:

PROCEDURE print_message IS

BEGIN

    DBMS_OUTPUT.PUT_LINE('prueba');

 

    BEGIN

       DBMS_OUTPUT.PUT_LINE('bloque interno');

    EXCEPTION

    WHEN OTHERS THEN

       DBMS_OUTPUT.PUT_LINE('error encontrado');

    END;

 

EXCEPTION

WHEN OTHERS THEN

    DBMS_OUTPUT.PUT_LINE('error encontrado en bloque principal');

END;

 

En el ejemplo anterior hay un bloque anónimo dentro de un bloque nombrado (procedure), dentro del bloque anónimo se va a imprimir el mensaje bloque interno y/o el mensaje de error error encontrado.

PROCEDURE print_message IS

 

   procedure mess is

   begin

     dbms_output.put_line('programa interno');

   end;

BEGIN

   mess();

END;

 

En éste ejemplo se puede ver que se tiene un stored procedure dentro de otro stored procedure.

 

El conjunto de caracteres de PL/SQL (character set)

El tipo de caracteres que se utiliza en PL/SQL es el US7ASCII.

Tipo

Caracteres

Letras

A-Z, a-z

Dígitos

0-9

Símbolos

~ ! @ # $ % * ( ) _ – + = | : ; ” ‘ < > , . ? / ^

Espacios en blanco

Tab, espacio, nueva línea, retorno de carro.

 

Símbolos en PL/SQL

Símbolo

Descripción

;

Termina las líneas de PL/SQL

%

Indicador de atributos como %ISOPEN de los cursores ó %ROWTYPE para la declaración de variables.

_

Underscore. Se utiliza en la condition de LIKE.

@

Indicador de localización remota.

:

Variables bind.

<>, ¡=, ^=,~=

Diferente

||

Concatenación

<< >>

Etiquetas

<=,>=

Comparación

:=

Asignación de valores.

=>

Operador de asociación

..

Rangos

/* */

Comentarios de varias líneas

Comentarios de una linea

 

Respuestas del capitulo anterior.

1.-

SQL> declare

  2  v_var number;

  3  begin

  4  null;

  5  exception

  6  when others then

  7  null;

  8  end;

  9  /

 

PL/SQL procedure successfully completed.

 

2.-

SQL> begin

  2     begin

  3       begin

  4         null;

  5       end;

  6     end;

  7  end;

  8  /

 

PL/SQL procedure successfully completed.

 

3.-

SQL> begin

  2     begin

  3       null;

  4     end;

  5     begin

  6       null;

  7     end;

  8  end;

  9  /

 

PL/SQL procedure successfully completed.

 

4.-

SQL> begin

  2  null;

  3  exception

  4  when others then

  5     begin

  6       null;

  7     end;

  8  end;

  9  /

 

PL/SQL procedure successfully completed.