¿Como funciona la condición IF and ELSE en PL/SQL?



La sentencia IF (si) se utiliza para condicionar bloques de código que necesitamos ejecutar a veces, las sentencias if pueden utilizarse en cualquier bloque de código PL/SQL como funciones, procedimientos, paquetes, bloques anónimos.

Sentencia Base IF:

if condición then --Inicia el if
  --Código que desea ejecutar al cumplir la condición.
end if; --Termina el if
Cuando la condición no se cumple el bloque de código no se ejecuta, pero en muchos casos se necesita que si esa condición no se cumple realice otro proceso, para poder realizar esto utilizamos la sentencia ELSE (sino).

Sentencia Base ELSE:

if condición then --Inicia el if
  --Código if
else --Inicia el else(sino)
  --Código que se ejecutara si no se cumple la condición del if
end if; --Termina el if

Dentro de una sentencia if podemos tener más sentencias if y dentro de un else podemos agregar otras sentencias if, a esto se le conoce como if anidado, se recomienda no tener más de 3 if anidados, en caso de tener muchos if es mejor utilizar el CASE  o ELSEIF dependiendo la necesidad.

Ejemplo: Se requiere conocer si la suma de 2 números es mayor o menor que 0.

declare
 
  numero1 number;
  numero2 number;
  total   number;
 
begin
 
  numero1 := 10;
  numero2 := -15;
 
  total := numero1+numero2;

  if total > 0 then
    dbms_output.put_line('El número es mayor a 0, resultado: '||total);
  else
    dbms_output.put_line('El número es menor a 0, resultado: '||total);
  end if;

end;

OUTPUT:

Crear cursores (Cursor) en PL/SQL



Los cursores son sentencias SQL select  que se utilizan dentro de bloques PL/SQL para realizar consulta a bases de datos. 

Sentencia base:

Cursor nombre_cursor (variable tipo_dato) is --Se crea el cursor
  Select * --Sentencia select
  From nombre_tabla;

El cursor se debe crear en la  declaración del bloque sea un procedimiento, función o bloque anónimo,  un bloque puede contener uno o más cursores, para dar uso a un cursor este se puede hacer utilizando la sentencia OPEN, FETCH, INTO y CLOSE.

OPEN: Indica que se abre el cursor.
FECTH: Prepara el cursor para obtener los valores por registro.
INTO: Variable en la cual se va a almacenar el valor recuperado por el fetch.
CLOSE: Cierra el cursor.

Ejemplo: Se requiere conocer el nombre de todos los empleados que ingresaron este año a la empresa.

Declare
  --Se declara el cursor
  Cursor cur_nombres is
    Select nombre
     From empleados
   Where to_char(fecha,’YYYY’)  = to_char(sysdate,’YYYY’);
    Nombre varchar2(200);

Begin

  OPEN cur_nombres; --abre el cursor
    Loop  --Ciclo que recorre el cursor

      FECTH cur_nombres INTO Nombre; --Pasa registro a registro el nombre encontrado
      Exit when  cur_nombres%notfound; --Indica que si no tiene datos el cursor salga del ciclo
      Dbms_output.put_line(Nombre); --Imprime el resultado

    End loop; --Fin del ciclo
  CLOSE cur_nombres; --Cierra el cursor

End;

Un cursor no puede realizar la función FETCH si no se ha realizado la función OPEN, y tampoco puede intentar volver a abrirse (OPEN) si aún no se ha realizado la sentencia CLOSE, en ambos casos el cursor genera un error.

Otra forma de recorrer un cursor es utilizando la sentencia FOR LOOP.

Declare
  Cursor cur_nombres is
    Select nombre
     From empleados
    Where to_char(fecha,’YYYY’)  = to_char(sysdate,’YYYY’);
    Nombre varchar2(200);
Begin
  FOR nombre IN cur_nombres LOOP
    Dbms_output.put_line(Nombre);
  END LOOP;
End;

Crear un paquete (Package) en PL/SQL Oracle



Un paquete es  bloque de código que se almacena en la base de datos, un paquete está compuesto por una especificación y un cuerpo, en la especificación se declaran los objetos que se van a utilizar, en el cuerpo se detalla la operación que realizara el objeto, como por ejemplo realizar un insert, un paquete puede tener   uno o más procedimientos, funciones y variables.

Sentencia Base Especificación:

create or replace package nombre_paquete is --Creación especificación del paquete
      --Variables
  --Funciones, procedimientos
  function nombre_objeto(variable tipo_de_variable) return tipo_de_variable;--Creación del objeto
 
end nombre_paquete;--Fin especificación del paquete

Sentencia Base Cuerpo:

create or replace package body nombre_paquete is --Creacion del cuerpo se le agrega body
  --Variables
  --Funciones, procedimientos

  function nombre_objeto(variable tipo_de_variable) return tipo_de_variable;--Creación del objeto
  begin --Inicio de la funcion
   
    return valor_de_retorno; --Retorna la variable
   
  end nombre_objeto; --Fin del objeto

end nombre_paquete; --Fin del paquete

Un paquete puede ser llamado por una otros objetos paquetes, funciones, procedimientos y bloques anónimos, se debe llamar el objeto utilizando el nombre del paquete punto(.) nombre del objeto. (Nombre_paquete.nombre_objeto), no todos los objetos que usa el paquete deben estar declarados en la especificación, pero si estos no son declarados en la especificación no podrán ser llamados por ningún otro objeto, estos objetos podrán utilizarse internamente en el paquete en el body.

Ejemplo: Se solicita la creación de una función que permita devolver una cadena de texto en mayúsculas y otra en minúsculas.

--Especificación:
create or replace package utilidades is

  function mayusculas(texto varchar2) return varchar2;
 
  function minisculas(texto varchar2) return varchar2;
 
end utilidades;

--Cuerpo:
create or replace package body utilidades is

  function mayusculas(texto varchar2) return varchar2 is
  begin
    return upper(texto);
  end mayusculas;
 
  function minisculas(texto varchar2) return varchar2 is 
  begin
    return lower(texto);
  end minisculas;
 
end utilidades;

--Llamado desde un bloque anónimo

declare
  minusculas varchar2(30);
  mayusculas varchar2(30);
begin
  minusculas := utilidades_kkk.minisculas('cArLOs MaRio ConZalEZ');
  mayusculas := utilidades_kkk.mayusculas('cArLOs MaRio ConZalEZ');
 
  dbms_output.put_line(minusculas);
  dbms_output.put_line(mayusculas);
end;

Output: