You are on page 1of 20

UNIVERSIDAD AUSTRAL DE CHILE FACULTAD DE CIENCIAS ECONMICAS Y ADMINISTRATIVAS ESCUELA DE INGENIERA COMERCIAL

Laboratorio de ayudanta 23_06: Consulta SQL.


Sistema de Informacin Empresarial.
ADMI273

Autores Fabin Aguilar Salazar Rodrigo Contreras Coronado Profesor Cristian Salazar C.
Ayudante Jos Luis Carrasco V.

Valdivia, Junio 2012

Actividades:
1.- Se solicita obtener mediante una funcin el resultado de la multiplicacin de 8 por 9. create or replace function numerouno return number is resultado number; begin Resultado := 8 * 9; return resultado; end numerouno;

2.- Se solicita obtener mediante una funcin el resultado de la divisin de 4 por 55. create or replace function numerodos return number is resultado number; begin Resultado := 4 / 55; return resultado; end numerodos;

3.- Investigar el uso de parmetros en una funcin, y desarrolle una funcin para cada uno de los siguientes ejercicios:

a) F(X,Y) = X+Y create or replace function numerotresA (x number, y number) return number is resultado number; begin Resultado := x + y; return resultado; end numerotresA;

b) F(X,Y,Z) = (X+Y)*Z create or replace function numerotresB (x number, y number, z number) return number is resultado number; begin Resultado := (x + y)*z; return resultado; end numerotresB;

c) F(W,X,Y,Z) = W(X-1)(Y-Z)(Z+2) create or replace function numerotresC (w number, x number, y number, z number) return number is resultado number; begin Resultado := W*(X-1)*(Y-Z)*(Z+2); return resultado; end numerotresC;

4.- Investigue el uso de la sentencia INTO.

En las secciones anteriores, hemos visto cmo obtener informacin de tablas. Para Cmo se ingresan estas filas de datos en estas tablas en primer lugar? Esto es lo que se trata en esta seccin, que explica la instruccin INSERT, y en la siguiente seccin, que explica la instruccin UPDATE. En SQL, hay fundamental y bsicamente dos formas para INSRER datos en una tabla: Una es insertar una fila por vez, y la otra es insertar filas mltiples por vez. Primero observemos como podemos INSRER datos a travs de una fila por vez: La sintaxis para insertar datos en una tabla mediante una fila por vez es la siguiente: INSERT INTO "nombre_tabla" ("columna1", "columna2", ...) VALUES ("valor1", "valor2", ...) Suponiendo que tenemos una taba con la siguiente estructura, Tabla Store_Information Column Name Data Type store_name Sales Date char(50) float datetime

y ahora deseamos insertar una fila adicional en la tabla que represente los datos de ventas para Los ngeles el 10 de enero de 1999. En ese da, este negocio tena $900 dlares estadounidenses en ventas. Por lo tanto, utilizaremos la siguiente escritura SQL: INSERT INTO Store_Information (store_name, Sales, Date) VALUES ('Los Angeles', 900, '10-Jan-1999')

El segundo tipo de INSERT INTO nos permite insertar filas mltiples en una tabla. A diferencia del ejemplo anterior, donde insertamos una nica fila al especificar sus valores para todas las columnas, ahora utilizamos la instruccinSELECT para especificar los datos que deseamos insertar en la tabla. Si est pensando si esto significa que est utilizando informacin de otra tabla, est en lo correcto. La sintaxis es la siguiente: INSERT INTO "tabla1" ("columna1", "columna2", ...) SELECT "columna3", "columna4", ... FROM "tabla2" Note que esta es la forma ms simple. La instruccin entera puede contener fcilmente clusulas WHERE, GROUP BY, y HAVING, as como tambin uniones y alias. Entonces por ejemplo, si deseamos tener una tabla Store_Information, que recolecte la informacin de ventas para el ao 1998, y ya conoce en donde reside la fuente de datos en tabala Sales_Information table, ingresaremos: INSERT INTO Store_Information (store_name, Sales, Date) SELECT store_name, Sales, Date FROM Sales_Information WHERE Year(Date) = 1998 Aqu hemos utilizado la sintaxis de Servidor SQL para extraer la informacin anual por medio de una fecha. Otras bases de datos relacionales pueden tener sintaxis diferentes. Por ejemplo, en Oracle, utilizar to_char (date,'yyyy')=1998.

5.- Se define que la morosidad excesiva es referida a cuando un estudiante no ha hecho entrega de un prstamo por un tiempo igual o superior a 20 das. Realice una funcin que entregue el N de prstamos con Morosidad Excesiva. create or replace function numerocinco return number is morosos number; begin select count(*) into morosos from prestamo p where trunc(sysdate) - p.fecha_e >= 20; return morosos; end numerocinco;

6.- Desarrolle lo mismo que en el ejercicio 5, solo que esta vez el valor de 20 das pueda ser variable, esto es pasndolo como parmetro a la funcin. create or replace function numeroseis return number is morosos number; begin select count(*) into morosos from prestamo p where trunc(sysdate) - p.fecha_e > = (valor1); return morosos; end numeroseis; (valor1 in number)

7.- Se solicita pasar por parmetro a la funcin el nmero de das a evaluar y el valor por da de atraso. Se debe entregar el valor total de las deudas adquiridas por todo el alumnado. create or replace function numerosiete (dias in number, deuda in number) return number is morosos number; begin select count(*) into morosos from prestamo p where (trunc(sysdate) - p.fecha_e) >= (das); return morosos; end numerosiete;

8.- Investigue cual es la diferencia entre FUNCTION y PROCEDURE en PLSQL.

Los procedimientos PL/SQL son subprogramas compuestos por un conjunto de sentencias SQL. Funciones y procedimientos PL/SQL no son muy diferentes. Un procedimiento o funcin est constituido por un conjunto de sentencias SQL y PL/SQL lgicamente agrupados para realizar una tarea especfica. Los procedimientos y funciones almacenados constituyen un bloque de cdigo PLSQL que ha sido compilado y almacenado en las tablas del sistema de la base de datos Oracle. Los procedimientos o funciones PLSQL son dinmicos ya que admiten parmetros que les pueden ser pasados antes de su ejecucin. Por lo tanto, un procedimiento o funcin puede realizar diferentes tareas dependiendo de los parmetros que le hayan pasado. Los procedimientos y funciones Oracle estn compuestos por una parte en la que se definen de variables y cursores, otra parte ejecutable compuesta por sentencias SQL y PLSQL, y otra parte opcional enfocada a manejar las excepciones y errores ocurridos durante la ejecucin. Los pasos que sigue Oracle para ejecutar un procedimiento o funcin son los siguientes: - Verificar si el usuario tiene permiso de ejecucin. - Verificar la validez del procedimiento o funcin. - Y finalmente ejecutarlo. Las ventajas de usar procedimientos y funciones en lugar de scripts SQL son: - Facilidad para gestionar la seguridad. - Mejor rendimiento al estar compilados y almacenados en la base de datos. - Mejor gestin de la memoria. - Mayor productividad e integridad. La diferencia ms importante entre los procedimientos y las funciones es que una funcin, al final de su ejecucin, devuelve un valor al bloque PL/SQL que la llam. Sin embargo, en los procedimientos esto no es posible, aunque s que podemos definir mltiples parmetros de salida que se devolveran al bloque PL/SQL desde el que se ejecut el procedimiento (esto ltimo tambin es posible en las funciones).

Sintaxis de un procedimiento PLSQL: CREATE OR REPLACE PROCEDURE [esquema].nombre-procedim (nombre-parmetro {IN, OUT, IN OUT} tipo de dato, ..) {IS, AS} Declaracin de variables; Declaracin de constantes; Declaracin de cursores; BEGIN Cuerpo del subprograma PL/SQL; EXCEPTION Bloque de excepciones PL/SQL; END; Sintaxis de una funcin PLSQL: CREATE OR REPLACE FUNCTION [esquema].nombre-funcion (nombre-parmetro {IN, OUT, IN OUT} tipo-de-dato, ..) RETURN tipo-de-dato {IS, AS} Declaracin de variables; Declaracin de constantes; Declaracin de cursores; BEGIN Cuerpo del subprograma PL/SQL; EXCEPTION Bloque de excepciones PL/SQL; END; Aclaraciones sobre la sintaxis: Nombre-parmetro: es el nombre que nosotros queramos dar al parmetro. Podemos utilizar mltiples parmetros. En caso de no necesitarlos podemos omitir los parntesis. IN: especifica que el parmetro es de entrada y que por tanto dicho parmetro tiene que tener un valor en el momento de llamar a la funcin o procedimiento. Si no se especifica nada, los parmetros son por defecto de tipo entrada. OUT: especifica que se trata de un parmetro de salida. Son parmetros cuyo valor es devuelto despus de la ejecucin el procedimiento al bloque PL/SQL que lo llam. Las funciones PLSQL no admiten parmetros de salida. IN OUT: Son parmetros de entrada y salida a la vez.

Tipo-de-dato: Indica el tipo de dato PLSQL que corresponde al parmetro (NUMBER, VARCHAR2, etc). Ejemplos prcticos Ejemplo de creacin de un procedimiento PL/SQL: CREATE OR REPLACE PROCEDURE procedimiento1 (a IN NUMBER, b IN OUT NUMBER) IS vmax NUMBER; BEGIN SELECT salario, maximo INTO b, vmax FROM empleados WHERE empleado_id=a; IF b < vmax THEN b:=b+100; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN b:=-1; RETURN; WHEN OTHERS THEN RAISE; END; Ejemplo de SQL script que llama a un procedimiento PLSQL: DECLARE vsalario NUMBER; BEGIN procedimiento1 (3213, vsalario) dbms_output.put_line ('El salario del empleado 3213 es ', vsalario); END;

Ejemplo de ejecucin desde SQL de un procedimiento PL/SQL que slo utiliza parmetros de entrada: sql> exec proc_solo_parametros_entrada (2000, 2, 'Pepe');

9.- Lea los artculos de INSERT, UPDATE y DELETE que se encuentran en Definiciones al final de este documento.

Hasta ahora hemos visto como se almacenan los datos en una base de datos y como consultar esos datos almacenados, pero no hemos visto como almacenar dichos datos. Para almacenar datos en una base de datos debemos insertar filas en las tablas. Para ellos SQL pone a nuestra disposicin la sentencia INSERT.

A veces podemos desear deshacernos de los registros de una tabla. Para ello, utilizamos el comando DELETE FROM. La sintaxis para esto es, DELETE FROM "nombre_tabla" WHERE {condicin} Es ms fcil utilizar un ejemplo. Por ejemplo, digamos que actualmente tenemos la siguiente tabla: Tabla Store_Information store_name Sales Date

Los Angeles 1500 05-Jan-1999 San Diego 250 07-Jan-1999

Los Angeles 300 08-Jan-1999 Boston 700 08-Jan-1999

y decidimos no mantener ninguna informacin sobre Los ngeles en esta tabla. Para lograrlo, ingresamos el siguiente SQL: DELETE FROM Store_Information WHERE store_name = "Los Angeles" Ahora el contenido de la tabla se vera, Tabla Store_Information store_name Sales Date San Diego 250 07-Jan-1999 Boston 700 08-Jan-1999

Una vez que hay datos en la tabla, podramos tener la necesidad de modificar los mismos. Para hacerlo, utilizamos el comando UPDATE. La sintaxis para esto es, UPDATE "nombre_tabla" SET "columna_1" = [nuevo valor] WHERE {condicin}

Por ejemplo, digamos que actualmente tenemos la tabla a continuacin: Tabla Store_Information store_name Sales Date

Los Angeles 1500 05-Jan-1999 San Diego 250 07-Jan-1999

Los Angeles 300 08-Jan-1999 Boston 700 08-Jan-1999

y notamos que las ventas para Los Angeles el 08/01/1999 es realmente de 500 en vez de 300 dlares estadounidenses, y que esa entrada en particular necesita actualizarse. Para hacerlo, utilizamos el siguiente SQL: UPDATE Store_Information SET Sales = 500 WHERE store_name = "Los Angeles" AND Date = "08-Jan-1999"

La tabla resultante ser vera Tabla Store_Information store_name Sales Date

Los Angeles 1500 05-Jan-1999 San Diego 250 07-Jan-1999

Los Angeles 500 08-Jan-1999 Boston 700 08-Jan-1999

En este caso, hay slo una fila que satisface la condicin en la clusula WHERE. Si hay mltiples filas que satisfacen la condicin, todas ellas se modificarn. Tambin es posible UPDATE mltiples columnas al mismo tiempo. La sintaxis en este caso se vera como la siguiente: UPDATE "nombre_tabla" SET colonne 1 = [[valor1], colonne 2 = [valor2] WHERE {condicin}

10.- Realice un procedimiento (PROCEDURE) que reciba como parmetro el Rut del Estudiante, el Cdigo del Libro y el Rut del Funcionario. Este procedimiento debe ingresar un prstamo, considerando que todos los libros se prestan por 3 das. (Usar INSERT y SYSDATE). create or replace procedure numerodiez (rut_est in number, rut_func in number, cod_libro in number) is begin insert into prstamo (rut_est, rut_func, cod_libro, fecha_p, fecha_e) values (rut_est, rut_func, cod_libro, trunc(sysdate), trunc(sysdate) + 3); commit; end numerodiez;

11.- Realice un procedimiento que entregue un libro, esto es ingresando el Rut del Estudiante y el Libro respectivamente (Usar DELETE). create or replace procedure numeroonce (rut_est rut_func in number, cod_libro in number) is begin delete from prestamo where p.rut_est = rut_func and rut_func = rut_func1 and cod_libro, cod_libro1; commit; end numeroonce; in number,

12.- Realizar un procedimiento que realice lo mismo que el ejercicio 7, pero que se le entreguen 2 parmetros (das a evaluar y valor por da de atraso en pesos chilenos) y muestre 3 parmetros de salida (deuda total del alumnado en pesos chilenos, en euros y en dlares). create or replace procedure numerodoce (dias in number, multa in number, pesos out number, euro out number, dollar out number) is begin select sum(trunc(sysdate) trunc(p.fecha_e))*multa round (sum(trunc(sysdate) trunc(p.fecha_e))*multa/500) round (sum(trunc(sysdate) trunc(p.fecha_e))*multa/630) into pesos, euro dollar from prestamo p where (trunc(sysdate) trunc(p.fecha_e)) > = dias; end numerodoce;

You might also like