Está en la página 1de 15

1.

- Procedimiento ADD_JOB
a) Cree un procedimiento ADD_JOB para insertar un nuevo
trabajo en la tabla JOBS. Proporcione el identificador y el cargo
utilizando dos parámetros

CREATE OR REPLACE PROCEDURE ADD_JOB
(
V_ID IN JOBS.JOB_ID%TYPE,
V_CARGO IN JOBS.JOB_TITLE%TYPE
)
IS
BEGIN
INSERT INTO JOBS (JOB_ID, JOB_TITLE)
VALUES (V_ID, V_CARGO);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE ('YA SE HA INGRESADO');
COMMIT;
END ADD_JOB;

b)

Llame al procedimiento con IT_DBA como identificador de
trabajo y Database Administrator como cargo. Consulte la
tabla JOBS y vea el resultado.
BEGIN
ADD_JOB('IT_DBA','Database
END;

Administrator');

2.JOB_TITLE%TYPE ) IS BEGIN UPDATE JOBS SET JOB_TITLE=V_CARGO WHERE JOB_ID=V_ID.PUT_LINE('NO EXISTE DICHO EL ID').Procedimiento UPD_JOB a) Cree un procedimiento UPD_JOB para actualizar el cargo.JOB_ID%TYPE. Incluya el manejo de excepciones necesario si no se ha producido la actualización. END. DBMS_OUTPUT. ya se encuentran en la tabla.. Sale el mensaje de “Ya se ha ingresado” porque ST_MAN y Stock Manager. CREATE OR REPLACE PROCEDURE UPD_JOB ( V_ID IN JOBS.c) Llame al procedimiento de nuevo y transfiera un identificador ST_MAN y un cargo Stock Manager ¿Qué sucede? ¿Porque? BEGIN ADD_JOB('ST_MAN'. EXCEPTION WHEN OTHERS THEN ROLLBACK. V_CARGO IN JOBS. Proporcione el identificador de trabajo y un cargo nuevo utilizando los parámetros. COMMIT.'Stock Manager'). END UPD_JOB. .

BEGIN UPD_JOB('IT_DBA'. por lo tanto no se realiza nada.'Web Master').'Data Administrator'). END. .b) Llame al procedimiento para cambiar el cargo del identificador de trabajo IT_DBA a Data Administrator. Consulte la tabla JOBS y vea el resultado. BEGIN UPD_JOB('IT_WEB'. Va directo a la excepción. Puede utilizar el identificador de trabajo IT_WEB y el cargo WEB_MASTER. END. ‘IT_WEB’ no existe. c) Pruebe la sección de manejo de excepciones del procedimiento intentando actualizar un trabajo que no exista.

3. END. c) Pruebe la sección de manejo de excepciones del procedimiento intentando suprimir un trabajo que no existe. BEGIN DEL_JOB('IT_WEB'). Aparecerá el mensaje que haya incluido en la sección de manejo de excepciones del procedimiento como salida. COMMIT. b) Llame al procedimiento mediante el identificador de trabajo IT_DBA. DBMS_OUTPUT.Procedimiento DEL_JOB a) Cree un procedimiento DEL_JOB para suprimir un trabajo. END.. BEGIN DEL_JOB('IT_DBA'). Incluya el código de manejo de excepciones necesario si no se ha suprimido ningún trabajo.JOB_ID%TYPE ) IS BEGIN DELETE FROM JOBS WHERE JOB_ID=V_ID. Consulte la tabla JOBS y vea el resultado. . Utilice IT_WEB como identificador de trabajo. EXCEPTION WHEN OTHERS THEN ROLLBACK.PUT_LINE('NO EXISTE EL REGISTRO'). END DEL_JOB. CREATE OR REPLACE PROCEDURE DEL_JOB ( V_ID IN JOBS.

V_ID JOBS. V_SALARY OUT EMPLOYEES. b) Ejecute el procedimiento utilizando las variables del host para los dos parámetros OUT: uno para el salario y el otro para el identificador de trabajo. V_ID OUT JOBS. JOBS J WHERE E.SALARY%TYPE. si los hay y a continuación recompile el código.SALARY. END GET_EMPLOYEE.PUT_LINE(' EL EMPLEADO NO EXISTE '). IF(V_SALARY>0) THEN DBMS_OUTPUT. EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT. .JOB_ID=J.V_SALARY.PUT_LINE('V_SALARY '||V_SALARY). V_ID FROM EMPLOYEES E. CREATE OR REPLACE PROCEDURE GET_EMPLOYEE ( V_EMPLOYEE IN EMPLOYEES.JOB_ID%TYPE. Muestre el salario y el identificador de trabajo para el identificador de empleado 120 DECLARE V_SALARY EMPLOYEES. BEGIN GET_EMPLOYEE(120.JOB_ID%TYPE ) IS BEGIN SELECT E.SALARY%TYPE.Procedimiento GET_EMPLOYEE a) Cree un procedimiento que devuelva un valor de las columnas SALARY y JOB_ID para el identificador del empleado especificado. J.4.EMPLOYEE_ID%TYPE.JOB_ID AND E.V_ID). Elimine los errores de sintaxis.EMPLOYEE_ID=V_EMPLOYEE..JOB_ID INTO V_SALARY.

V_SALARY.PUT_LINE('V_ID END IF. BEGIN GET_EMPLOYEE(300. ' ||V_ID). . c) Llame al procedimiento de nuevo y transfiera un EMPLOYEE_ID 300 ¿Qué sucede? ¿Porque? DECLARE V_SALARY EMPLOYEES. END.SALARY%TYPE. DBMS_OUTPUT. V_ID JOBS.PUT_LINE('V_SALARY '||V_SALARY).DBMS_OUTPUT. IF(V_SALARY>0) THEN DBMS_OUTPUT.V_ID). Se muestra el mensaje que el empleado no existe.PUT_LINE('V_ID ' ||V_ID). END IF.JOB_ID%TYPE. Entra por la excepción ya que el ID del empleado “EMPLOYEE_ID” no existe en la tabla EMPLOYEES. END.

Funciones Almacenadas 1..Cree y llame a la función GET_JOB para devolver un cargo .

PUT_LINE('NO EXISTE '). RETURN CARGO. DECLARE B_TITLE VARCHAR2(35) . BEGIN SELECT JOB_TITLE INTO CARGO FROM JOBS WHERE JOB_ID= V_ID . BEGIN B_TITLE:= GET_JOB('SA_REP').PUT_LINE('B_TITLE END. END GET_JOB.a) Cree y compile la función denominada GET_JOB para devolver un cargo CREATE OR REPLACE FUNCTION GET_JOB (V_ID IN JOBS. Llame a la función con identificador de trabajo SA_REP para que devuelva el valor de la variable del host y. EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT. .JOB_ID%TYPE) RETURN VARCHAR2 IS CARGO VARCHAR2(35). DBMS_OUTPUT. que permita una longitud de 35 caracteres. b) Cree una variable de host VARCHAR2 denominada b_title y compile la función denominada b_title. ' ||B_TITLE). a continuación imprima la variable de host para ver el resultado. RETURN NULL.

SALARY%TYPE. a) Cree la función GET_ANNUAL_COMP . IF V_COMMISSION>0 AND V_SALARY>0 THEN V_TOTAL_ANUAL:=((V_SALARY*12)+(V_COMMISSION*V_SALARY*12)). Uno o ambos valores transferidos pueden ser NULL. COMMISSION_PCT INTO V_SALARY. pero la función deberá volver un salario anual no NULL.Cree una función llamada GET_ANNUAL_COMP para devolver el salario anual de un empleado calculado a partir del salario mensual y la comisión transferida como parámetros. V_COMMISSION EMPLOYEES. END GET_ANNUAL_COMP.2. que acepta valores de parámetros del salario mensual y la comisión.V_COMMISSION FROM EMPLOYEES WHERE EMPLOYEE_ID=V_ID. BEGIN SELECT SALARY.COMMISSION_PCT%TYPE.. V_TOTAL_ANUAL NUMBER. b) Utilice la función en una sentencia SELECT en la tabla EMPLOYEES para los empleados del departamento 30 . END IF. ELSE V_TOTAL_ANUAL:=(V_SALARY*12).EMPLOYEE_ID%TYPE) RETURN NUMBER IS V_SALARY EMPLOYEES. Utilice la siguiente formula básica para calcular el salario anual: (salary*12) + (commission_pct*salary*12) CREATE OR REPLACE FUNCTION GET_ANNUAL_COMP (V_ID IN EMPLOYEES. RETURN V_TOTAL_ANUAL.

LAST_NAME.Cree un procedimiento ADD_EMPLOYEE. para insertar un nuevo empleado en la tabla EMPLOYEES. alertara al usuario con un mensaje adecuado. El procedimiento llamara una función VALID_DEPTID para comprobar si el identificador (id) de departamento especificado para el nuevo empleado existe en la tabla DEPARTMENTS a) Cree una función denominada VALID_DEPTID para validar el identificador de departamento especificado y devolver un valor BOOLEAN TRUE si existe el departamento CREATE OR REPLACE FUNCTION VALID_DEPTID (V_DEPT IN DEPARTMENTS. de lo contrario. END IF. Proporcione los siguientes parámetros:  First_name  Last_name . IF DEP>0 THEN RETURN TRUE. BEGIN SELECT COUNT(*) INTO DEP FROM DEPARTMENTS WHERE DEPARTMENT_ID = V_DEPT.. ELSE RETURN FALSE. b) Cree el procedimiento ADD_EMPLOYEE para agregar un empleado a la tabla EMPLOYEES. GET_ANNUAL_COMP (EMPLOYEE_ID) FROM EMPLOYEES WHERE DEPARTMENT_ID=30.DEPARTMENT_ID%TYPE) RETURN BOOLEAN IS DEP NUMBER :=0.SELECT EMPLOYEE_ID. La fila se debe agregar a la tabla EMPLOYEES si la función VALID_DEPTID devuelve TRUE. END VALID_DEPTID. 3.

SALARY. V_EMAIL IN EMPLOYEES. 15).NEXTVAL.EMAIL. END ADD_EMPLOYEE. COMMIT. V_APELLIDO IN EMPLOYEES. END IF.V_DEPT). .LAST_NAME%TYPE.FIRST_NAME%TYPE. c) Llame a ADD_EMPLOYEE para el nombre ‘Jane Harris’ del departamento 15.V_EMAIL. V_DEPT IN EMPLOYEES. ELSE DBMS_OUTPUT.email job: utilice ‘SA_REP’ como valor por defecto mgr: utilice 145 como valor por defecto sal: utilice 1000 como valor por defecto comm: utilice 0 como valor por defecto deptid: utilice 30 como valor por defecto Utilice la secuencia EMPLOYEES_SEQ para definir la columna EMPLOYEE_ID  Defina la columna Hire_date en TRUNC (SYSDATE)        CREATE OR REPLACE PROCEDURE ADD_EMPLOYEE ( V_NOMBRE IN EMPLOYEES.1.DEPARTMENT_ID) VALUES(EMPLOYEES_SEQ.1000.COMMISSION_PCT.PUT_LINE('EL DEPARTAMENTO AL QUE QUIERE INGRESAR EL NUEVO EMPLEADO NO EXISTE').LAST_NAME.TRUNC(S YSDATE).HIRE _DATE.V_NOMBRE. 'jane@harri.DEPARTMENT_ID%TYPE ) IS BEGIN IF VALID_DEPTID(V_DEPT)=TRUE THEN INSERT INTO EMPLOYEES(EMPLOYEE_ID.com'.0.EMAIL%TYPE.MANAGER_ID. 'Harris'.'SA_REP'.JOB_ID.PHONE_NUMBER.145. dejando otros parámetros con los valores por defecto ¿Cuál es el resultado? BEGIN ADD_EMPLOYEE('Jane'. END.V_APELLIDO.FIRST_NAME.

'harris'. 80). END.com'.d) Agregue otro empleado llamado Joe Harris en el departamento 80 dejando los parámetros restantes con sus valores por defecto ¿Cuál es el resultado? BEGIN ADD_EMPLOYEE('joe'. Se ingreso el empleado exitosamente ya que al departamento que ingresa si existe. . 'joeh@hotmail.

OI. Cantidad) CREATE OR REPLACE VIEW VW_PRODUCTOS_VENDIDOS AS SELECT PI.PRODUCT_DESCRIPTION. Nombre del Producto. descripción del Producto. PI.PRODUCT_ID. PI.PRODUCT_NAME.QUANTITY FROM PRODUCT_INFORMATION PI.Vistas y Funciones 1) Realizar una vista almacenada VW_PRODUCTOS_VENDIDOS la cual mostrara la información del producto que más ha sido vendido y el que menos se ha vendido (Campos: Código del Producto. ORDER_ITEMS OI .

QUANTITY IN (SELECT MIN(QUANTITY) FROM ORDER_ITEMS) 2) Realizar una función almacenada FC_CUST_VALOR la cual recuperara el valor total que ha gastado un cliente en productos en un año específico. (CUSTOMER_NAME).UNIT_PRICE%TYPE. La función tendrá como parámetro de entrada el código del cliente y el año.PRODUCT_ID AND OI. y retornara el valor consumido por el cliente en ese año. CURSOR C1 IS SELECT C.PRODUCT_ID AND OI. ANIO INTEGER) RETURN NUMBER IS ORDER_TOTAL NUMBER(10.QUANTITY FROM PRODUCT_INFORMATION PI.PRODUCT_ID=OI. CREATE OR REPLACE FUNCTION FC_CUST_VALOR (CODIGO ORDERS. 'YYYY') AS INTEGER) = ANIO GROUP BY CUSTOMER_ID.CUSTOMER_ID%TYPE. ORDER_ITEMS OI WHERE PI.PRODUCT_ID=OI.CUST_FIRST_NAME .QUANTITY =(SELECT MAX(QUANTITY) FROM ORDER_ITEMS) UNION ALL SELECT PI.PRODUCT_ID. BEGIN SELECT SUM(ORDER_TOTAL) INTO ORDER_TOTAL FROM ORDERS WHERE CUSTOMER_ID = CUSTOMER_ID AND CAST(TO_CHAR(ORDER_DATE.CUSTOMER_ID%TYPE. ANIO VARCHAR2 ) RETURN NUMBER IS TOTAL ORDER_ITEMS. que menos ha gastado (dinero) en compras.WHERE PI.PRODUCT_DESCRIPTION. En caso de existir más de un cliente con el mismo valor se deberá mostrar concatenado los diferentes nombres de clientes. BEGIN CREATE OR REPLACE FUNCTION FC_CUST_VALOR(CUSTOMER_ID CUSTOMERS. PI. 3) Crear una función almacenada FC_CLIENTE_GASTO la cual retornara el nombre del cliente.PRODUCT_NAME.CUST_FIRST_NAME%TYPE := ''. OI. END. CREATE OR REPLACE FUNCTION FC_CLIENTE_GASTO RETURN VARCHAR2 IS CUST_FIRST_NAME CUSTOMERS. PI. 2). RETURN ORDER_TOTAL.

END.ORDER_ID).CUSTOMER_ID AND O.CUSTOMER_ID = O. ORDERS O WHERE C. .CUST_FIRST_NAME. END LOOP.' || REG.ORDER_TOTAL IN(SELECT MIN(O.CUSTOMER_ID GROUP BY O. BEGIN FOR REG IN C1 LOOP CUST_FIRST_NAME := CUST_FIRST_NAME || '. RETURN CUST_FIRST_NAME.FROM CUSTOMERS C. ORDERS O WHERE C.ORDER_TOTAL) FROM CUSTOMERS C.CUSTOMER_ID = O.