 |
|
 |
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:
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. |
| |
 |
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
|
|

|
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
|
Visitas:
806
|
Comentarios:
2
|
Archivo:
Articulos
|
Visitas:
762
|
Comentarios:
3
|
Archivo:
Articulos
|
Visitas:
666
|
Comentarios:
2
|
Archivo:
Articulos
|
Visitas:
3174
|
Comentarios:
2
|
Archivo:
Articulos
|
Visitas:
14553
|
Comentarios:
7
|
Archivo:
Articulos
|
Visitas:
1492
|
Comentarios:
3
|
Archivo:
Articulos
|
|
Visitas:
695
|
Comentarios:
2
|
Archivo:
Articulos
|
|
Visitas:
369
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
2034
|
Comentarios:
2
|
Archivo:
Articulos
|
|
|
 |
|
 |