GUIA PROCEDURE ORACLE (SOLUCION)

DUOC PLAZA VESPUCIO ESCUELA DE INGENIERIA. PROGRAMACIÓN DE BASE DE DATOS ORACLE GUIA DE PROCEDIMIENTOS ALMACENADOS INST

Views 56 Downloads 0 File size 158KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

DUOC PLAZA VESPUCIO ESCUELA DE INGENIERIA.

PROGRAMACIÓN DE BASE DE DATOS ORACLE GUIA DE PROCEDIMIENTOS ALMACENADOS INSTRUCCIONES:

• Cargar el script ESQUEMA_FACTURACION.SQL • Considere el siguiente modelo de datos para desarrollar la presente guía de ejercicios. •

Los ejercicios deben considerar la creación de los procedimientos almacenados y el bloque anónimo que los invoca. Debe considerar que los ejercicios contemplan la creación de procedimientos SIN PARAMATROS, PARAMATROS IN, PARAMATROS OUT y PARAMATROS INOUT.

DUOC PLAZA VESPUCIO ESCUELA DE INGENIERIA.

EJERCICIOS DE DESARROLLO:

1. CREAR UN PROCEDIMIENTO ALMACENADO QUE DESPLIEGUE POR PANTALLA LAS SIGUIENTES ESTADISTICAS SOBRE EL CAMPO TOTAL DE LA TABLA FACTURA. (PROCEDURE SIN PARAMETROS). PROMEDIO FACTURAS, VALOR MAXIMO FACTURA, VALOR MINIMO DE FACTURA, TOTAL DE FACTURA. TODOS LOS VALORES DEBEN SER EXPRESADOS EN VALORES ENTEROS (SIN DECIMALES) REDONDEADOS AL ENTERO MÁS PROXIMO. Resultado esperado:

CREATE OR REPLACE PROCEDURE PRC_ESTADISTICAS_FACTURACION AS BEGIN DECLARE V_PROM NUMBER; V_MAX NUMBER; V_MIN NUMBER; V_SUM NUMBER; BEGIN SELECT MAX(TOTAL),MIN(TOTAL),AVG(TOTAL),SUM(TOTAL) INTO V_MAX, V_MIN,V_PROM,V_SUM FROM FACTURA; DBMS_OUTPUT.PUT_LINE('EL VALOR MAXIMO DE FACTURA ES: ' || ROUND(V_MAX)); DBMS_OUTPUT.PUT_LINE('EL VALOR MINIMO DE FACTURA ES: ' || ROUND(V_MIN)); DBMS_OUTPUT.PUT_LINE('EL VALOR PROMEDIO DE FACTURA ES: ' || ROUND(V_PROM)); DBMS_OUTPUT.PUT_LINE('EL VALOR TOTAL DE FACTURA ES: ' || ROUND(V_SUM)); END; END; BEGIN PRC_ESTADISTICAS_FACTURACION; END;

2. CREAR UN PROCEDIMIENTO ALMACENADO QUE PERMITA DESPLEGAR LA CANTIDAD DE CLIENTES QUE CONTENGAN EN EL CAMPO DIRECCION LA PALABRA “ALAMEDA”. EL PROCEDIMIENTO DEBE RECIBIR COMO PARAMETRO IN LA PALABRA ALAMEDA. Resultado esperado:

DUOC PLAZA VESPUCIO ESCUELA DE INGENIERIA.

CREATE OR REPLACE PROCEDURE PRC_CLIENTE_DIRECCION (V_DIR IN VARCHAR2) AS BEGIN DECLARE VTOT NUMBER; BEGIN SELECT COUNT(RUTCLIENTE) INTO VTOT FROM CLIENTE WHERE DIRECCION LIKE V_DIR; DBMS_OUTPUT.PUT_LINE('EL TOTAL DE CLIENTE ES :'||TO_CHAR(VTOT)); END; END; BEGIN PRC_CLIENTE_DIRECCION('%ALAMEDA%'); END;

3. CREAR UN PROCEDIMIOENTO ALMACENADO QUE MUESTRE POR PANTALLA EL NOMBRE DEL CLIENTE Y LA DIFERENCIA ENTRE CREDITO-SALDO (TABLA CLIENTE) DE UN RUT EL CUAL ES RECIBIDO COMO PARAMETRO IN EN EL PROCEDIMIENTO. Resultado esperado (por ejemplo RUT: 12456789-5):

CREATE OR REPLACE PROCEDURE PRC_DIFERENCIA_CLIENTE (V_RUT IN VARCHAR2) AS BEGIN DECLARE V_DIF NUMBER; V_NOM VARCHAR2(30); BEGIN SELECT NOMBRE, (CREDITO-SALDO) INTO V_NOM,V_DIF FROM CLIENTE WHERE RUTCLIENTE=V_RUT; DBMS_OUTPUT.PUT_LINE('NOMBRE CLIENTE ES: '||V_NOM); DBMS_OUTPUT.PUT_LINE('TOTAL FACTURADO : '||TO_CHAR(V_DIF)); END; END; BEGIN PRC_DIFERENCIA_CLIENTE('12456789-5'); END;

DUOC PLAZA VESPUCIO ESCUELA DE INGENIERIA.

4.

CREAR UN PROCEDIMIOENTO ALMACENADO QUE RECIBA COMO PARAMETRO IN EL NOMBRE DE UNA NUEVA CIUDAD (por ejemplo: "CHILLAN"). INSERTAR UN NUEVO REGISTRO CONSIDERANDO EL CODIGO DE LA CIUDAD COMO EL ULTIMO CODIGO + 1. EL PROCEDIMIENTO DEBE DEVOLVER MEDIANTE PARAMETRO OUT, EL CODIGO DE CIUDAD GENERADO PARA DESPLEGARLO POR PANTALLA. Resultado esperado (ejemplo según registros de tabla):

CREATE OR REPLACE PROCEDURE PRC_INSERTA_CIUDAD (V_NOMCIU IN VARCHAR2, V_COD OUT NUMBER) AS BEGIN SELECT MAX(CODCIUDAD)+1 INTO V_COD FROM CIUDAD; INSERT INTO CIUDAD VALUES (V_COD,V_NOMCIU); END; DECLARE CODCIU NUMBER; BEGIN PRC_INSERTA_CIUDAD('CHILLAN',CODCIU); DBMS_OUTPUT.PUT_LINE('CODIGO DE NUEVA CIUDAD ES: '||TO_CHAR(CODCIU)); END;

5.

CREAR UN PROCEDIMIENTO ALMACENADO QUE APLIQUE UN PORCENTAJE DE INCREMENTO AL PRECIO DE LOS PRODUCTOS (CAMPO VALORPESO DE LA TABLA PRODUCTO), EL CUAL ES. INDICADO COMO PARAMETRO IN. SOBRE ESTE NUEVO VALOR, TAMBIEN SE DEBE AJUSTAR EL PRECIO EN DÓLARES (VALORDOLAR) CONSIDERANDO 2 DECIMALES. PARA EL CÁLCULO DEL VALORDOLAR, SE DEBE ESTIMAR LA PARIDAD DEL DOLAR EN $490 (PARAMETRO IN) Y EL CALCULO CORRESPONDE A LA OPERACIÓN VALORPESO/490. EL PROCEDIMIENTO DEBE DESPLEGAR LOS VALORES EN PESOS Y DOLARES, ANTES Y DESPUES DEL AJUSTE DE PRECIO. Resultado esperado (por ejemplo para el código de producto 1):

CREATE OR REPLACE PROCEDURE PRC_PRECIO_PRODUCTO (V_CODPRO IN NUMBER, V_PORC IN NUMBER, V_DOLAR IN NUMBER) AS BEGIN DECLARE V_PESOS NUMBER; V_DOLARES NUMBER(8,2); BEGIN SELECT VALORPESO, VALORDOLAR INTO V_PESOS,V_DOLARES FROM PRODUCTO WHERE CODPRODUCTO=V_CODPRO; DBMS_OUTPUT.PUT_LINE('PRECIO EN PESOS ORIGINAL: ' || TO_CHAR(V_PESOS)); DBMS_OUTPUT.PUT_LINE('PRECIO EN DOLARES ORIGINAL: ' || TO_CHAR(V_DOLARES,'999,990.99')); UPDATE PRODUCTO SET VALORPESO= VALORPESO * (1+(V_PORC/100)),

DUOC PLAZA VESPUCIO ESCUELA DE INGENIERIA.

VALORDOLAR=(VALORPESO * (1+(V_PORC/100))) / V_DOLAR WHERE CODPRODUCTO=V_CODPRO; SELECT VALORPESO, VALORDOLAR INTO V_PESOS,V_DOLARES FROM PRODUCTO WHERE CODPRODUCTO=V_CODPRO; DBMS_OUTPUT.PUT_LINE('PRECIO EN PESOS ORIGINAL: ' || TO_CHAR(V_PESOS)); DBMS_OUTPUT.PUT_LINE('PRECIO EN DOLARES ORIGINAL: ' || TO_CHAR(V_DOLARES,'999,990.99')); END; END; BEGIN PRC_PRECIO_PRODUCTO (1, 10,490); END;

6.

CREAR UN PROCEDIMIENTO ALMACENADO QUE ELIMINE LAS UNIDADES DE MEDIDA DE LA “TABLA UNIDAD_MEDIDA”, LA CONDICION QUE SE DEBE CONSIDERAR ES LA ELIMINACIÓN DE AQUELLAS UNIDADES DE MEDIDA QUE NO SE ENCUENTREN ASOCIADOS A UN PRODUCTO. EN CASO DE EXISTIR REGISTROS PARA ELIMINAR, SE DEBE DESPLEGAR EL MENSAJE: 'SE ELIMINARON: X REGISTROS'. EN CASO DE NO EXISTIR REGISTROS PARA ELIMINAR, DESPLEGAR EL MENSAJE: ''NO EXISTEN DATOS PARA ELIMINAR''. Resultado esperado:

CREATE OR REPLACE PROCEDURE PRC_ELIMINA_UNIDAD_MEDIDA AS BEGIN DECLARE V_TOTAL NUMBER; BEGIN SELECT COUNT(CODUNIDAD) INTO V_TOTAL FROM UNIDAD_MEDIDA WHERE CODUNIDAD NOT IN (SELECT DISTINCT(CODUNIDAD) FROM PRODUCTO); IF V_TOTAL>0 THEN DELETE UNIDAD_MEDIDA WHERE CODUNIDAD NOT IN (SELECT DISTINCT(CODUNIDAD) FROM PRODUCTO); DBMS_OUTPUT.PUT_LINE('SE ELIMINARON : ' || TO_CHAR(V_TOTAL)||' REGISTROS'); ELSE DBMS_OUTPUT.PUT_LINE('NO EXISTEN DATOS PARA ELIMINAR'); END IF; END; END; BEGIN PRC_ELIMINA_UNIDAD_MEDIDA; END;

DUOC PLAZA VESPUCIO ESCUELA DE INGENIERIA.

7.

CREAR UN PROCEDIENTO ALMACENADO QUE INGRESE LOS DATOS QUE A CONTINUACION SE INDICAN, A LA TABLA FACTURA. TODOS LOS DATOS DEBEN SER CONSIDERADOS COMO ARGUMENTOS OUT EN EL PROCEDIMIENTO. DADA LA NUEVA FACTURA INGRESADA, ADEMAS SE DEBERÁ ACTUALIZAR EL SALDO DE LA TABLA CLIENTE PARA EL RUT INGRESADO, ACTUALIZANDO SEGÚN LA SIGUIENTE OPERACIÓN: SALDO=SALDO-TOTAL (CAMPO DE LA FACTURA INGRESADA). NUMFACTURA=11550, RUTCLIENTE=44567891-4, FECHA= 11/11/2010 11:40:50, NETO= 500000, IVA=95000, TOTAL=595000 ESTADO=EM. Resultado esperado para RUT=44567891-4:

CREATE OR REPLACE PROCEDURE PRC_INSERTA_FAC_CLENTE (VNUM IN NUMBER,VRUT IN VARCHAR2,VFECHA IN DATE,VNETO IN NUMBER, VIVA IN NUMBER,VTOTAL IN NUMBER,VESTADO IN VARCHAR2) AS BEGIN DECLARE V_SALDO NUMBER; BEGIN SELECT SALDO INTO V_SALDO FROM CLIENTE WHERE RUTCLIENTE=VRUT; DBMS_OUTPUT.PUT_LINE('SALDO ACTUAL ES : ' ||TO_CHAR(V_SALDO)); INSERT INTO FACTURA VALUES (VNUM,VRUT,VFECHA,VNETO,VIVA,VTOTAL,VESTADO); UPDATE CLIENTE SET SALDO = SALDO - VTOTAL WHERE RUTCLIENTE=VRUT; SELECT SALDO INTO V_SALDO FROM CLIENTE WHERE RUTCLIENTE=VRUT; DBMS_OUTPUT.PUT_LINE('SALDO ACTUALIZADO ES : ' || TO_CHAR(V_SALDO)); END; END;

BEGIN PRC_INSERTA_FAC_CLENTE(11550,'44567891-4', TO_DATE('11/11/2010 11:40:50','DD/MM/YYYY HH24:MI:SS'), 500000,95000,595000,'EM'); END;

DUOC PLAZA VESPUCIO ESCUELA DE INGENIERIA.

8.

CREAR UN PROCEDIMIENTO ALMACENADO QUE DESPLIEGUE LA SIGUIENTE INFORMACIÓN PARA UN CLIENTE ESPECÍFICO (RUTCLIENTE PARAMETRO IN). SE DEBE VALIDAR QUE EL CLIENTE TENGA FACTURAS ASOCIADAS ENTRE 04-03-2008 Y 07-032008, AMBOS VALORES DEBEN SER TRATADOS COMO PARAMETROS IN. CAMPOS A DESPLEGAR: NOMBRE CLIENTE, DIRECCIÓN, COMUNA (SI ES NULL DEBE MOSTRAR 0), ESTADO (A=ACTIVO, B=BLOQUEADO). Resultado esperado POR EJEMPLO para RUT=44567891-4:

CREATE OR REPLACE PROCEDURE PRC_FACTURACION_PERIODO (VRUT IN VARCHAR2, VFECHA1 IN DATE, VFECHA2 IN DATE) AS BEGIN DECLARE VNOM VARCHAR2(30); VDIR VARCHAR2(30); VCOM VARCHAR2(30); VESTADO VARCHAR2(30); BEGIN SELECT NOMBRE, DIRECCION,NVL(CODCOMUNA,0), DECODE (ESTADO,'A','ACTIVO','B','BLOQUEADO') INTO VNOM, VDIR, VCOM, VESTADO FROM CLIENTE WHERE RUTCLIENTE=VRUT AND RUTCLIENTE IN (SELECT DISTINCT(RUTCLIENTE) FROM FACTURA WHERE FECHA>=VFECHA1 AND FECHA