Vous êtes sur la page 1sur 67

PL/SQL

Bloques PL/SQL
Introduccin

Variables
Procedimientos
Funciones
Excepciones
Estructuras de control

ETSISI

PL/SQL, Introduccin
PL/SQL:
Es un lenguaje de programacin estructurado de
ORACLE que amplia el SQL estndar:
Permite:
Manipular datos de una BD Oracle
Crear procedimientos estructurados:
Usando tcnicas de programacin como bucles
For, While, etc.
Controlar errores con excepciones definidas
por el usuario o propias de Oracle
Controlar las filas de una consulta una a una
Crear disparadores/ triggers
ETSISI

PL/SQL, Introduccin
PL/SQL:
Es un lenguaje de programacin procedural
estructurado en bloques
Los programas se pueden dividir en bloques lgicos.
Permite bloques anidados.
Puede declarar variables localmente al bloque que las
utiliza.

ETSISI

PL/SQL, Bloques
Se distingue entre bloques:
Compilados y guardados
Subprogramas: procedimientos, paquetes, funciones:
Se compilan y guardan en la BD
Se ejecutan mediante llamadas explicitas.

Compilados en tiempo de ejecucin


Triggers, el cdigo fuente se guarda y se compila al
llamarle, se ejecutan implcitamente
Bloques annimos, se compilan en el momento, no se
guardan.
ETSISI

PL/SQL, Bloques
Bloque: es la unidad ms pequea de un programa
PL/SQL.
Estructura de bloque:
Cada estructura PL/SQL comprende uno o ms
bloques. stos pueden estar separados o anidados
[DECLARE]
........
BEGIN
......
[EXCEPTION]

........
END;
ETSISI

PL/SQL, Bloques
DECLARE (No es obligatoria)
Debe de contener todas las constantes, variables y
excepciones definidas por el usuario y que se referencian
a lo largo de las siguientes secciones.
BEGIN
Seccin obligatoria, parte ejecutable, contiene las
sentencias SQL para manipular datos de la BD y
sentencias PL/SQL para manipular datos del bloque.
EXCEPTION
Seccin no obligatoria, controla los errores de ejecucin,
ofrece una salida controlada a las condiciones anormales
de la seccin ejecutable.
END; (Obligatorio, cierra el bloque)
ETSISI

BLOQUES, Anidamiento
BEGIN
DECLARE
Var X
...............
BEGIN
DECLARE
Var Y
............
BEGIN
...........
EXCEPTION
..............
END;
...........
EXCEPTION
..............
END;
END;

mbito de la
variable Y

mbito de la
variable X

ETSISI

PL/SQL, Bloques
Bloques Annimos
DECLARE

Define objetos PL/SQL que utiliza la parte Begin o


Exception de este mismo bloque.
BEGIN obligatorio

Sentencias

EXCEPTION

Control de errores
END; obligatorio

ETSISI

PL/SQL
Bloques PL/SQL
Introduccin

Variables
Procedimientos
Funciones
Excepciones
Estructuras de control

ETSISI

PL/SQL: Bloques, Variables


Variables

Variables PL/SQL

Definidas por el lenguaje

Variables de sesin o usuario

Definidas por el usuario en una sesin


EXEC DBMS_SESSION.SET_CONTEXT('CLIENTCONTEXT', 'myvar', 'myvalue');
SELECT SYS_CONTEXT('CLIENTCONTEXT', 'myvar') FROM dual;

ETSISI

PL/SQL: Bloques, Variables


Variables PL/SQL
Definidas por el lenguaje
Tipos de variables:
Escalares. Definidos por el lenguaje
NUMBER, CHAR, VARCHAR, VARCHAR2, DATE,
BOOLEAN (TRUE, FALSE, NULL)
Compuestos: Definidos por el usuario
Registros
Tablas y matrices. Pueden almacenar registros y
escalares

ETSISI

PL/SQL: Bloques, Variables


Variables PL/SQL
Definidas por el lenguaje
Sintaxis
Nombre_V [CONSTANT] tipo de datos
[NOT NULL] [:= expresin | := DEFAULT expresion];

Expresion puede ser un literal, otra variable o una


expresin aritmtica.
Tipos de expresiones:
Aritmticas: + - * /
Comparativas: = != > > >= <=
Concatenacin de caracteres:

ETSISI

PL/SQL: Bloques, Variables


Variables PL/SQL
Ejemplos
V_fecha DATE;
V_departamento NUMBER (3) NOT NULL :=15;
V_ciudad VARCHAR2(15) :=MADRID;

C_constante CONSTANT NUMBER :=100;

ETSISI

PL/SQL: Bloques, Variables


SECUENCIAS
Una secuencia genera nmeros nicos de forma automtica.
Puede ser compartida por varios usuarios
Crear una secuencia
CREATE SEQUENCE seq_nombre
[INCREMENT BY n], (n es el incremento, por defecto es 1)
[START WITH n], (n es el nmero por el que empieza la

secuencia )

[MAXVALUE n], (n es el mximo valor que puede alcanzar)


[MINVALUE n], (n es el mnimo valor que puede alcanzar)
................. ;
dic-15

Concepcin M. Gascuea

14

ETSISI

PL/SQL: Bloques, Variables


SECUENCIAS: NEXTVAL Y CURRVAL
NEXTVAL:
seq_nombre.NEXTVAL se utiliza para obtener el
prximo nmero de una secuencia
CURRVAL:
seq_nombre.CURRVAL hace referencia al ltimo
nmero generado de la secuencia

dic-15

ETSISI

PL/SQL: Bloques, Variables


SECUENCIAS: NEXTVAL Y CURRVAL
Para modificar la estructura de la secuencia
ALTER SEQUENCE seq_nombre
INCREMENTE BY n
MAXVALUE m

MINVALUE p;
Borrar una secuencia
DROP SEQUENCE seq_nombre;
dic-15

ETSISI

PL/SQL: Bloques, Variables


Variables PL/SQL

Se pueden declarar variables basadas en:


Otras variables previamente declaradas. Para ello se
utiliza %TYPE, precedido por nombre de la variable
Basadas en una columna de una tabla existente en la
BD, con %TYPE precedido del nombre de la tabla y
columna.

Ejemplo:
Var_inventario Number(7,2);
Var_ media_inventario Var_inventario.%TYPE:=0;
La variable Var_inventario debe de existir
ETSISI

PL/SQL: Bloques, Variables


Variables PL/SQL
Ejemplo
V_nif

proveedores.CODPROV%TYPE;

Variable del mismo tipo que la columna codprov de


la tabla proveedores
Var_articulo Almacenes.articulo.%TYPE
Las tablas y columnas debe de existir en la BD
Los nombres de las variables no deben ser iguales que
los de las columnas de las tablas utilizadas en el
bloque.
ETSISI

PL/SQL: Bloques, Variables


Variables PL/SQL
%ROWTYPE
Se puede declarar una variable registro basndose en
una coleccin de columnas de una tabla existente en la
base de datos
Los campos toman los nombres y tipos de datos de las
columnas de dicha tabla.
Var_registro

tabla%ROWTYPE;

Ejemplo
RegistroAlmacen Almacen%ROWTYPE;

Variable de tipo registro de la tabla almacn

ETSISI

PL/SQL: Bloques, Variables


Variables PL/SQL
Utilidades: INTO
Para recoger el resultado de un Select en una
variable se utiliza INTO.
SELECT * INTO variableTiporegistro
FROM tabla

ETSISI

PL/SQL: Bloques, Variables


Variables PL/SQL
Ejemplo

Introduce en el registro Vr_proveedor todos los


valores del proveedor 101;
Vr_proveedor proveedores.%ROWTYPE

SELECT * INTO Vr_proveedor


FROM proveedores
WHERE codprov=101;

Si la consulta devolviera ms de un registro dara un


error.
ETSISI

PL/SQL: Bloques, Variables


Variables PL/SQL
Ejemplo

Introduce en la variable precio_arti, de tipo precio, el


valor del precio manipulado, para el articulo 104.
precio_arti proveedores.precio%TYPE;
SELECT precio *15 INTO precio_arti
FROM articulos WHERE codart=104;

ETSISI

PL/SQL: Bloques, Variables


Variables PL/SQL
Conversiones de datos
Entre escalares se pueden convertir datos de unos
tipos de datos a otros:
Funcin

Descripcin

To_Number(argumento)

Convierte el argumento en tipo Number

To_Char(argumento)

Convierte el argumento en tipo Varchar2

To_Date(argumento)

Convierte el argumento en tipo Date

ETSISI

PL/SQL: Bloques, Variables


Variables de usuario
Variables usadas desde el editor de SQL
DEFINE variable1= 31; (crea una variable y asigna valor

31)

SELECT * FROM Alumno


WHERE Cod_grupo =&variable1;

UNDEFINE variable1; (borra la variable)


DEFINE variable1 = 'C01';
SELECT * FROM conductores
WHERE Codc = '&variable1';
ETSISI

PL/SQL: Bloques, Variables


Variables de usuario
SELECT *
FROM Alumno
WHERE Cod_grupo =&variable1;
Pide valor por pantalla para Cod_grupo en tiempo de
ejecucin, si la variable variable1 no existe la crea, si
existe toma el valor de sta.
SELECT *
FROM conductores
WHERE Codc ='&variable2';

ETSISI

PL/SQL: Bloques, Variables


Variables de usuario
Ejemplos:

SELECT *
FROM Alumno
WHERE Ciudad =&ciud;
SELECT &colum, Nombre
FROM Alumno
WHERE Cod_matricula =&cod_ma;
SELECT &codgru, Ciudad
FROM Alumno
WHERE &condicion;
ETSISI

PL/SQL: Bloques, Variables


Variables de usuario
Las variables de sesin deben referenciarse con &.
DEFINE; presenta todas las variables de usuario de la
sesin
Crear un fichero interactivo que pida al usuario los
datos para crear una vista, utilizar los comandos
ACCEPT variable PROMT para comunicar al usuario lo
que se quiere.

ETSISI

PL/SQL: Bloques, Variables


Variables de usuario
Crear un fichero en el bloc de notas con las
siguientes sentencias:
ACCEPT profe PROMPT proporciona un nombre de
profesor:
SELECT *
FROM Profesor
WHERE Nombre = &profe
Guardar en C con el nombre
INTERACTIVOProfesor.sql
Abrir desde SQL*Plus

Ejecutar con Start INTERACTIVOProfesor.sql;

ETSISI

PL/SQL: Bloques, Variables


Variables de usuario
Podemos crear una vista sobre una tabla pidiendo los
datos al usuario.
ACCEPT nombrevista PROMPT 'introduce un nombre
para la vista:'
ACCEPT nombretabla PROMPT 'introduce un nombre
para la tabla:'
Create or replace view &nombrevista as
SELECT * FROM &nombretabla;

ETSISI

PL/SQL
Bloques PL/SQL
Introduccin

Variables
Procedimientos
Funciones
Excepciones
Estructuras de control

ETSISI

PL/SQL, Bloques
Estructura de Bloque en Subprogramas PL/SQL

Cabecera (procedimiento o funcin, nombre, lista de


parmetros de entrada IN, salida OUT,
entrada/salida IN OUT)
IS
variables
Declaracin de objetos: constantes
cursores, etc..
BEGIN
Sentencias ejecutables
[RETURN]
(slo para funciones)
EXCEPTION
Seccin de excepciones
END;

ETSISI

PL/SQL, Procedimientos
Subprogramas, programas compilados y
guardados en la BD.
Mejoran el Mantenimiento
Mejoran la Seguridad e Integridad de los
datos
Mejoran el Rendimiento

ETSISI

PL/SQL, Programas
REGLAS
Acabar los procedimientos creados directamente en SQL
con un punto para salir de las sentencias, despus/
EXECUTE Nombre_Procedimiento; (ejecuta el

procedimiento)

Si acaba bien avisa:


Procedimiento PL/SQL terminado con xito.
Si hay errores avisa:
Errores para PROCEDURE Nombre_Procedimiento.
Si tiene algn error: sale lista de errores, llamando a
SHOW ERRORS; (presenta los errores de compilacin)
ETSISI

PL/SQL, Procedimientos
CREATE OR REPLACE PROCEDURE
Nombre_Procedure (parametros no obligatorios)
IS
........
BEGIN
...............
EXCEPTION
----END Nombre_Procedure;

ETSISI

PL/SQL, Procedimientos
Ejemplo Dada la tabla prueba:
PRUEBA ( cod_prueba Number(3),Fecha Date,
Primary key (cod_prueba ));
Crear un bloque Annimo, directamente en SQL con lo
siguiente:
DECLARE
BEGIN
INSERT INTO PRUEBA VALUES (1,SYSDATE);
END;
Se crea compila y ejecuta si no tiene errores de sintaxis
Comprobar que se ha ejecutado correctamente con
SELECT * FROM PRUEBA;
ETSISI

PL/SQL, Procedimientos
Ejemplo:
Crear un procedimiento que al llamarlo inserte valores
(nmero secuencial, usuario conectado y fecha del
sistema) en la tabla Usuarioconex.
Crear previamente una tabla que recoja el usuario y la
fecha de conexin.

CREATE TABLE Usuarioconex (

numero NUMBER(3),
usuario VARCHAR2 (10),
fecha DATE,
Primary key (numero ));
CREATE SEQUENCE SEC_USER;

ETSISI

PL/SQL, Procedimientos
Procedimiento que al llamarlo inserte valores (nmero secuencial,
usuario conectado y fecha del sistema) en la tabla Usuarioconex.

CREATE OR REPLACE PROCEDURE Conexiones IS


BEGIN

INSERT INTO Usuarioconex VALUES


(SEC_USER.NEXTVAL, USER, SYSDATE);
END Conexiones;
Ejecutar el procedimiento:
EXECUTE Conexiones;
SELECT * FROM Usuarioconex; (para ver si se ha ejecutado)
ETSISI

PL/SQL, Procedimientos
Ejemplo: Crear un procedimiento que inserte un registro en la
tabla Almacenes

CREATE OR REPLACE PROCEDURE PRO_Almacenes


(codigo IN VARCHAR2 ,ciudad IN VARCHAR2, provincia
IN VARCHAR2, articulo IN NUMBER, unidades IN
NUMBER) IS
BEGIN
INSERT INTO ALMACENES VALUES (codigo, ciudad,
provincia, articulo, unidades);
END PRO_Almacenes; . /
EXECUTE PRO_Almacenes (&codigo,&ciudad, &provincia,
&articulo, &unidades);

Con & delante de la variable pide por panatlla los valores al


usuario
ETSISI

Procedimientos y Funciones
Borrar procedimientos y funciones

DROP PROCEDURE Nombre_Procedure;


DROP FUNCTION Nombre_Funcion;

ETSISI

PL/SQL
Bloques PL/SQL
Introduccin

Variables
Procedimientos
Funciones
Excepciones
Estructuras de control

ETSISI

PL/SQL, Funciones
Las funciones devuelven siempre un valor que hay que
recoger en una variable.
Solo se introducen los argumentos de entrada.
Ejemplo
Crear una funcin PRECIOTOTAL que devuelva la
suma de los precios de los artculos de un determinado
proveedor de la tabla POVEEDORES, el cual se
introducir por argumento.

ETSISI

PL/SQL, Funciones
CREATE OR REPLACE FUNCTION F_preciototal
(cod IN proveedores.codprov%type)
RETURN NUMBER IS
tot number;
BEGIN
SELECT Sum(precio) INTO tot
FROM proveedores, articulos
WHERE codprov= cod
AND codprov=pro_codprov;
RETURN (tot);
END F_preciototal; ./
(compilar sin errores o corregir stos con Show errors)

ETSISI

PL/SQL, Funciones
EJECUTAR LA FUNCIN
Crear una variable de enlace de tipo Number, en el
SQL PLUS:
VARIABLE VAR1 NUMBER;
Ejecutar la funcin

EXECUTE :VAR1:=F_preciototal(103);
Avisa:
Procedimiento PL/SQL terminado con xito.
Imprimir por pantalla el valor de la funcin
PRINT :VAR1;
ETSISI

PL/SQL
Bloques PL/SQL
Introduccin

Variables
Procedimientos
Funciones
Excepciones
Estructuras de control

ETSISI

PL/SQL, Excepciones
Excepciones:
Una excepcin se produce cuando ocurre un error en
un programa PL/SQL
Ocurre un error se lanza una excepcin
Si est controlada por el programa se trata en la zona de
Excepciones del bloque PL/SQL.
Si no est controlada el programa se detiene.

Se pueden declarar por el usuario en la zona


DECLARE, se lanzan durante la ejecucin con RAISE
y se tratan como el resto en la zona EXCEPTION
Hay excepciones definidas por ORACLE que se
lanzan automticamente.
Utilizan las funciones de error de SQL y PL/SQL
ETSISI

PL/SQL, Excepciones
Excepciones predefinidas por Oracle
Ejemplo
DECLARE
.
BEGIN
..
EXCEPTION
WHEN NO_DATA_FOUND THEN
sentencias que quiero realizar
END

ETSISI

PL/SQL, Excepciones
Excepciones definidas por el usuario
Ejemplo
DECLARE
Se declara la
User_exception EXCEPTION;
excepcin
BEGIN
If var>8 then RAISE User_exception
..
EXCEPTION
WHEN User_exception THEN
Rollback;
DBMS_OUTPUT.PUT(Mensaje);

WHEN OTHER THEN


---------END

Se produce el error y se
genera la excepcin con
RAISE
Se trata la excepcin

ETSISI

PL/SQL, Excepciones
Mensajes de error cuando se provoca una excepcin:
DBMS_OUTPUT.put_line(Mensaje aviso al usuario)

Para los mensajes de error definidos por el usuario


RAISE_APPLICATION_ERROR(<error_num>,<mensaje>)
Donde:
error_num es un entero negativo comprendido entre
-20000 y -20999

mensaje: que avisa al usuario de lo que ocurre

ETSISI

PL/SQL, Excepciones
La excepcin Other
WHEN OTHERS THEN
Rutina especial que se ejecuta para todas las excepciones no
tratadas con anterioridad en la zona EXCEPTION. Debe de
ir la ltima dentro de ella
Con SQLCODE se recupera el cdigo de error contemplado
por Oracle que provoda la excepcin
SQLERRM permite recuperar el texto asociado al codigo
de error actual que ha provocado la excepcin.

Por ejemplo
DBMS_OUTPUT.put_line('Error'||SQLCODE||SQLERRM)
ETSISI

PL/SQL, Excepciones
Ejemplo 1
CREATE FUNCTION divide(dividendo NUMBER, divisor
NUMBER) IS Return Number;
DECLARE
resul Number;
BEGIN
resul=dividendo/divisor;
EXCEPTION
WHEN ZERO_DIVIDE THEN --(Se ejecuta cuando divisor es cero)
DBMS_OUTPUT.PUT_LINE(No puedes dividir por cero);
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001, Hay un error no definido');
END;
ETSISI

PL/SQL, Excepciones
Ejemplo 2
CREATE FUNCTION divide(dividendo NUMBER, divisor
NUMBER) IS Return Number;
DECLARE
resul Number;
errNum Number;
BEGIN
resul=dividendo/divisor;
EXCEPTION
WHEN ZERO_DIVIDE THEN --(Se ejecuta cuando divisor es cero)
DBMS_OUTPUT.PUT_LINE(No puedes dividir por cero);
WHEN OTHERS THEN
errNum := SQLCODE; /*NUMERO DE ERROR DE sql*/
RAISE_APPLICATION_ERROR(-20000, errNum);
END;

ETSISI

PL/SQL, Excepciones
Algunas excepciones predefinidas por Oracle
DUP_VAL_ON_INDEX
Esta excepcin se crea cuando se intenta almacenar un
valor duplicado en la clave primaria o en una columna con
restriccin UNIQUE. SQL_CODE= -1 (ORA-00001)
INVALID_NUMBER
En una sentencia SQL, una cadena de caracteres no
representa un nmero vlido. SQL_CODE= -1722
NO_DATA_FOUND
No se encuentran valores en alguna accin SQL pedida.
SQL_CODE= 100

NOTA: SQL_CODE: es el nmero de error interno de


Oracle. Est asociado a un mensaje.

ETSISI

PL/SQL, Excepciones
Algunas excepciones predefinidas por Oracle
TOO_MANY_ROWS
Una sentencia SELECT INTO devuelve ms de una fila.
SQL_CODE= -1422
ZERO_DIVIDE THEN
Se ejecuta cuando se intenta dividir por cero. SQL_CODE=
-1476
VALUE_ERROR
Ocurre un error aritmtico, de conversin o truncamiento.
Por ejemplo cuando se intenta introducir un valor mayor que
el tamao de la variable SQL_CODE= -6502
ETSISI

PL/SQL
Bloques PL/SQL
Introduccin

Variables
Procedimientos
Funciones
Excepciones
Estructuras de control

ETSISI

PL/SQL, Estructuras de Control


BUCLES
Bucles simples (LOOP).
Bucles condicionales (WHILE)
Bucles numricos (FOR)

ETSISI

PL/SQL, Estructuras de Control


IF <condicin> THEN sentencias; END IF;
IF <condicin> THEN sentencias 1

ELSE sentencias 2
END IF;
IF <condicin 1> THEN sentencias 1
ELSIF <condicin 2> THEN sentencias 2;

ELSIF <condicin n> THEN Sentencias n;

END IF;
ETSISI

PL/SQL, Estructuras de Control


Bucles: Repiten una sentencia o una secuencia de
sentencias varias veces
Tres tipos de bucles
Bucle Bsico LOOP, acciones repetitivas sin
condiciones. EXIT condicin (para salir del bucle)
Bucle FOR, control iterativo de acciones un
nmero determinado de veces
Bucle WHILE, control iterativo basndose en una
condicin.
END terminan los bucles;
ETSISI

PL/SQL, Estructuras de Control


LOOP
Sentencia 1;

EXIT [WHEN condicin];


END LOOP;
Condicin es una expresin o variable booleana (TRUE,
FALSE, NULL);
Mientras no se cumpla la condicin el bucle se sigue
ejecutando

ETSISI

PL/SQL, Estructuras de Control


Bloque annimo:
Declare
Var_contador NUMBER :=1;
SALIR BOOLEAN :=FALSE;
BEGIN
LOOP
Var_contador:= Var_contador+1;
INSERT INTO PRUEBA VALUES (Var_contador,
SYSDATE);
IF Var_contador = 5 THEN
SALIR:=TRUE;
END IF;
EXIT WHEN SALIR;
END LOOP;
ETSISI
END;

PL/SQL, Bucle FOR


FOR Var_contador IN [REVERSE] MnimoMximo
LOOP
Sentencias1;
..
Sentencias n;
END LOOP;
Var_contador, variable que no hace falta declarar
previamente, acta como variable contador, con IN
aumenta de uno en uno y no hay que actualizar.
Cuando recorre todos los valores del rango acaba el
bucle.
Var_contador, con Reverse, empieza en Mximo y
decrementa de uno en uno hasta Mnimo
ETSISI

PL/SQL, Bucle FOR


Ejemplo
Bloque annimo utilizando FOR
DECLARE
BEGIN

FOR i IN 1..4
LOOP
INSERT INTO USUARIOCONEX VALUES
(SEC_USER.NEXTVAL, USER, SYSDATE);
END LOOP;
END;

Realiza el bucle cuatro veces

ETSISI

PL/SQL, Bucle WHILE


WHILE condicin
LOOP

Sentencia 1;
..
Sentencia n;
END LOOP;
La condicin es evaluada en cada iteracin y mientras
sea TRUE, se ejecutan las sentencias reiteradamente.

ETSISI

PL/SQL, Bucle WHILE


Ejemplo: Bloque PRECIOMAXIMO utilizando While:
CREATE OR REPLACE PROCEDURE Preciomaximo
(MAXIM IN NUMBER )
IS
preciomax ARTICULOS.PRECIO%TYPE :=0;
BEGIN
WHILE preciomax < MAXIM
LOOP
SELECT MAX(PRECIO) INTO preciomax FROM ARTICULOS;
INSERT INTO PRUEBA VALUES (MAXIM, SYSDATE);
preciomax := MAXIM; (hace que pare)
END LOOP;
END Preciomaximo;

ETSISI

PL/SQL, Estructuras de Control


Ejecutar el procedimiento llamndolo
EXECUTE Preciomaximo(5);
EXECUTE Preciomaximo(50);
HACER COMMIT;
Select* from articulos;
Select * from prueba;
Realiza un procedimiento llamado MAXIMOPROV,
que controle un error en la seccin EXCEPTION

ETSISI

CREATE OR REPLACE PROCEDURE MAXIMOPROV (MAXIM


IN NUMBER ) IS
PRECIOMAX ARTICULOS.PRECIO%TYPE :=0;
BEGIN
WHILE PRECIOMAX < MAXIM loop
SELECT MAX(ARTICULOS.PRECIO) INTO PRECIOMAX
FROM ARTICULOS GROUP BY PRO_CODPROV;
INSERT INTO PRUEBA VALUES (MAXIM, SYSDATE);
PRECIOMAX := MAXIM;
END LOOP;
EXCEPTION

WHEN TOO_MANY_ROWS THEN


RAISE_APPLICATION_ERROR(-20000, 'HOLA
hay Demasiados registros');
END MAXIMOPROV;
ETSISI

create or replace
PROCEDURE XXXXXXX as
ide SE.id_e% TYPE;
cantidad integer;
CURSOR cursor_1 IS SELECT Id_E , COUNT(*) as cantidad
FROM SE
GROUP BY Id_E
HAVING COUNT(*) = (
SELECT NE FROM E
WHERE E.id_E = SE.Id_E
);
fila cursor_1%ROWTYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE('Resultado de la consulta');
OPEN cursor_1;
LOOP
FETCH cursor_1 INTO fila;
EXIT WHEN cursor_1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Id= '|| to_Char(fila.Id_E)||' cantidad= '||to_Char(fila.cantidad));
END LOOP;
CLOSE cursor_1;
END XXXXXXX;

ETSISI

Nota: El punto y barra que aparecen al final de


los procedimientos y funciones ./ son
opcionales y significan el punto archiva en
procedimiento y la barra comprueba la
sintaxis.

ETSISI

Vous aimerez peut-être aussi