PLSQL 8 3 Practice

Download as pdf or txt
Download as pdf or txt
You are on page 1of 6
At a glance
Powered by AI
Some key takeaways from the document are that there are three parameter modes - IN, OUT and IN OUT. The default mode is IN. Named, positional and combination notation can be used when calling procedures to associate actual parameters with formal parameters. The DEFAULT option for parameters allows specifying a default value for a parameter in case a value is not passed.

The three parameter modes are IN, OUT and IN OUT. The default mode is IN. The IN mode cannot be modified inside the procedure.

Named notation uses => operator to associate named formal parameters with actual parameters. Positional notation lists actual parameters in the same order as formal parameters. Combination notation uses both positional and named notation. They provide flexibility in how actual parameters are associated with formal parameters when calling procedures.

www.oracle.

com/academy

JESUS EMANUEL GALVAN DIAZ 1630353


Database Programming with PL/SQL
8-3: Passing Parameters
Practice Activities
Vocabulary
Identify the vocabulary word for each definition below:

Returns a value to the caller


OUT Parameter

Provides values for a subprogram to process


IN Parameter

Lists the actual parameters in arbitrary order and uses the association
operator ( ‘=>' which is an equal and an arrow together) to associate a
Named Notation
named formal parameter with its actual parameter

Lists some of the actual parameters as positional (no special operator)


and some as named (with the => operator)
Combination Notation

Lists the actual parameters in the same order as the formal


parameters
Positional Notation

Supplies an input value, which may be returned as a modified value


IN OUT Parameter

Copyright © 2018, Oracle and/or its affiliates. All rights reserved. Oracle and Java are registered trademarks of Oracle and/respective owners. or its affiliates. Other names may be trademarks of their
2

Try It / Solve It
1. Name the three modes for parameters and indicate which mode is the default mode. Which mode
cannot be modified inside the procedure?
IN, OUT, IN OUT y el modo por default es el tipo IN y no se puede cambiar.
2. Procedures:

A. Create a procedure that receives a country_id as an IN parameter and returns the name and
population of that country as OUT parameters. Include an exception handler to trap the
NO_DATA_FOUND exception if the country does not exist. The procedure should not display
the returned values; this will be done in the next step. Name your procedure find_area_pop.
Save your code.

CREATE OR REPLACE PROCEDURE find_area_pop(p_countryid IN


countries.country_id%TYPE, p_countryname OUT VARCHAR2, p_population OUT NUMBER)
AS
BEGIN
SELECT country_name, population INTO p_countryname, p_population FROM countries
WHERE country_id = p_countryid;

EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No hay datos de este ID: ' || p_countryid);
END;

B. Test your procedure by creating and executing an anonymous block which invokes the
procedure and displays the returned OUT values. Save your code. Run the block twice, with
country_ids 2 (Canada) and 10 (does not exist).

Copyright © 2018, Oracle and/or its affiliates. All rights reserved. Oracle and Java are registered trademarks of Oracle and/respective owners. or its affiliates. Other names may be trademarks of their
3

C. Retrieve your procedure code and modify it to add a third OUT parameter which is the
population density of the country, using the formula: density = (population / area). You will
need to modify your SELECT statement to fetch the area column value into a local variable.
Save your modified code.

CREATE OR REPLACE PROCEDURE find_area_pop(p_countryid IN countries.country_id%TYPE,


p_countryname OUT VARCHAR2,
p_population OUT NUMBER, p_densi OUT NUMBER) AS
v_area countries.area%TYPE;
BEGIN
SELECT country_name, population, area INTO p_countryname, p_population, v_area FROM
countries
WHERE country_id = p_countryid;
p_densi := (p_population / v_area);

EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No hay datos de este ID: ' || p_countryid);
END;

DECLARE
v_id employees.employee_id%TYPE;
v_name countries.country_name%TYPE;
v_pop countries.population%TYPE;
v_densi NUMBER(8,2);
BEGIN
v_id := 2;
find_area_pop(v_id, v_name, v_pop, v_densi);
DBMS_OUTPUT.PUT_LINE('ID: ' || v_id || ', Nombre del pais: ' || v_name || ', Poblacion: ' || v_pop || ',
Densidad: ' || v_densi);
END;

D. Test your modifed procedure using country_id 2. You will need to modify your calling
anonymous block to declare and pass a fourth actual parameter to receive the population
density from the procedure. Save your code.

Copyright © 2018, Oracle and/or its affiliates. All rights reserved. Oracle and Java are registered trademarks of Oracle and/respective owners. or its affiliates. Other names may be trademarks of their
4

3. Create a procedure which accepts an integer as an IN OUT parameter and returns the square of
that integer, for example the square of 4 is 16. Save your code. Test your procedure from an
anonymous block three times, using integer values 4, 7, and –20 (negative 20).

CREATE OR REPLACE PROCEDURE numcuad(p_num IN OUT NUMBER)


AS
BEGIN
p_num := p_num * p_num;

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('A ocurrido un error.');
END;

DECLARE
v_num NUMBER := 4;
BEGIN
numcuad(v_num);
DBMS_OUTPUT.PUT_LINE('El numero al cuadrado es: ' || v_num);
END;

4. List the three methods of passing parameters to a procedure.

1. - IN
2. - OUT
3. - IN OUT
A. Retrieve your anonymous block from question 2D and modify its call to find_area_pop to pass
the four parameters using named notation. Test your block, again using country_id 2 (Canada).
If you have forgotten the p_ names of the procedure’s formal parameters, how can you refresh
your memory?

DECLARE
v_id employees.employee_id%TYPE;
v_name countries.country_name%TYPE;
v_pop countries.population%TYPE;
v_densi NUMBER(8,2);
BEGIN
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. Oracle and Java are registered trademarks of Oracle and/respective owners. or its affiliates. Other names may be trademarks of their
5
v_id := 2;
find_area_pop(p_countryid => v_id, p_countryname => v_name, p_population => v_pop, p_densi =>
v_densi);
DBMS_OUTPUT.PUT_LINE('ID: ' || v_id || ', Nombre del pais: ' || v_name || ', Poblacion: ' || v_pop || ',
Densidad: ' || v_densi);
END;
B. Modify the anonymous block from the previous step to pass the FIRST two parameters using
named notation and the LAST two using positional notation. Test the block again. What
happens?

FUNCIONÓ CORRECTAMENTE

DECLARE
v_id employees.employee_id%TYPE;
v_name countries.country_name%TYPE;
v_pop countries.population%TYPE;
v_densi NUMBER(8,2);
BEGIN
v_id := 2;
find_area_pop(p_population => v_pop, p_densi => v_densi, p_countryid => v_id,
p_countryname => v_name);
DBMS_OUTPUT.PUT_LINE('ID: ' || v_id || ', Nombre del pais: ' || v_name || ', Poblacion: ' ||
v_pop || ', Densidad: ' || v_densi);
END;

C. Correct the problem in the previous step by modifying the anonymous block again to pass the
first two parameters using positional notation and the last two using named notation. Test the
block again.
FUNCIONÓ CORRECTAMENTE
DECLARE
v_id employees.employee_id%TYPE;
v_name countries.country_name%TYPE;
v_pop countries.population%TYPE;
v_densi NUMBER(8,2);
BEGIN
v_id := 2;
find_area_pop(v_id, v_name, p_population => v_pop, p_densi => v_densi);
DBMS_OUTPUT.PUT_LINE('ID: ' || v_id || ', Nombre del pais: ' || v_name || ', Poblacion: ' ||
v_pop || ', Densidad: ' || v_densi);
END;

5. In your own words, describe the purpose of the DEFAULT option for parameters and state the two
syntax options for providing the default value in the procedure header.

Un argumento no puede estar vacio por lo tanto se le asigna un valor por default en el
procedimiento.

Copyright © 2018, Oracle and/or its affiliates. All rights reserved. Oracle and Java are registered trademarks of Oracle and/respective owners. or its affiliates. Other names may be trademarks of their
6

CREATE OR REPLACE PROCEDURE numcuad(p_num NUMBER DEFAULT 5,


p_nuum NUMBER := 5);

6. Find the country_id of your own country by executing a suitable SELECT…FROM countries….
Then retrieve your find_area_pop procedure from question 2C. Modify the code to use your
country_id as a default value for the country_id IN parameter. Save your code. Then retrieve your
anonymous block from question 2D and modify it so that it does NOT pass the country_id to the
procedure. Test the block and check that your country’s details are returned and displayed. If your
modified anonymous block does not work, correct it so it will.

Copyright © 2018, Oracle and/or its affiliates. All rights reserved. Oracle and Java are registered trademarks of Oracle and/respective owners. or its affiliates. Other names may be trademarks of their

You might also like