Diferència entre revisions de la pàgina «M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T8»

De wikiserver
Dreceres ràpides: navegació, cerca
(Es crea la pàgina amb «En esta práctica, creará disparadores de sentencia y de fila. También creará procedimientos que se llamarán desde los disparadores. 1) Las filas de la tabla JOBS al…».)
 
Línia 11: Línia 11:
 
de trabajo del empleado y el otro para el salario.
 
de trabajo del empleado y el otro para el salario.
  
::ii) El procedimiento utiliza el identificador de trabajo para determinar el salario
+
::ii) El procedimiento utiliza el identificador de trabajo para determinar el salario mínimo y máximo para el trabajo especificado.
mínimo y máximo para el trabajo especificado.
 
  
:::iii) Si el parámetro del salario, mínimo y máximo incluidos, no está dentro del
+
::iii) Si el parámetro del salario, mínimo y máximo incluidos, no está dentro del rango de salarios, aparecerá una excepción de aplicación con el mensaje “Invalid salary <sal>. Salaries for job <jobid> must be between <min> and <max>”. Sustituya los distintos elementos del mensaje por los valores que proporcionan los parámetros y las variables rellenados con consultas. Guarde el archivo.  
rango de salarios, aparecerá una excepción de aplicación con el mensaje “Invalid salary <sal>. Salaries for job <jobid> must be between <min> and <max>”. Sustituya los distintos elementos del mensaje por los valores que proporcionan los parámetros y las variables rellenados con consultas. Guarde el archivo.  
 
  
 
'''Abra el script /home/oracle/labs/plpu/solns/sol_08_01_a.sql. Haga clic en el icono Run Script (F5) de la barra de herramientas de SQL Worksheet para ejecutar el script. El código y el resultado se muestran a continuación.'''
 
'''Abra el script /home/oracle/labs/plpu/solns/sol_08_01_a.sql. Haga clic en el icono Run Script (F5) de la barra de herramientas de SQL Worksheet para ejecutar el script. El código y el resultado se muestran a continuación.'''
 +
<pre>
 +
    CREATE OR REPLACE PROCEDURE check_salary (p_the_job VARCHAR2,
 +
    p_the_salary NUMBER) IS
 +
        v_minsal jobs.min_salary%type;
 +
        v_maxsal jobs.max_salary%type;
 +
    BEGIN
 +
        SELECT min_salary, max_salary INTO v_minsal, v_maxsal
 +
        FROM jobs
 +
        WHERE job_id = UPPER(p_the_job);
 +
        IF p_the_salary NOT BETWEEN v_minsal AND v_maxsal THEN
 +
          RAISE_APPLICATION_ERROR(-20100,
 +
              'Invalid salary $' ||p_the_salary ||'. '||
 +
              'Salaries for job '|| p_the_job ||
 +
              ' must be between $'|| v_minsal ||' and $' || v_maxsal);
 +
        END IF;
 +
      END;
 +
      /
 +
      SHOW ERRORS
 +
</pre>

Revisió del 16:23, 22 abr 2016

En esta práctica, creará disparadores de sentencia y de fila. También creará procedimientos que se llamarán desde los disparadores.

1) Las filas de la tabla JOBS almacenan los salarios mínimos y máximos permitidos para los distintos valores de JOB_ID. Le piden que escriba un código para garantizar que el salario de los empleados esté dentro del rango permitido por su tipo de trabajo, para operaciones de inserción y actualización.

a) Cree un procedimiento denominado CHECK_SALARY, de la siguiente forma:
i) El procedimiento acepta dos parámetros, uno para la cadena del identificador

de trabajo del empleado y el otro para el salario.

ii) El procedimiento utiliza el identificador de trabajo para determinar el salario mínimo y máximo para el trabajo especificado.
iii) Si el parámetro del salario, mínimo y máximo incluidos, no está dentro del rango de salarios, aparecerá una excepción de aplicación con el mensaje “Invalid salary <sal>. Salaries for job <jobid> must be between <min> and <max>”. Sustituya los distintos elementos del mensaje por los valores que proporcionan los parámetros y las variables rellenados con consultas. Guarde el archivo.

Abra el script /home/oracle/labs/plpu/solns/sol_08_01_a.sql. Haga clic en el icono Run Script (F5) de la barra de herramientas de SQL Worksheet para ejecutar el script. El código y el resultado se muestran a continuación.

     CREATE OR REPLACE PROCEDURE check_salary (p_the_job VARCHAR2,
     p_the_salary NUMBER) IS
        v_minsal jobs.min_salary%type;
        v_maxsal jobs.max_salary%type;
     BEGIN
        SELECT min_salary, max_salary INTO v_minsal, v_maxsal
        FROM jobs
        WHERE job_id = UPPER(p_the_job);
        IF p_the_salary NOT BETWEEN v_minsal AND v_maxsal THEN
           RAISE_APPLICATION_ERROR(-20100,
              'Invalid salary $' ||p_the_salary ||'. '||
              'Salaries for job '|| p_the_job ||
              ' must be between $'|| v_minsal ||' and $' || v_maxsal);
        END IF;
      END;
      /
      SHOW ERRORS