Si aprendes como se debe usar la sentencia IF en PL-SQL Packages en Oracle podrás estructurar rápidamente la toma de decisiones dentro de tus PL-SQL Procedures en Oracle y PL-SQL Function en Oracle.
A menudo es necesario tomar decisiones alternativas dentro de los PL-SQL Packages en Oracle dependiendo de las circunstancias o del contexto en donde estés construyendo tus PL-SQL Procedures en Oracle o PL-SQL Function en Oracle.
La sentencia IF te permite ejecutar una secuencia de declaraciones de forma condicional, es decir, si la secuencia se ejecuta o no en tus PL-SQL Packages en Oracle depende del valor de una condición. El valor de una condición debe ser verdadero (TRUE) para que sea ejecutado o falso (FALSE) para que no se ejecute.
La sentencia IF se puede usar de tres formas: IF-THEN, IF-THEN-ELSE and IF-THEN-ELSIF. Revisemos algunos ejemplos prácticos para que entiendas mejor como se debe utilizar la sentencia IF en tus PL-SQL Packages en Oracle.
Ejemplo #1: Supone que debes calcular un bono por las ventas que ha realizado cada empleado dependiendo de ciertas condiciones, veamos como se hace:
/* PL-SQL Packages en Oracle */
IF lin_ventas > 10000 THEN
lin_bono:= 500;
END IF;
UPDATE t_venta_empleado SET bono= lin_bono WHERE id_empleado = pin_id_empleado;
En este ejemplo se muestra la forma más simple la sentencia IF, donde se pregunta si las ventas fueron mayores que 10000, si la condición es verdadera se asigna un bono de 500, fíjate que en los PL-SQL Packages en Oracle siempre debes incluir la cláusula THEN y cerrar el bloque con END IF; (no es ENDIF;).
Ejemplo #2: Agreguemos ahora la cláusula ELSE al ejemplo anterior, veamos como se hace:
/* PL-SQL Packages en Oracle */
IF lin_ventas > 10000 THEN
lin_bono:= 500;
ELSE
lin_bono:= 200;
END IF;
UPDATE t_venta_empleado SET bono= lin_bono WHERE id_empleado = pin_id_empleado;
En este ejemplo se muestra la segunda forma de usar la sentencia IF incluyendo la cláusula ELSE para generar un caso contrario en tus PL-SQL Packages en Oracle, es decir, si la primera condición no es verdadera se asigna un bono de 200 y luego el control pasa a la instrucción UPDATE. También puedes anidar sentencias IF de la siguiente forma:
/* PL-SQL Packages en Oracle */
IF lin_ventas > 10000 THEN
lin_bono:= 500;
ELSE
IF lin_ventas < 5000 THEN
lin_bono:= 100;
ELSE
lin_bono:= 200;
END IF;
END IF;
UPDATE t_venta_empleado SET bono= lin_bono WHERE id_empleado = pin_id_empleado;
En este ejemplo se agrega otra sentencia IF para obtener un bono de 100 si las ventas son menores que 5000, de esta forma se pueden anidar todas las sentencias IF que sean necesarias.
Ejemplo #3: Veamos ahora como usar la cláusula ELSIF (no es ELSEIF) modificando el mismo ejemplo anterior:
/* PL-SQL Packages en Oracle */
IF lin_ventas > 10000 THEN
lin_bono:= 500;
ELSIF lin_ventas < 5000 THEN
lin_bono:= 100;
ELSE
lin_bono:= 200;
END IF;
UPDATE t_venta_empleado SET bono= lin_bono WHERE id_empleado = pin_id_empleado;
La cláusula ELSIF permite anidar condiciones mutuamente excluyentes, si la primera condición es falsa se evalúa la segunda condición y así sucesivamente. En este ejemplo de PL-SQL Packages en Oracle si las ventas son menores que 5000 se cumple la segunda condición y se asigna un bono de 100 y el control pasa a la instrucción UPDATE.
Te recomiendo que siempre se use el ELSIF en lugar de IF anidados, de esta manera el código de tus PL-SQL Packages en Oracle queda mas fácil de leer y de entender para modificaciones posteriores.
Te propongo que pruebes de inmediato estos ejemplos en tu Base de Datos con tus propias tablas, PL-SQL Procedures en Oracle y PL-SQL Function en Oracle, para que comiences a ejercitar la mano y aprendas a dominar esta nueva técnica en tus PL-SQL Packages en Oracle.
Estoy muy interesado en conocer tu opinión y/o comentario sobre este artículo, también cuéntame sobre qué es lo que quieres saber de PL-SQL Packages en Oracle y/o dime cuál es tu principal frustración a la hora de trabajar con PL-SQL Packages en Oracle. Estaré muy atento respondiendo tus preguntas y/o comentarios, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle
Director del Curso “Domina Tus Packages En Oracle“
Buenos ejemplos, explicación sencilla y directa al objetivo. Me sirvio de mucho estas notas. saludos!
Hola Alfredo, gracias por comunicarte y por tu excelente comentario, seguire escribiendo contenido que sea util para los lectores, gracias.
PD: Obtuviste mi reporte gratuito sobre ‘Cómo Construir un SELECT Eficiente en Oracle en Solo 7 Pasos’, su aun no lo has hecho puedes obtenerlo haciendo clic aqui:
https://dominatuspackagesen0racle.com/
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
En un sevidor tengo los catalogos contables, quiero pasarles a otro servidor, no se como hacerlo, por favor tu ayuda.
Hola estimado, gracias por comunicarte y por tu comentario, para pasar los catálogos contables a otro servidor debes generar un export de todas las tablas que contienen esos datos, el export te permite generar archivos sql con la estructura de las tablas, indices, insert de datos, etc. luego estos archivos sql deben ser ejecutados con un Import en el nuevo servidor para generar y cargar los datos tal como están en el servidor de origen; Existen varias herramientas que te permiten hacer un export, por ejemplo, el Toad y el Plsql-developer, gracias.
PD: Ya obtuviste mi reporte gratuito sobre “Cómo Construir un SELECT Eficiente en Oracle en Solo 7 Pasos”, si aún no lo tienes puedes obtenerlo haciendo clic aquí:
https://dominatuspackagesen0racle.com/
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Hola, en esta parte
UPDATE t_venta_empleado SET bono= lin_bono WHERE id_empleado = pin_id_empleado;
estas actualizando la tabla pero de donde viene
pin_id_empleado para que sirve?
Hola Luis, gracias por comunicarte y por tu comentario, la palabra pin_id_empleado es una variable que contiene el id del empleado para poder actualizar el registro, aqui estoy suponiendo que el update se esta haciendo dentro de un procedimiento o función y la variable pin_id_empleado llega como un parámetro al proceso, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
https://dominatuspackagesen0racle.com/
Muy buen artículo
Hola Eduardo, gracias por comunicarte y por tu comentario, me da gusto que la información te sea de utilidad, si te han gustado los artículos te invito a que compartas este enlace https://dominatuspackagesen0racle.com/ con tus amigos o personas que también les pueda interesar esta información, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
tengo creado este procedimiento pero al ejecutarlo me marcar error
create or replace procedure sp_numeros(num number)
is
par number :=0;
imp number :=0;
for n in 1 .. 10 loop
if(n%2=0)then
par:=par+n;
else
imp:=imp+n;
dbms_output.put_line(par);
end loop;
end;
Hola Alf, gracias por comunicarte, este procedimiento no se puede ejecutar ya que tiene un problema de sintaxis que no te permite compilarlo, te falta incluir el bloque begin entre las siguientes lineas:
imp number :=0;
begin
for n in 1 .. 10 loop
PD: Ya obtuviste mi libro-reporte sobre “Como Construir un SELECT Eficiente en Oracle en Solo 7 Pasos”, si aun no lo tienes puedes obtenerlo desde el enlace https://dominatuspackagesen0racle.com/.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Hola me gustaría saber si es obligatorio utilizarla sentencia if dentro de un pl\sql…
Estoy creando uno mas menos así:
If tipo_doce is not null then
Begins
Select tipo_doc_new from headers_docto
Where
Tipo_doce=’factura electronica’
Por
Tipo_doce=’factura normal’
Elsif tipo_doc_new is null
End if
Esto es para que si el nuevo tipo de documento es distinto a las facturas que comparo en el where el nuevo tipo de doc quede null
Favor ayudaa
Hola Beatriz, gracias por comunicarte, no es obligatorio usar la sentencia IF en PL/SQL, ya que puedes hacer un proceso sin usarla, pero si necesitas preguntar por un valor o aplicar condiciones en un proceso ahí si tienes que usarla, gracias.
PD: Ya obtuviste mi libro-reporte sobre ‘Cómo Contruir un SELECT Eficiente en ORACLE en Solo 7 Pasos’, si aun no lo has visto puedes obtenerlo desde este enlace: https://dominatuspackagesen0racle.com/
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
hola me gustaria saber si me puedes ayudar tengo que realizar un procedimiento almacenado en oracle donde me disminuya la cantidad de mi tabla de lineas de factura a mi stcok de mi tabla articulos y a su vez me actualice la tabla de articulos pero si no tengo suficientes articulos me inserte un error a mi tabla de errores ya tengo la disminucion y la actualizacion como puedo hacer q me inserte el error con una condicion esto es lo que tengo pliss ayudenme
CREATE OR REPLACE procedure stp_dto (p_linea IN int,
p_codfac IN int,
p_cant IN numeric,
p_codart IN varchar2,
p_precio IN numeric,
p_dto IN numeric)
as
begin
insert into tbl_lineas_fac values (p_linea,p_codfac,p_cant,p_codart,p_precio,p_dto);
commit;
update tbl_articulos
set stock=stock-p_cant
where codart= p_codart;
if sotck > 0 then
stock: = 1;
end if;
insert into tbl_errores (codfac,codart,detalle) values (p_codfac,p_codart, detalle (i));
end stp_dto;
Hola Angy, gracias por comunicarte, para validar si debes insertar un error primero debes hacer una consulta a la tabla de artículos y revisar si tienes stock suficiente, si tienes stock lo disminuyes, si no lo tienes insertas el error, es algo como lo siguiente:
begin
insert into tbl_lineas_fac values (p_linea,p_codfac,p_cant,p_codart,p_precio,p_dto);
commit;
select stock
into lin_stock
from tbl_articulos
where codart= p_codart;
lin_stock:= lin_stock – p_cant;
if lin_stock > 0 then
update tbl_articulos
set stock=stock-p_cant
where codart= p_codart;
else
insert into tbl_errores (codfac,codart,detalle) values (p_codfac,p_codart, detalle (i));
end if;
end stp_dto;
PD: Ya viste mi libro-reporte sobre ‘Cómo Crear un SELECT Eficiente en ORACLE en Solo 7 Pasos’, si aún no lo tienes puedes obtenerlo desde aquí: https://dominatuspackagesen0racle.com/, si te ha gustado el blog te invito a compartir el enlace https://dominatuspackagesen0racle.com/ con tu amigos o personas que también les pueda interesar este contenido, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Se podria hacer a la inversa? necesito hacer un select count dentro de un if () en una funcion. Se que lo podria hacer antes y guardar el count del select en variable y consultarlo, pero quiero evitar llamar siempre a una query innecesaria.
Hola Wekmentor, gracias por comunicarte, en pl-sql no se puede hacer un select dentro de un if, para hacer solo una query no hagas un count y has la búsqueda directamente y luego validas si se ha encontrado el dato.
PD: Ya pudiste ver mi libro reporte sobre ‘Cómo Crear un SELECT Eficiente en ORACLE en Solo 7 Pasos’, si aun no lo tienes en tus manos puedes obtenerlo desde aquí https://dominatuspackagesen0racle.com/
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.