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

De wikiserver
Dreceres ràpides: navegació, cerca
(T4- Sentencies executables)
 
(Hi ha 22 revisions intermèdies del mateix usuari que no es mostren)
Línia 1: Línia 1:
==T4- Sentencies executables ==
+
==T4- Solución : Ineracción con Oracle Server==
  
*'''Exercici 1'''
 
  
:Observa el següent bloc PL/SQL i determina els valors de les variables següents d'acord amb les regles d'àmbit
+
1) Cree un bloque PL/SQL que seleccione el identificador de departamento superior en la tabla departments y lo almacene en la variable v_max_deptno. Muestre el identificador de departamento superior.
  
::DECLARE
+
:a) Declare una variable v_max_deptno de tipo NUMBER en la sección de declaraciones.
  
::v_weight NUMBER(3):=600;
+
<pre>
 +
DECLARE
  
::v_message VARCHAR2(255):='Product 10012';
+
  v_max_deptno NUMBER;
 +
</pre>
  
::BEGIN
+
:b) Inicie la sección ejecutable con la palabra clave BEGIN e incluya una sentencia SELECT para recuperar el valor máximo de department_id de la tabla departments.
  
::::DECLARE
+
<pre>
 +
BEGIN
  
:::::v_weight NUMBER(3):=1;
+
  SELECT MAX(department_id) INTO v_max_deptno FROM departments;
 +
</pre>
  
:::::v_message VARCHAR2(255):='Product 11001';
+
:c) Muestre v_max_deptno y termine el bloque ejecutable.
  
:::::v_new_locn VARCHAR2(50):='Europe';
+
<pre>
 +
  DBMS_OUTPUT.PUT_LINE('The maximum department_id is : ' || v_max_deptno);
 +
END;
 +
</pre>
  
:::::BEGIN
+
:d) Ejecute y guarde el script como lab_04_01_soln.sql. La salida de ejemplo es la siguiente:
  
:::::::v_weight:= v_weight+1;
+
[[Imatge:m2uf3_ios_1.png |300px|center| Interacción Oracle Server]]
  
:::::::v_new_locn:='Western'|| v_new_locn;
+
'''SOLUCIÓ:'''
 +
<pre>
 +
SET SERVEROUTPUT ON
 +
DECLARE
 +
  v_max_deptno NUMBER;
 +
 
 +
BEGIN
 +
  SELECT MAX(department_id) INTO v_max_deptno FROM departments;
 +
  DBMS_OUTPUT.PUT_LINE('The maximum department_id is : ' || v_max_deptno);
 +
END;
 +
</pre>
  
:::::END;
 
  
:::::v_weight:= v_weight+1;
+
2) Modifique el bloque PL/SQL creado en el paso 1 para insertar un nuevo departamento en la tabla departments.
  
:::::v_message:=v_message||'is in stock';
+
:a) Cargue el script lab_04_01_soln.sql. Declare dos variables:
  
:::::v_new_locn:='Western'|| v_new_locn;
+
::v_dept_name de tipo departments.department_name y
 +
::v_dept_id de tipo NUMBER
  
::END;
+
Asigne ‘Education’ a v_dept_name en la sección de declaraciones.
  
 +
<pre>
 +
  v_dept_name departments.department_name%TYPE:= 'Education';
 +
  v_dept_id NUMBER;
 +
</pre>
  
:a) El valor de v_weight en el subbloc és:
+
:b) Ya ha recuperado el número de departamento superior actual de la tabla departments. Agréguele 10 y asigne el resultado a v_dept_id.
  
:b) El valor de v_new_locn en el subbloc és:
+
<pre>
 +
  v_dept_id := 10 + v_max_deptno;
 +
</pre>
  
:c) El valor de v_weight en el bloc principal és:
+
:c) Incluya una sentencia INSERT para insertar datos en las columnas department_name, department_id y location_id de la tabla departments.
  
:d) El valor de v_message en el bloc principal és:
+
Utilice valores en dept_name y dept_id para department_name y department_id, respectivamente, y utilice NULL para location_id.
  
:e) El valor de v_new_locn en el bloc principal es
+
<pre>
 +
...
 +
  INSERT INTO departments (department_id, department_name, location_id)
 +
  VALUES (v_dept_id, v_dept_name, NULL);
 +
</pre>
  
*'''Exercici 2'''
+
:d) Utilice el atributo SQL SQL%ROWCOUNT para mostrar el número de filas que se ven afectadas.
  
Suposem que incloem un subbloc en un bloc tal com es mostra tot seguit. Determina els valors en els casos següents:
+
<pre>
 +
  DBMS_OUTPUT.PUT_LINE (' SQL%ROWCOUNT gives ' || SQL%ROWCOUNT);
 +
  ...
 +
</pre>
  
::DECLARE
+
:e) Ejecute una sentencia SELECT para comprobar si se ha insertado el nuevo departamento. Termine el bloque PL/SQL con “/” e incluya la sentencia SELECT en el script.
  
::::v_customer   VARCHAR2(50):='Womansport';
+
<pre>
 +
...
 +
/
 +
   SELECT * FROM departments
 +
  WHERE department_id= 280;
 +
</pre>
  
::::v_credit_rating    VARCHAR2(50):='excellent';
+
:f) Ejecute y guarde el script como lab_04_02_soln.sql. La salida de ejemplo es la siguiente:
  
::BEGIN
+
[[Imatge:m2uf3_ios_2.png |400px|center| Interacción Oracle Server]]
  
::::DECLARE
+
'''SOLUCIÓ:'''
 +
<pre>
 +
SET SERVEROUTPUT ON
 +
DECLARE
 +
  v_max_deptno NUMBER;
 +
  v_dept_name departments.department_name%TYPE:= 'Education';
 +
  v_dept_id NUMBER;
 +
 
 +
BEGIN
 +
  SELECT MAX(department_id) INTO v_max_deptno FROM departments;
 +
  DBMS_OUTPUT.PUT_LINE('The maximum department_id is : ' || v_max_deptno);
 +
  v_dept_id := 10 + v_max_deptno;
 +
  INSERT INTO departments (department_id, department_name, location_id)
 +
  VALUES (v_dept_id, v_dept_name, NULL);
 +
  DBMS_OUTPUT.PUT_LINE (' SQL%ROWCOUNT gives ' || SQL%ROWCOUNT);
 +
END;
 +
/
 +
  SELECT * FROM departments
 +
  WHERE department_id= 280;
  
::::::v_customer  NUMBER(7):=201;
+
</pre>
  
::::::v_name        VARCHAR2(25):='unisports';
+
3) En el paso 2, defina location_id en NULL. Cree un bloque PL/SQL que actualice location_id a 3000 para el nuevo departamento.
  
::::::BEGIN
+
'''Nota''': si ha terminado correctamente el paso 2, continúe con el paso 3a. De lo contrario, ejecute primero el script de solución /soln/sol_04_02.sql.
  
::::::::vcustomer      v_name        v_credit_rating     
+
:a) Inicie el bloque ejecutable con la palabra clave BEGIN. Incluya la sentencia UPDATE para definir location_id en 3000 para el nuevo departamento (dept_id =280).
  
::::::END;
+
<pre>
 +
BEGIN
  
::::::::vcustomer      v_name        v_credit_rating
+
  UPDATE departments SET location_id=3000 WHERE department_id=280;
 +
</pre>
  
::END;
+
:b) Termine el bloque ejecutable con la palabra clave END. Termine el bloque PL/SQL con “/” e incluya una sentencia SELECT para mostrar el departamento que ha actualizado.
  
:a) El valor de v_customer en el subbloc és:
+
<pre>
 +
END;
 +
/
 +
SELECT * FROM departments WHERE department_id=280;
 +
</pre>
 +
:c) Incluya una sentencia DELETE para suprimir el departamento agregado.
  
:b) El valor de v_name en el subbloc és:
+
<pre>
 +
DELETE FROM departments WHERE department_id=280;
 +
</pre>
  
:c) El valor de v_credit_rating en el subbloc és:
+
:d) Ejecute y guarde el script como lab_04_03_soln.sql. La salida de ejemplo es la siguiente:
  
:d) El valor de v_customer en el bloc principal és:
+
[[Imatge:m2uf3_ios_3.png |400px|center| Interacción Oracle Server]]
  
:e) El valor de v_name en el bloc principal es
+
'''SOLUCIÓ:'''
 +
<pre>
 +
SET SERVEROUTPUT ON
 +
BEGIN
  
:f) El valor de v_credit_rating en el bloc principal és:
+
  UPDATE departments SET location_id=3000 WHERE department_id=280;
 +
 
 +
  --DELETE FROM departments WHERE department_id=280; --primer executar-ho sense aquesta instrucció.
 +
END;
 +
/
 +
  SELECT * FROM departments
 +
  WHERE department_id= 280;
 +
</pre>
  
*'''Exercici 3'''
+
'''ADDICIONALS'''
  
Crea i executa un bloc PL/SQL anomenat “T3E3.sql” que accepti dos números mitjançant variables  SQL*PLUS. S'ha de dividir el primer número pel segon i després afegir el segon número al resultat. El resultat s'ha d'escriure en una variable PL/SQL i s'ha d'imprimir en pantalla amb una variable SQL*PLUS.
+
'''EXERCICI 1'''
  
::Please enter the first number: 2
+
Per a aquest exercici, es necessita una taula temporal per emmagatzemar els resultats.
  
::Please enter the second number: 4
+
'''1.-''' Executa el script lab_ap_04.sql que crea la taula descrita a continuació:
  
::PL/SQL procedure successfully completed._
+
[[Imatge:M2UF3_IOS_1.png |600px|center| Interacció Oracle Server]]
  
::V_RESULT
+
'''2.-''' Escriu un bloc PL/SQL que realitzi les següents accions:
::--------
 
::  4.5
 
  
*'''Exercici 4'''
+
:a) Declara dues variables i assigna el següents valors a aquestes variables:
  
:Genereu un bloc PL/SQL que calculi la compensació total per un any. El salari anual i el percentatge anual de bonificacions es passaran  al bloc PL/SQL mitjançant variables de substitució SQL*PLUS i l'import de bonificació haurà de ser convertit de número enter a decimal (per exemple 15 a 0,15). Si el salari és nul assigneu-li zero abans de calcula la compensació. Utilitzeu la funció NVL per gestionar els valors nuls.
+
[[Imatge:M2UF3_IOS_2.png |600px|center| Interacció Oracle Server]]
  
::Please enter the salary amount: 50000
+
<pre>
 +
CREATE TABLE TEMP(
 +
  NUM_STORE NUMBER(7,2),
 +
  CHAR_STORE VARCHAR2(35),
 +
  DATE_STORE DATE);
 +
</pre>
  
::Please enter the bonus percentage: 10
+
:b) Emmagatzema els valors d'aquestes variables en les columnes adients de la tabla TEMP.
  
::PL/SQL procedure successfully completed._
+
<pre>
 +
DECLARE
 +
  V_MESSAGE VARCHAR2(35);
 +
  V_DATE_WRITTEN DATE;
 +
BEGIN
 +
  V_MESSAGE := 'This is my first PLSQL Program';
 +
  V_DATE_WRITTEN := SYSDATE;
 +
  INSERT INTO temp(CHAR_STORE,DATE_STORE)
 +
  VALUES (V_MESSAGE,V_DATE_WRITTEN);
 +
END;
 +
/
 +
</pre>
  
::G_TOTAL
+
'''3.-''' Verifica els resultats consultant la taula TEMP. La sortida resultant ha de ser com la següent:  
::--------
+
<pre>
::  55000
+
  SELECT * FROM TEMP;
 +
</pre>
 +
[[Imatge:M2UF3_IOS_3.png |600px|center| Interacció Oracle Server]]
 +
 
 +
'''EXERCICI 2'''
 +
 
 +
En aquest exercici, utilitzaràs dades de la taula employees.
 +
 
 +
'''1.-''' Escriu un bloc PL/SQL per determinar el nombre d'empleats que treballen en un determinat departament. El bloc PL/SQL haurà de:
 +
 
 +
:* Utilitzar una variable de substitució per emmagatzemar un número de departament
 +
:* Imprimir el nombre de persones que treballen en el departament especificat
 +
 
 +
<pre>
 +
SET SERVEROUTPUT ON;
 +
 
 +
DECLARE
 +
  V_HOWMANY NUMBER(3);
 +
  V_DEPTNO DEPARTMENTS.department_id%TYPE := &P_DEPTNO;
 +
BEGIN
 +
  SELECT COUNT(*) INTO V_HOWMANY FROM employees
 +
  WHERE department_id = V_DEPTNO;
 +
  DBMS_OUTPUT.PUT_LINE (V_HOWMANY || ' employee(s) work for department number ' ||V_DEPTNO);
 +
END;
 +
/
 +
</pre>
 +
 
 +
'''2.-''' Quan s'execute el bloc , apareixerà una finestra de variable de substitució. Introdueix un número de departament vàlid i fes clic en OK. La sortida resultant haurà de tenir un aspecte similar al següent:
 +
 
 +
[[Imatge:M2UF3_IOS_4.png |600px|center| Interacció Oracle Server]]

Revisió de 13:49, 28 feb 2020

T4- Solución : Ineracción con Oracle Server

1) Cree un bloque PL/SQL que seleccione el identificador de departamento superior en la tabla departments y lo almacene en la variable v_max_deptno. Muestre el identificador de departamento superior.

a) Declare una variable v_max_deptno de tipo NUMBER en la sección de declaraciones.
DECLARE

   v_max_deptno NUMBER;
b) Inicie la sección ejecutable con la palabra clave BEGIN e incluya una sentencia SELECT para recuperar el valor máximo de department_id de la tabla departments.
BEGIN

   SELECT MAX(department_id) INTO v_max_deptno FROM departments;
c) Muestre v_max_deptno y termine el bloque ejecutable.
   DBMS_OUTPUT.PUT_LINE('The maximum department_id is : ' || v_max_deptno);
END;
d) Ejecute y guarde el script como lab_04_01_soln.sql. La salida de ejemplo es la siguiente:
Interacción Oracle Server

SOLUCIÓ:

SET SERVEROUTPUT ON
DECLARE
   v_max_deptno NUMBER;
  
BEGIN
   SELECT MAX(department_id) INTO v_max_deptno FROM departments;
   DBMS_OUTPUT.PUT_LINE('The maximum department_id is : ' || v_max_deptno);
END;


2) Modifique el bloque PL/SQL creado en el paso 1 para insertar un nuevo departamento en la tabla departments.

a) Cargue el script lab_04_01_soln.sql. Declare dos variables:
v_dept_name de tipo departments.department_name y
v_dept_id de tipo NUMBER

Asigne ‘Education’ a v_dept_name en la sección de declaraciones.

   v_dept_name departments.department_name%TYPE:= 'Education';
   v_dept_id NUMBER;
b) Ya ha recuperado el número de departamento superior actual de la tabla departments. Agréguele 10 y asigne el resultado a v_dept_id.
   v_dept_id := 10 + v_max_deptno;
c) Incluya una sentencia INSERT para insertar datos en las columnas department_name, department_id y location_id de la tabla departments.

Utilice valores en dept_name y dept_id para department_name y department_id, respectivamente, y utilice NULL para location_id.

...
   INSERT INTO departments (department_id, department_name, location_id)
   VALUES (v_dept_id, v_dept_name, NULL);
d) Utilice el atributo SQL SQL%ROWCOUNT para mostrar el número de filas que se ven afectadas.
   DBMS_OUTPUT.PUT_LINE (' SQL%ROWCOUNT gives ' || SQL%ROWCOUNT);
   ...
e) Ejecute una sentencia SELECT para comprobar si se ha insertado el nuevo departamento. Termine el bloque PL/SQL con “/” e incluya la sentencia SELECT en el script.
...
/
   SELECT * FROM departments
   WHERE department_id= 280;
f) Ejecute y guarde el script como lab_04_02_soln.sql. La salida de ejemplo es la siguiente:
Interacción Oracle Server

SOLUCIÓ:

SET SERVEROUTPUT ON
DECLARE
   v_max_deptno NUMBER;
   v_dept_name departments.department_name%TYPE:= 'Education';
   v_dept_id NUMBER;
  
BEGIN
   SELECT MAX(department_id) INTO v_max_deptno FROM departments;
   DBMS_OUTPUT.PUT_LINE('The maximum department_id is : ' || v_max_deptno);
   v_dept_id := 10 + v_max_deptno;
   INSERT INTO departments (department_id, department_name, location_id)
   VALUES (v_dept_id, v_dept_name, NULL);
   DBMS_OUTPUT.PUT_LINE (' SQL%ROWCOUNT gives ' || SQL%ROWCOUNT);
END;
/
   SELECT * FROM departments
   WHERE department_id= 280;

3) En el paso 2, defina location_id en NULL. Cree un bloque PL/SQL que actualice location_id a 3000 para el nuevo departamento.

Nota: si ha terminado correctamente el paso 2, continúe con el paso 3a. De lo contrario, ejecute primero el script de solución /soln/sol_04_02.sql.

a) Inicie el bloque ejecutable con la palabra clave BEGIN. Incluya la sentencia UPDATE para definir location_id en 3000 para el nuevo departamento (dept_id =280).
BEGIN

   UPDATE departments SET location_id=3000 WHERE department_id=280;
b) Termine el bloque ejecutable con la palabra clave END. Termine el bloque PL/SQL con “/” e incluya una sentencia SELECT para mostrar el departamento que ha actualizado.
END;
/
SELECT * FROM departments WHERE department_id=280;
c) Incluya una sentencia DELETE para suprimir el departamento agregado.
DELETE FROM departments WHERE department_id=280;
d) Ejecute y guarde el script como lab_04_03_soln.sql. La salida de ejemplo es la siguiente:
Interacción Oracle Server

SOLUCIÓ:

SET SERVEROUTPUT ON
BEGIN

   UPDATE departments SET location_id=3000 WHERE department_id=280;
   
   --DELETE FROM departments WHERE department_id=280; --primer executar-ho sense aquesta instrucció.
END;
/
   SELECT * FROM departments
   WHERE department_id= 280;

ADDICIONALS

EXERCICI 1

Per a aquest exercici, es necessita una taula temporal per emmagatzemar els resultats.

1.- Executa el script lab_ap_04.sql que crea la taula descrita a continuació:

Interacció Oracle Server

2.- Escriu un bloc PL/SQL que realitzi les següents accions:

a) Declara dues variables i assigna el següents valors a aquestes variables:
Interacció Oracle Server
CREATE TABLE TEMP(
  NUM_STORE NUMBER(7,2),
  CHAR_STORE VARCHAR2(35),
  DATE_STORE DATE);
b) Emmagatzema els valors d'aquestes variables en les columnes adients de la tabla TEMP.
DECLARE
   V_MESSAGE VARCHAR2(35);
   V_DATE_WRITTEN DATE;
BEGIN
   V_MESSAGE := 'This is my first PLSQL Program';
   V_DATE_WRITTEN := SYSDATE;
   INSERT INTO temp(CHAR_STORE,DATE_STORE)
   VALUES (V_MESSAGE,V_DATE_WRITTEN);
END;
/

3.- Verifica els resultats consultant la taula TEMP. La sortida resultant ha de ser com la següent:

   SELECT * FROM TEMP;
Interacció Oracle Server

EXERCICI 2

En aquest exercici, utilitzaràs dades de la taula employees.

1.- Escriu un bloc PL/SQL per determinar el nombre d'empleats que treballen en un determinat departament. El bloc PL/SQL haurà de:

  • Utilitzar una variable de substitució per emmagatzemar un número de departament
  • Imprimir el nombre de persones que treballen en el departament especificat
SET SERVEROUTPUT ON;

DECLARE
   V_HOWMANY NUMBER(3);
   V_DEPTNO DEPARTMENTS.department_id%TYPE := &P_DEPTNO;
BEGIN
   SELECT COUNT(*) INTO V_HOWMANY FROM employees
   WHERE department_id = V_DEPTNO;
   DBMS_OUTPUT.PUT_LINE (V_HOWMANY || ' employee(s) work for department number ' ||V_DEPTNO);
END;
/

2.- Quan s'execute el bloc , apareixerà una finestra de variable de substitució. Introdueix un número de departament vàlid i fes clic en OK. La sortida resultant haurà de tenir un aspecte similar al següent:

Interacció Oracle Server