InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
Tutorial PL/SQL
Introducción a PLSQL
Programación con PL/SQL
Fundamentos de PL/SQL
Tipos de datos en PL/SQL
Operadores en PL/SQL
Estructuras de control en PL/SQL
Bloques PL/SQL
Cursores en PL/SQL
Cursores Implicitos en PL/SQL
Cursores Explicitos en PL/SQL
Cursores de actualización en PL/SQL
Excepciones en PL/SQL
Excepciones personalizadas en PL/SQL
Propagacion de excepciones en PL/SQL
Subprogramas en PL/SQL
Procedimientos almacenados en PL/SQL
Funciones en PL/SQL
Triggers en PL/SQL
Subprogramas en bloques anónimos
Paquetes en PL/SQL
Registros PL/SQL
Tablas PL/SQL
Tipo VARRAY
BULK COLLECT
Transacciones con PL/SQL
Transacciones autónomas
SQL Dinamico
Funciones integradas de PL/SQL
Secuencias
PL/SQL y Java
También puedes ver ...
Excepciones personalizadas en PL/SQL
Como conectar a ORACLE con Java
Recuperar datos BLOB de ORACLE
Trabajar con datos de tipo BLOB en ORACLE
PL/SQL y Java
Secuencias
Transacciones autónomas
SQL Dinamico
Funciones integradas de PL/SQL
Transacciones con PL/SQL


Estructuras de control en PL/SQL

Estrcuturas de control de flujo

   En PL/SQL solo disponemos de la estructura condicional IF. Su sintaxis se muestra a continuación:

	
IF (expresion) THEN -- Instrucciones ELSIF (expresion) THEN -- Instrucciones ELSE -- Instrucciones END IF;

   Un aspecto a tener en cuenta es que la instrucción condicional anidada es ELSIF y no "ELSEIF".

Sentencia GOTO

    PL/SQL dispone de la sentencia GOTO. La sentencia GOTO desvia el flujo de ejecució a una determinada etiqueta.

    En PL/SQL las etiquetas se indican del siguiente modo: << etiqueta >>

    El siguiente ejemplo ilustra el uso de GOTO.


DECLARE
  flag NUMBER;
BEGIN
  flag :=1 ;
  IF (flag = 1) THEN
     GOTO paso2;    
  END IF;
<<paso1>>
         dbms_output.put_line('Ejecucion de paso 1');
<<paso2>>
         dbms_output.put_line('Ejecucion de paso 2');
END;

Bucles

   En PL/SQL tenemos a nuestra disposición los siguientes iteradores o bucles:

  • LOOP
  • WHILE
  • FOR

   El bucle LOOP, se repite tantas veces como sea necesario hasta que se fuerza su salida con la instrucción EXIT. Su sintaxis es la siguiente


LOOP -- Instrucciones IF (expresion) THEN -- Instrucciones EXIT; END IF; END LOOP;

   El bucle WHILE, se repite mientras que se cumpla expresion.


WHILE (expresion) LOOP -- Instrucciones END LOOP;

   El bucle FOR, se repite tanta veces como le indiquemos en los identificadores inicio y final.

	
FOR contador IN [REVERSE] inicio..final LOOP -- Instrucciones END LOOP;

    En el caso de especificar REVERSE  el bucle se recorre en sentido inverso.


Inicio | Tutorial PL/SQL Operadores en PL/SQLTutorial PL/SQLBloques PL/SQL Versión para imprimir Foros de consulta

 
no manchen por yo
Respuesta recibida el [11/06/2007 09:57:37]
wau wau besta bien largo

 
Exit When por Jose Miguel
Respuesta recibida el [28/09/2007 04:48:10]
En el bucle Loop es muy util utilizar EXIT WHEN (sentencia) ya que te evita un grupo IF.

 
Buena acotacion por santosheaven
Respuesta recibida el [06/12/2007 07:54:58]
Muy Buena acotacon gracias..!

 
Estructuras de control por Richard Evangelista
Respuesta recibida el [11/01/2008 03:59:56]
Hola, felicitarle por la ayuda
pero si me puedes ayudar con:

¿Cómo imprimir en la herramienta isqlplus (Web) lo siguiente?

dbms_output.put_line('Ejecucion de paso 1');

 
RICHARD por JOSUE
Respuesta recibida el [18/02/2008 02:41:47]
ASEGURATE DE PONER 
SET SERVEROUTPUT ON;

DECLARE
-INSTRUCCIONES
END;

 
Mejor Imposible por Zurdo
Respuesta recibida el [24/03/2009 12:50:13]
Creo que saldria mas fácil decir que no posee pero claro no tendria ningun tema que discutir, es simplemente sorprendente.

 
Ayuda con LOOP por Roger
Respuesta recibida el [05/05/2009 06:23:38]
Hola este es un buen material.
Podrian ayudarme a crear un ciclo con loop que haga un insert, pero que sea para n cantidad de valores, es decir que lleve tambien un contador, porque los datos van separados por un(|)

 
ejemplos varios por felipe
Respuesta recibida el [10/07/2009 12:51:55]
DECLARE 
CURSOR cpaises
IS
SELECT CO_PAIS, DESCRIPCION, CONTINENTE
FROM PAISES;
co_pais VARCHAR2 (3);
descripcion VARCHAR2 (50);
continente VARCHAR2 (25);
BEGIN
OPEN cpaises;
FETCH cpaises INTO co_pais,descripcion,continente;
CLOSE cpaises;
END;
DECLARE
CURSOR cpaises
IS
SELECT CO_PAIS, DESCRIPCION, CONTINENTE
FROM PAISES;
registro cpaises%ROWTYPE;
BEGIN
OPEN cpaises;
FETCH cpaises INTO registro;
CLOSE cpaises;
END;

DECLARE
CURSOR cpaises (p_continente VARCHAR2)
IS
SELECT CO_PAIS, DESCRIPCION, CONTINENTE
FROM PAISES
WHERE CONTINENTE = p_continente;
registro cpaises%ROWTYPE;
BEGIN
OPEN cpaises ('EUROPA');
FETCH cpaises INTO registro;
CLOSE cpaises;
END;
DECLARE
CURSOR cpaises
IS
SELECT CO_PAIS, DESCRIPCION, CONTINENTE
FROM PAISES;
co_pais VARCHAR2 (3);
descripcion VARCHAR2 (50);
continente VARCHAR2 (25);
BEGIN
OPEN cpaises;
LOOP
FETCH cpaises INTO co_pais,descripcion,continente;
EXIT WHEN cpaises%NOTFOUND;
dbms_output.put_line(descripcion);
END LOOP;
CLOSE cpaises;
END;
DECLARE
CURSOR cpaises
IS
SELECT CO_PAIS, DESCRIPCION, CONTINENTE
FROM PAISES;
co_pais VARCHAR2 (3);
descripcion VARCHAR2 (50);
continente VARCHAR2 (25);
BEGIN
OPEN cpaises;
FETCH cpaises INTO co_pais, descripcion, continente;
WHILE cpaises%found
LOOP
dbms_output.put_line (descripcion);
FETCH cpaises INTO co_pais, descripcion, continente;
END LOOP;
CLOSE cpaises;
END;
DECLARE
CURSOR cpaises
IS
SELECT CO_PAIS, DESCRIPCION, CONTINENTE
FROM PAISES;
registro cpaises%ROWTYPE;
BEGIN
FOR registro IN cpaises
LOOP
dbms_output.put_line(registro.descripcion);
END LOOP;
END;

DECLARE
CURSOR cpaises IS
select CO_PAIS, DESCRIPCION, CONTINENTE
from paises
FOR UPDATE;
co_pais VARCHAR2 (3);
descripcion VARCHAR2 (50);
continente VARCHAR2 (25);
BEGIN
OPEN cpaises;
FETCH cpaises INTO co_pais, descripcion, continente;
WHILE cpaises%found
LOOP
UPDATE PAISES
SET CONTINENTE = CONTINENTE || '.'
WHERE CURRENT OF cpaises;
FETCH cpaises INTO co_pais, descripcion, continente;
END LOOP;
CLOSE cpaises;
COMMIT;
END;

 
mas ejemplos por felipe
Respuesta recibida el [10/07/2009 12:53:55]
EXCEPCIONES 
DECLARE
-- Declaramos una excepción identificada por VALOR_NEGATIVO
VALOR_NEGATIVO EXCEPTION;
valor NUMBER;
BEGIN
-- Ejecución
valor:= -1;
IF valor < 0 THEN
RAISE VALOR_NEGATIVO;
END IF;
EXCEPTION
-- Excepción
WHEN VALOR_NEGATIVO THEN
dbms_output.put_line ('El valor no puede ser negativo');
END;

DECLARE
v_div NUMBER;
BEGIN
SELECT 1/0 INTO v_div FROM DUAL;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR (-20001,'No se puede dividir por cero');
END;

PROCEDIMIENTOS ALMACENADO
CREATE OR REPLACE
PROCEDURE Actualiza_Saldo(cuenta NUMBER,
new_saldo NUMBER DEFAULT 10 )
IS
-- Declaracion de variables locales
BEGIN
-- Sentencias
UPDATE SALDOS_CUENTAS
SET SALDO = new_saldo,
FX_ACTUALIZACION = SYSDATE
WHERE CO_CUENTA = cuenta;

END Actualiza_Saldo;
Existen dos formas de pasar argumentos a un procedimiento almacenado a la hora de ejecutarlo (en realidad es válido para cualquier subprograma). Estas son:
Notación posicional: Se pasan los valores de los parámetros en el mismo orden en que el procederé los define.

BEGIN
Actualiza_Saldo(200501,2500);
COMMIT;
END;
Notación nominal:Se pasan los valores en cualquier orden nombrando explícitamente el parámetro.
BEGIN
Actualiza_Saldo(cuenta => 200501,new_saldo => 2500);
COMMIT;
END;
FUNCIONES
CREATE OR REPLACE
FUNCTION fn_Obtener_Precio(p_producto VARCHAR2)
RETURN NUMBER
IS
result NUMBER;
BEGIN
SELECT PRECIO INTO result
FROM PRECIOS_PRODUCTOS
WHERE CO_PRODUCTO = p_producto;
return(result);
EXCEPTION
WHEN NO_DATA_FOUND THEN
return 0;
END ;
Una vez creada y compilada la función podemos ejecutarla de la siguiente forma:
DECLARE
Valor NUMBER;
BEGIN
Valor := fn_Obtener_Precio('000100');
END;
Las funciones pueden utilizarse en sentencias SQL de manipulación de datos (SELECT, UPDATE, INSERT y DELETE):
SELECT CO_PRODUCTO,
DESCRIPCION,
fn_Obtener_Precio(CO_PRODUCTO)
FROM PRODUCTOS;
TRIGGERS
Create or remplace trigger valida_dep
After insert or update
On departments
For each row
Begin
If (new.department_id=500)then
Raise_aplication_error(-2001,’el depo_id no pude ser 500’)
End if;
En valida_dep

CREATE TRIGGER tr1_empleados
BEFORE INSERT OR UPDATE OF salario
ON empleados
FOR EACH ROW
WHEN (:new.salario > 5000);
BEGIN
UPDATE empleados
SET salario = 5000
WHERE empleado_id = :new.empleado_id;
END;

CREACION DE UNA TABLA

CREATE TABLE AUDITORIA
( Nombre VARCHAR2(60),
usuario VARCHAR2(60),
fecha DATE,
operacion VARCHAR2(60),
observacion VARCHAR2(60));

ALTER TABLE AUDITORIA ADD CONSTRAINT PK_auditoria
PRIMARY KEY (Nombre, usuario, fecha);

ALTER TABLE employees
ADD (agrego_salario number);

 
Muy interesante. por xuser83
Respuesta recibida el [19/08/2009 06:31:50]
Esta muy bien y muy interesante..

 
sentencia go to por unoQsabe
Respuesta recibida el [17/02/2010 05:21:25]
la sentencia go to no deberias ni de ponerla en el manual, porque rompe uno de los principios básicos de la programación estructurada.

En cualquier lenguaje de programación estructurado tu ponle en un examen al profesor una sentencia de esas y veras luego la nota, pondrá: go to Septiembre.


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



Inicio | Tutorial PL/SQL Operadores en PL/SQLTutorial PL/SQLBloques PL/SQL Versión para imprimir

Estructuras de control en PL/SQL
Autor: Pedro Herrarte Sánchez
Visitas: 145926 Fecha de publicación: 01/04/2006
Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación.

Posee mas de diez años de experiencia trabajando para las principales empresas de España.

Es especialista en tecnologías .NET, entornos Web, bases de datos (SQL Server y ORACLE) e integración de sistemas.

Es experto en desarrollo (C#, ASP.NET, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE).

Es fundador, diseñador y programador de www.devjoker.com.




Visitas: 106 | Comentarios: 3 | Archivo: Articulos
02/02/2010 iPad vs Telesketch
Visitas: 806 | Comentarios: 2 | Archivo: Articulos
Categorias: Humor
Visitas: 762 | Comentarios: 3 | Archivo: Articulos
Visitas: 3174 | Comentarios: 2 | Archivo: Articulos
Categorias: C#
Visitas: 14553 | Comentarios: 7 | Archivo: Articulos
Categorias: C#|Seguridad
Visitas: 1492 | Comentarios: 3 | Archivo: Articulos
Visitas: 695 | Comentarios: 2 | Archivo: Articulos
Visitas: 369 | Comentarios: 0 | Archivo: Articulos
Visitas: 2034 | Comentarios: 2 | Archivo: Articulos
Categorias: C#

Útimos temas recibidos en los foros ...
devolver consulta en form builder de oracle con like por cesar10lb ... [ORACLE] 0 13/03/2010
certificado por jhon jairo vargas ... [Actualidad] 0 13/03/2010
certificado de cesantias horizonte por yeimmy ... [Actualidad] 4 13/03/2010
solicito certificado de pensiones y sesantias para laborar por maria eugenia garcia m. ... [Actualidad] 0 13/03/2010
certificado de fondos de pensiones horizonte por mona ... [Actualidad] 6 03/03/2010
certificado pensiones por nelly moreno ... [Actualidad] 0 13/03/2010
certificado de pensiones del bbva horizonte por danger ... [Actualidad] 125 12/01/2010
cerificado fondo horizonte de pensiones y cesantias por carlos fideligno torres herrera ... [Actualidad] 147 18/01/2010
certuficado de afiliacion a porvenir por ede ... [Actualidad] 6 05/02/2010
certificado pensiones horizonte por angela patricia rodriguez ... [Actualidad] 136 26/01/2010
Solicitud certificado de afiliaciones a pensiones y cesantias proteccion por hz ... [Actualidad] 59 10/02/2010
necesito certificado de afiliacíon a pensiones por jelo ... [Actualidad] 0 12/03/2010

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
03/10/2006 Instrucciones    forma parte de...Tutorial C#
04/01/2007 Modificadores de visibilidad de bloques get y set    forma parte de...Tutorial C#
03/10/2006 Operadores    forma parte de...Tutorial C#
03/10/2006 Fundamentos de C#    forma parte de...Tutorial C#
10/10/2006 Como conectar a ORACLE con Java
24/05/2006 Cursores Explicitos en PL/SQL    forma parte de...Tutorial PL/SQL
22/03/2008 Problemas al conectar a redes wifi con Windows Vista
09/10/2006 Cadenas de texto    forma parte de...Tutorial C#
06/05/2007 Introducción a Transact SQL    forma parte de...Tutorial de Transact SQL
03/10/2006 Programacion con C#    forma parte de...Tutorial C#

 

Encuesta
¿A que perfil te adaptas mejor?




[Ver] [Votar]