BDII Tema03
BDII Tema03
BDII Tema03
3
Observaie!
Scriei rezolvarea direct n acest document!
1. Enter and run the following anonymous block, observing that it executes successfully.
DECLARE
v_emp_lname employees.last_name%TYPE;
v_emp_salary employees.salary%TYPE;
BEGIN
SELECT last_name, salary INTO v_emp_lname, v_emp_salary
FROM employees
WHERE job_id = 'AD_PRES';
DBMS_OUTPUT.PUT_LINE(v_emp_lname||' '||v_emp_salary);
END;
A. Now modify the block to use IT_PROG instead of AD_PRES and re-run it. Why does it
fail this time?
The into command from the select return multiple registers
B. Now modify the block to use IT_PRAG instead of IT_PROG and re-run it. Why does it
still fail?
In the table there are not employees with such id
The following questions use a copy of the departments table. Execute the following SQL
statement to create the copy table.
CREATE TABLE new_depts AS SELECT * FROM departments;
2. Examine and run the following PL/SQL code, which obtains and displays the maximum
department_id from new_depts.
DECLARE
v_max_deptno new_depts.department_id%TYPE;
BEGIN
SELECT MAX(department_id) INTO v_max_deptno
FROM new_depts;
DBMS_OUTPUT.PUT_LINE('The maximum department id is: '|| v_max_deptno);
END;
3. Modify the code to declare two additional variables, (assigning a new department name to one
of them) by adding the following two lines to your Declaration section:
DECLARE
v_dept_name new_depts.department_name%TYPE:= 'A New Department' ;
v_dept_id new_depts.department_id%TYPE;
BEGIN
v_dept_name := 'A New Department';
SELECT MAX(department_id) INTO v_dept_id
FROM new_depts;
DBMS_OUTPUT.PUT_LINE('The department name is: '|| v_dept_name);
DBMS_OUTPUT.PUT_LINE('The department id is: '|| v_dept_id);
END;
4. Modify the code to add 10 to the current maximum department number and assign the result to
v_dept_id.
DECLARE
v_dept_name new_depts.department_name%TYPE := 'A New Department' ;
v_dept_id new_depts.department_id%TYPE;
BEGIN
v_dept_name := 'A New Department';
SELECT MAX(department_id)+10
INTO v_dept_id
FROM new_depts;
DBMS_OUTPUT.PUT_LINE('The department name is: '|| v_dept_name);
DBMS_OUTPUT.PUT_LINE('The department id is: '|| v_dept_id);
END;
5. Modify the code to include an INSERT statement to insert a new row into the new_depts table,
using v_dept_id and v_dept_name to populate the department_id and department_name columns.
Insert NULL into the location_id and manager_id columns. Save your code.
DECLARE
v_dept_name new_depts.department_name%TYPE := 'A New Department' ;
v_dept_id new_depts.department_id%TYPE;
BEGIN v_dept_name := 'A New Department';
SELECT MAX(department_id)+10
INTO v_dept_id
FROM new_depts;
INSERT
INTO new_depts (department_id, department_name, location_id, manager_id)
VALUES (v_dept_id, v_dept_name, null, null);
END;
6. Execute the block and check that the new row has been inserted.
1 row(s) inserted
7. Now modify the code to use SQL%ROWCOUNT to display the number of rows inserted, and
execute the block again.
DECLARE
v_dept_name new_depts.department_name%TYPE := 'A New Department' ;
v_dept_id new_depts.department_id%TYPE;
BEGIN
v_dept_name := 'A New Department';
SELECT MAX(department_id)+10 INTO v_dept_id FROM new_depts;
INSERT INTO new_depts (department_id, department_name, location_id, manager_id)
VALUES (v_dept_id, v_dept_name, null, null);
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT || ' rows inserted.');
END;
8. Now modify the block, removing the INSERT statement and adding a statement that will
UPDATE all rows with location_id = 1700 to location_id = 1400. Execute the block again to see
how many rows were updated.
DECLARE
v_dept_name new_depts.department_name%TYPE := 'A New Department' ;
v_dept_id new_depts.department_id%TYPE;
BEGIN UPDATE new_depts
SET location_id = 1400 WHERE location_id = 1700;
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT || ' rows updated.');
END;
9. Create the endangered_species table by running the following statement in Application
Express:
CREATE TABLE endangered_species
(species_id NUMBER(4) CONSTRAINT es_spec_pk PRIMARY KEY,
common_name VARCHAR2(30) CONSTRAINT es_com_name_nn NOT NULL,
scientific_name VARCHAR2(30) CONSTRAINT es_sci_name_nn NOT NULL);
Table created.
0.02 seconds
10. Examine the following block. If you were to run this block, what data do you think would be
saved in the database?
BEGIN
INSERT INTO endangered_species
VALUES (100, 'Polar Bear','Ursus maritimus');
SAVEPOINT sp_100;
INSERT INTO endangered_species
VALUES (200, 'Spotted Owl','Strix occidentalis');
SAVEPOINT sp_200;
INSERT INTO endangered_species
VALUES (300, 'Asiatic Black Bear','Ursus thibetanus');
ROLLBACK TO sp_100;
COMMIT;
END;
Statement processed.
0.02 seconds
In the SP_100 it will save 100, 'Polar Bear','Ursus maritimus'.
11. Run the block to test your theory. Select from the table to confirm the result.
12. Examine the following block. If you were to run this block, what data do you think would be
saved in the database?
BEGIN
INSERT INTO endangered_species
VALUES (400, 'Blue Gound Beetle','Carabus intricatus');
SAVEPOINT sp_400;
INSERT INTO endangered_species
VALUES (500, 'Little Spotted Cat','Leopardus tigrinus');
ROLLBACK;
14. Write a PL/SQL block to find the population of a given country in the wf_countries table.
Display a message indicating whether the population is greater than or less than 1 billion
(1,000,000,000). Test your block twice using India (country_id=91) and United Kingdom
(country_id=44). Indias population should be greater than 1 billion, while United Kingdoms
should be less than 1 billion.
DECLARE
v_india wf_countries.population%TYPE ;
v_nume wf_countries.COUNTRY_NAME%TYPE;
BEGIN
SELECT population,COUNTRY_NAME INTO v_india,v_nume FROM wf_countries
WHERE country_id=91; IF v_india>1000000000 THEN
DBMS_OUTPUT.PUT_LINE('populatia mai mare de 1.000.000.000 este ' ||v_nume);
END IF;
END;
15. Examine the following code. What output do you think it will produce?
DECLARE
v_num1 NUMBER(3) := 123;
v_num2 NUMBER;
BEGIN
IF v_num1 <> v_num2 THEN
DBMS_OUTPUT.PUT_LINE('The two numbers are not equal');
ELSE
DBMS_OUTPUT.PUT_LINE('The two numbers are equal');
END IF;
END;
The two numbers are equal
Statement processed.
0.01 seconds
Enter and run the script to check if your answer was correct.
16. Write a PL/SQL block to select the number of countries using a supplied currency name. If
the number of countries is greater than 20, display More than 20 ccountries. If the number of
countries is between 10 and 20, display Between 10 and 20 countries. If the number of
countries is less than 10, display Fewer than 10 countries. Use a CASE statement.
DECLARE
v_no_of_countries wf_countries.currency_code%TYPE;
BEGIN
SELECT COUNT(currency_code) INTO v_no_of_countries
FROM wf_countries WHERE currency_code ='EUR';
CASE
WHEN v_no_of_countries <10 THEN 'Fewer than 10 countries'
WHEN v_no_of_countries BETWEEN (10,20) THEN 'Between 10 and 20 countries'
ELSE 'More than 20 countries'
END;
DBMS_OUTPUT.PUT_LINE('No of countries is : '||v_no_of_countries);
END;
17. Write a PL/SQL block to display the country_id and country_name values from the
WF_COUNTRIES table for country_id whose values range from 1 through 3. Use a basic loop.
Increment a variable from 1 through 3. Use an IF statement to test your variable and EXIT the
loop after you have displayed the first 3 countries.
DECLARE
v_countryid wf_countries.country_id%TYPE := 1;
v_countryname wf_countries.country_name%TYPE;
v_counter NUMBER(2) := 0;
BEGIN
LOOP
SELECT country_id INTO v_countryid FROM wf_countries
WHERE country_id = v_counter;
v_counter := v_counter + 1;
DBMS_OUTPUT.PUT_LINE('Countries are: '||v_countryid);
EXIT WHEN v_counter > 3;
END LOOP;
END;
18. Modify your solution to question 4 above, replacing the IF statement with an EXIT....WHEN
statement.
DECLARE
v_dept_name new_depts.department_name%TYPE := 'A New Department' ;
v_dept_id new_depts.department_id%TYPE;
BEGIN
v_dept_name := 'A New Department';
SELECT MAX(department_id)+10
INTO v_dept_id
FROM new_depts;
EXIT
DBMS_OUTPUT.PUT_LINE('The department name is: '|| v_dept_name);
DBMS_OUTPUT.PUT_LINE('The department id is: '|| v_dept_id);
END;
19. Write a PL/SQL block to display the country_id and country_name values from the
WF_COUNTRIES table for country_id whose values range from 51 through 55. Use a WHILE
loop. Increment a variable from 51 through 55. Test your variable to see when it reaches 55.
EXIT the loop after you have displayed the 5 countries.
20. Write a PL/SQL block to display the country_id and country_name values from the
WF_COUNTRIES table for country_id whose values range from 51 through 55 in the reverse
order. Use a FOR loop.
21. Write a PL/SQL block to produce a list of available vehicle license plate numbers. These
numbers must be in the following format: NN-MMM, where NN is between 60 and 65, and
MMM is between 100 and 110. Use nested FOR loops. The outer loop should choose numbers
between 60 and 65. The inner loop should choose numbers between 100 and 110, and
concatenate the two numbers together.