A Practice Solutions
General Notes: • Save all your lab files at the following location: D:\labs\PLSF\labs. • Enter your SQL statements in a SQL Worksheet. To save a script in SQL Developer, from the File menu, select Save As or right-click in the SQL Worksheet and select Save file to save your SQL statement as a lab_<lessonno>_<stepno>.sql script. To modify an existing script, use File > Open to open the script file, make changes and then make sure you use Save As to save it with a different filename. • To run the query, click the Execute Statement icon (or press F9) in the SQL Worksheet. For DML and DDL statements, use the Run Script icon (or press F5). • After you have executed a saved script, make sure that you do not enter your next query in the same worksheet. Open a new worksheet.
Oracle Database 11g: PL/SQL Fundamentals A - 2
Practice I This is the first of many practices in this course. The solutions (if you require them) can be found in Appendix A. Practices are intended to cover most of the topics that are presented in the corresponding lesson. 1. Start up SQL Developer using the user ID and password that are provided to you by the instructor such as oraxx where xx is the number assigned to your PC. Click the SQL Developer icon on your desktop.
2. Create a database connection using the following information: a. Connection Name: MyDBConnection. b. Username: oraxx where xx is the number assigned to your PC by the instructor. c. Password: oraxx where xx is the number assigned to your PC by the instructor. d. Hostname: Enter the host name for your PC. e. Port: 1521 f. SID: ORCL Right-click the Connections icon on the Connections tabbed page, and then select the New Database Connection option from the shortcut menu. The New/Select Database Connection window is displayed. Use the preceding information provided to create the new database connection. Note: To display the properties of the newly created connection, right-click the connection name, and then select Properties from the shortcut menu. Substitute the username, password, host name, and service name with the appropriate information as provided by your instructor. The following is a sample of the newly created database connection for student ora41:
Oracle Database 11g: PL/SQL Fundamentals A - 3
3. connect to the database using this new connection.4
. If the Status is Success.
Oracle Database 11g: PL/SQL Fundamentals A . Test the new connection. Double-click the MyDBConnection icon on the Connections tabbed page. a. b.
4. If the status is Success. click the Connect button. Browse the structure of the EMPLOYEES table and display its data. Click the Test button in the New/Select Database Connection window.
The Columns tab displays the columns in the EMPLOYEES table as follows:
5. c. Expand the Tables icon by clicking the plus sign next to it. click the Data tab. b. To display the employees’ data. Display the structure of the EMPLOYEES table.a. Expand the MyDBConnection connection by clicking the plus sign next to it.5
. Browse the EMPLOYEES table and display its data. Double-click the EMPLOYEES table. The EMPLOYEES table data is displayed as follows:
Oracle Database 11g: PL/SQL Fundamentals A .
Select the new MyDBConnection from the Connection drop-down list (if not already selected). The Select Connection window is displayed. Display the SQL Worksheet using any of the following two methods: a. Use the SQL Worksheet to select the last names and salaries of all employees whose annual salary is greater than $10. which provides the description and data for all tables in the HR schema that you will use in this course. Click the Open SQL Worksheet icon on the toolbar.
Oracle Database 11g: PL/SQL Fundamentals A . Select Tools > SQL Worksheet or click the Open SQL Worksheet icon. b. and then click OK.6
. or consult Appendix B. Use both the Execute Statement (F9) and the Run Script icon (F5) icons to execute the SELECT statement. Review the results of both methods of executing the SELECT statements in the appropriate tabs. Note: Take a few minutes to familiarize yourself with the data.000.6.
Oracle Database 11g: PL/SQL Fundamentals A . The Preferences window is displayed. In the SQL Developer menu.7
.7. navigate to Tools > Preferences.
Click the Worksheet Parameters option under the Database option. code examples scripts. In the “Select default path to look for scripts” text box. specify the D:\labs\PLSF folder.8
.8. This folder contains the solutions scripts.
Oracle Database 11g: PL/SQL Fundamentals A . and any labs or demos used in this course. Click OK when done to accept the new setting.
and then select Open File from the shortcut menu. c. The Open window is displayed. and open a script file without executing the code.9
. How many subfolders do you see in the labs folder? d. b. Navigate through the folders.9. Right-click the SQL Worksheet area. Ensure that the path that you set in a previous step is the default path that is displayed in the Open window. e. Clear the displayed code in the SQL Worksheet area. No formal solutions. Familiarize yourself with the labs folder on the D:\ drive: a.
Oracle Database 11g: PL/SQL Fundamentals A .
END.” Execute and save this script as lab_01_02_soln. Ask your instructor for help in locating the labs folder for this course. b. 1.PUT_LINE(amount). Start SQL Developer. d. END. The block in b does not have the mandatory executable section that begins with the BEGIN keyword.Practice 1: Introduction to PL/SQL The labs folder is the working directory where you save your scripts. Create and execute a simple anonymous block that outputs “Hello World. 2. Enable output in SQL Developer by clicking the Enable DBMS Output button on the DBMS Output tab. The block in c has all the necessary parts but the executable section does not have any statements. DECLARE amount INTEGER(10). c. Which of the following PL/SQL blocks execute successfully? a. BEGIN END. DECLARE BEGIN END. a. The instructor will provide the necessary information.
Enable DBMS Output
DBMS Output Tab
Oracle Database 11g: PL/SQL Fundamentals A . The block in a does not execute because the executable section does not have any statements. The solutions for all practices are in the soln folder. b.10
. DECLARE amount INTEGER(10). BEGIN DBMS_OUTPUT.sql.
d. You should see the following output in the Script Output tab:
BEGIN DBMS_OUTPUT. Enter lab_01_02_soln.
Oracle Database 11g: PL/SQL Fundamentals A .11
.c. e.sql as the file name and click the Save button. Enter the following code in the workspace. Click the Run Script button. END. Click the Save button. Select the folder in which you want to save the file.PUT_LINE(' Hello World ').
The declaration in c is invalid because string literals should be enclosed within single quotation marks. The block will execute successfully and print “fernandez”
4. BEGIN DBMS_OUTPUT.
Oracle Database 11g: PL/SQL Fundamentals A .
The block executes successfully and prints “fernandez”. Examine the following anonymous block and choose the appropriate statement. DATE:= CURRENT_DATE+1. b. h. which you created in exercise 2 of practice 1 by following these instructions: Select File > Open. load the lab_01_02_soln. d.sql file. Browse to select the lab_01_02_soln. c.12
DECLARE v_fname VARCHAR2(20). v_lname VARCHAR2(15) DEFAULT 'fernandez'.sql script. c. d. END. Click the Open button. number_of_copies PRINTER_NAME deliver_to by_when PLS_INTEGER. The block executes successfully and prints “null fernandez”.PUT_LINE(v_fname ||' ' ||v_lname). 3. In SQL Plus. The block produces an error because the fname variable is used without initializing. a. b. Create an anonymous block. VARCHAR2(10):=Johnson. The block produces an error because you cannot use the DEFAULT keyword to initialize a variable of type VARCHAR2. Identify valid and invalid variable declaration and initialization: a. c. e. The block produces an error because the v_fname variable is not declared. d.sql file. Valid Invalid Invalid Valid
The declaration in b is invalid because constant variables must be initialized during declaration. today last_name today’s_date
Isleap$year #number NUMBER# number1to7
Valid Valid Invalid – character “’” not allowed Invalid – Too long Valid Invalid – Cannot start with “#” Valid Valid
a. f.Practice 2: Declaring PL/SQL Variables 1. b. Your workspace will now have the code in the . e. Identify valid and invalid identifiers: a. g. constant VARCHAR2(10).
Initialize today with SYSDATE. initialize the tomorrow variable with an expression. Use the %TYPE attribute to declare this variable.PUT_LINE('TODAY IS : '|| v_today). DBMS_OUTPUT.a. which calculates tomorrow’s date (add one to the value in today). In the executable section. Variable tomorrow of type today. Print the value of today and tomorrow after printing “Hello World.
b. Follow the instructions in step 2 f) of practice 1 to save the file.13
BEGIN v_tomorrow:=v_today +1. In the declarative section.
2. DBMS_OUTPUT. Variable today of type DATE. declare the following variables: 1.
c. DBMS_OUTPUT.PUT_LINE('TOMORROW IS : ' || v_tomorrow).
DECLARE v_today DATE:=SYSDATE. END.PUT_LINE(' Hello World ').sql. Sample output is as follows (the values of today and tomorrow will be different to reflect your current today’s and tomorrow’s date):
anonymous block completed Hello World TODAY IS : 09-MAY-07 TOMORROW IS : 10-MAY-07
Oracle Database 11g: PL/SQL Fundamentals A . Add declarative section to this PL/SQL block. Execute and save your script as lab_02_04_soln.
.sql script.sql. In the executable section of the PL/SQL block.
:b_basic_percent:=45. :b_pf_percent:=12. Edit the lab_02_04_soln.
Create bind variables basic_percent and pf_percent of type NUMBER. assign the values 45 and 12 to basic_percent and pf_percent.
/ PRINT b_basic_percent PRINT b_pf_percent
d. Execute and save your script as lab_02_05_soln. Sample output is as follows:
Oracle Database 11g: PL/SQL Fundamentals A .
VARIABLE b_basic_percent NUMBER VARIABLE b_pf_percent NUMBER
b. Terminate the PL/SQL block with “/” and display the value of the bind variables by using the PRINT command.5.
a. Add code to create two bind variables. respectively.
BEGIN DECLARE v_weight NUMBER(3) := 1. The data type is VARCHAR2. v_new_locn := 'Western ' || v_new_locn. v_message VARCHAR2(255) := 'Product 10012'. /
1. v_weight := v_weight + 1. v_message VARCHAR2(255) := 'Product 11001'. v_new_locn := 'Western ' || v_new_locn. BEGIN v_weight := v_weight + 1. The value of v_weight at position 2 is: 601 The data type is NUMBER. The value of v_weight at position 1 is: 2 The data type is NUMBER. b. v_message := v_message || ' is in stock'. The value of v_message at position 2 is: Product 10012 is in stock.15
.Practice 3: Writing Executable Statements
DECLARE v_weight NUMBER(3) := 600. e.
END. v_new_locn VARCHAR2(50) := 'Europe'. Evaluate the preceding PL/SQL block and determine the data type and value of each of the following variables according to the rules of scoping. a. The value of v_new_locn at position 1 is: Western Europe The data type is VARCHAR2. d.
Oracle Database 11g: PL/SQL Fundamentals A . c. The value of v_new_locn at position 2 is: Illegal because v_new_locn is not visible outside the subblock.
… END.VARIABLE b_pf_percent NUMBER
b. 3. v_credit_rating VARCHAR2(50) := 'EXCELLENT'. In the preceding PL/SQL block. The value of v_name in the nested block is: Unisports The data type is VARCHAR2. The value of v_name in the main block is: name is not visible in the main block and you would see an error. v_name VARCHAR2(25) := 'Unisports'. f.” If you have opened a new session. BEGIN v_credit_rating :='GOOD'. then execute lab_02_05_soln.16
. Use single-line comment syntax to comment the lines that create the bind variables. … END.
-. c.VARIABLE b_basic_percent NUMBER -. Use the same session that you used to execute the practices in the lesson titled “Declaring PL/SQL Variables. The value of v_customer in the main block is: Womansport The data type is VARCHAR2. a. Edit lab_02_05_soln.
2. Use multiple-line comments in the executable section to comment the lines that assign values to the bind variables.sql.
Oracle Database 11g: PL/SQL Fundamentals A . BEGIN DECLARE v_customer NUMBER(7) := 201. The value of v_credit_rating in the main block is: GOOD The data type is VARCHAR2. e. d.sql.F b. a. The value of v_credit_rating in the nested block is: GOOD The data type is VARCHAR2. The value of v_customer in the nested block is: 201 The data type is NUMBER. determine the values and data types for each of the following cases.DECLARE v_customer VARCHAR2(50) := 'Womansport'.
DECLARE v_basic_percent NUMBER:=45.PUT_LINE('YOUR CONTRIBUTION TOWARDS PF: '||v_emp_sal*v_basic_percent/100*v_pf_percent/100). v_fname VARCHAR2(15). Try to use only one expression to calculate the PF.sql. DBMS_OUTPUT. and the basic salary is 45% of the salary. Include the following SQL statement in the executable section:
SELECT first_name. Calculate the contribution of the employee towards provident fund (PF). v_emp_sal NUMBER(10).
f. and emp_sal of type NUMBER and size 10.*/
c. salary INTO v_fname.
DBMS_OUTPUT. :b_pf_percent:=12. Print the employee’s salary and his contribution toward PF. Sample output is as follows:
Oracle Database 11g: PL/SQL Fundamentals A . Execute and save your script as lab_03_03_soln. You can comment the lines that display the dates and print the bind variables. Use the local variables for the calculation.PUT_LINE(' Hello '|| v_fname). v_emp_sal FROM employees WHERE employee_id=110.17
e. PF is 12% of the basic salary./*:b_basic_percent:=45. END. v_pf_percent NUMBER:=12.PUT_LINE('YOUR SALARY IS : '||v_emp_sal). if you want to.
DBMS_OUTPUT. Change the line that prints “Hello World” to print “Hello” and the first name. Declare variables: fname of type VARCHAR2 and size 15.
Create a PL/SQL block that selects the maximum department ID in the departments table and stores it in the v_max_deptno variable. Load the lab_04_01_soln. END.sql.sql script. a. Display v_max_deptno and end the executable block.
DBMS_OUTPUT.department_name%TYPE:= 'Education'.Practice 4: Interacting with the Oracle Server 1. Declare two variables: v_dept_name of type departments. a.
BEGIN SELECT MAX(department_id)
b. Execute and save your script as lab_04_01_soln.
b. Declare a variable v_max_deptno of type NUMBER in the declarative section.
d.PUT_LINE('The maximum department_id is : ' || v_max_deptno). Start the executable section with the BEGIN keyword and include a SELECT statement to retrieve the maximum department_id from the departments table.18
Oracle Database 11g: PL/SQL Fundamentals A .
v_dept_id := 10 + v_max_deptno. Sample output is as follows:
2. Modify the PL/SQL block you created in step 1 to insert a new department into the departments table. v_dept_id of type NUMBER. You have already retrieved the current maximum department number from the departments table. Assign 'Education' to v_dept_name in the declarative section.
DECLARE v_max_deptno NUMBER. v_dept_id NUMBER.
c.department_name. Display the maximum department ID. Add 10 to it and assign the result to dept_id.
Use the SQL attribute SQL%ROWCOUNT to display the number of rows that are affected. and use NULL for location_id.19
f. you set location_id to NULL.
… / SELECT * FROM
department_id= 280. Start the executable block with the BEGIN keyword.
DELETE FROM departments WHERE department_id=280.PUT_LINE (' SQL%ROWCOUNT gives ' || SQL%ROWCOUNT). Oracle Database 11g: PL/SQL Fundamentals A . Sample output is as follows:
d. Include an INSERT statement to insert data into the department_name. Execute a SELECT statement to check whether the new department is inserted. a. You can terminate the PL/SQL block with “/” and include the SELECT statement in your script.
DBMS_OUTPUT. Include the UPDATE statement to set the location_id to 3000 for the new department (dept_id =280). Create a PL/SQL block that updates the location_id to 3000 for the new department. and location_id columns of the departments table. Use values in dept_name and dept_id for department_name and department_id.
… INSERT INTO departments (department_id. In step 2.v_dept_name. Execute and save your script as lab_04_02_soln. …
e. location_id) VALUES (v_dept_id.c.
BEGIN UPDATE departments SET location_id=3000 WHERE department_id=280. delete the department that you have added to the departments table and execute the lab_04_02_soln. NULL). Use the local variable v_dept_id to update the row.sql. department_name. If you have started a new session. respectively. department_id.sql script.
End the executable block with the END keyword.20
. Include a DELETE statement to delete the department that you added. Terminate the PL/SQL block with “/” and include a SELECT statement to display the department that you updated.
DELETE FROM departments WHERE department_id=280.c.--------------280 Education 1 rows selected 1 rows deleted
MANAGER_ID LOCATION_ID ----------. Execute and save your script as lab_04_03_soln.
Oracle Database 11g: PL/SQL Fundamentals A . Sample output is as follows:
anonymous block completed DEPARTMENT_ID DEPARTMENT_NAME -------------. / SELECT * FROM departments WHERE department_id=280.
.employee_id and initialize it to 176.
BEGIN FOR i in 1. Save your script as lab_05_02_soln. Execute the command in the lab_05_01. Execute a SELECT statement to verify that your PL/SQL block worked.
You should see the following output:
2. Write a PL/SQL block to insert numbers into the messages table. END LOOP. declare a variable v_empno of type emp. b. a.Practice 5: Writing Control Structures 1. of VARCHAR2 data type and size 50. Create a variable sal of type
Oracle Database 11g: PL/SQL Fundamentals A .sql file to create the messages table. Create a PL/SQL block that inserts an asterisk in the stars column for every $1000 of the employee’s salary. Declare a variable v_asterisk of type emp.10 LOOP IF i = 6 or i = 8 THEN null. END IF. Execute the lab_05_02. ELSE INSERT INTO messages(results) VALUES (i). This script creates an emp table that is a replica of the employees table. It alters the emp table to add a new column. COMMIT. /
SELECT * FROM messages.sql. In the declarative section of the block. a.sql script. Insert the numbers 1 through 10. excluding 6 and 8.stars and initialize it to NULL. END. Commit before the end of the block.21
salary%TYPE.000 of the salary.000. emp. The output is as follows:
Oracle Database 11g: PL/SQL Fundamentals A .salary.employee_id%TYPE := 176. the string of asterisks should contain eight asterisks.
UPDATE emp SET stars = v_asterisk WHERE employee_id = v_empno. write logic to append an asterisk (*) to the string for every $1. COMMIT.
SELECT NVL(ROUND(salary/1000). FOR i IN 1. stars FROM emp WHERE employee_id =176.
d.500. if the employee earns $8. END LOOP. Display the row from the emp table to verify whether your PL/SQL block has executed successfully.
c. For example. 0) INTO v_sal FROM emp WHERE employee_id = v_empno.. Update the stars column for the employee with the string of asterisks.v_sal LOOP v_asterisk := v_asterisk ||'*'.
SELECT employee_id.sql.emp. In the executable section. emp.22
. the string of asterisks should contain 13 asterisks.stars%TYPE := NULL.
DECLARE v_empno v_asterisk v_sal
emp. Execute and save your script as lab_05_02_soln. Commit before the end of the block.salary. If the employee earns $12.
Assign CA to v_countryid.
d. Declare a variable v_countryid. a. Write a PL/SQL block to print information about a given country. b. DBMS_OUTPUT.
Oracle Database 11g: PL/SQL Fundamentals A . In the declarative section. Declare a PL/SQL record based on the structure of the countries table. Sample output is as follows:
BEGIN SELECT * INTO v_country_record FROM countries WHERE country_id = UPPER(v_countryid). UK.country_name || ' Region: ' || v_country_record.
c. You may want to execute and test the PL/SQL block for the countries with the IDs DE. get all the information from the countries table by using v_countryid. END.
e. use the %ROWTYPE attribute and declare the v_country_record variable of type countries.
SET VERIFY OFF DECLARE v_countryid varchar2(20):= 'CA'.country_id || ' Country Name: ' || v_country_record. Display selected information about the country. In the executable section. and US.region_id).23
.PUT_LINE ('Country Id: ' || v_country_record.
v_country_record countries%ROWTYPE.Practice 6: Working with Composite Data Types 1.
. retrieve the name of 10 departments and store the names in the INDEX BY table. Declare an INDEX BY table dept_table_type of type departments. incorporating an INDEX BY table. Using a loop. Declare two variables: loop_count and deptno of type NUMBER. a.
c.department_name%TYPE INDEX BY PLS_INTEGER.2.department_name. Increase v_deptno by 10 for every iteration of the loop. Start with department_id 10.
b.sql. my_dept_table dept_table_type. Create a PL/SQL block to retrieve the name of some departments from the departments table and print each department name on the screen. Save the script as lab_06_02_soln. Declare a variable my_dept_table of type dept_table_type to temporarily store the name of the departments.
DECLARE TYPE dept_table_type is table of departments. NUMBER (4):=0. Assign 10 to loop_count and 0 to deptno.
loop_count deptno NUMBER (2):=10. DEPARTMENT_ID 10 20 30 40 50 60 70 80 90 100 DEPARTMENT_NAME Administration Marketing Purchasing Human Resources Shipping IT Public Relations Sales Executive Finance
Oracle Database 11g: PL/SQL Fundamentals A . The following table shows the department_id for which you should retrieve the department_name and store in the INDEX BY table.
Use an INDEX BY table of records. END LOOP. and location of all the departments. name.sql.
Oracle Database 11g: PL/SQL Fundamentals A .sql script. Execute and save your script as lab_06_02_soln.
e.. a. retrieve the department names from the INDEX BY table and display them.
FOR i IN 1. Modify the block that you created in exercise 2 to retrieve all information about each department from the departments table and display the information. Using another loop. Use the %ROWTYPE attribute. The output is as follows:
3.. b.BEGIN FOR i IN 1.
d. END LOOP. to temporarily store the number.PUT_LINE (my_dept_table(i)). Modify the declaration of the INDEX BY table. SELECT department_name INTO my_dept_table(i) FROM departments WHERE department_id = v_deptno.department_name. You have declared the INDEX BY table to be of type departments. END.f_loop_count LOOP v_deptno:=v_deptno+10. Load the lab_06_02_soln.25
.f_loop_count LOOP DBMS_OUTPUT.
END LOOP.department_name || ' Manager Id: '|| my_dept_table(i). my_dept_table dept_table_type.
BEGIN FOR i IN 1. Using another loop. retrieve the department information from the INDEX BY table and display the information.f_loop_count LOOP v_deptno := v_deptno + 10.PUT_LINE ('Department Number: ' || my_dept_table(i).DECLARE TYPE dept_table_type is table of departments%ROWTYPE INDEX BY PLS_INTEGER. Sample output is as follows:
FOR i IN 1.. SELECT * INTO my_dept_table(i) FROM departments WHERE department_id = v_deptno. v_deptno NUMBER (4):=0.department_id || ' Department Name: ' || my_dept_table(i).
d.f_loop_count LOOP DBMS_OUTPUT. Modify the SELECT statement to retrieve all department information currently in the departments table and store it in the INDEX BY table. END.manager_id || ' Location Id: ' || my_dept_table(i).location_id).
Oracle Database 11g: PL/SQL Fundamentals A . f_loop_count NUMBER (2):=10.
c. END LOOP.26
last_name || ' Due for a raise'). END IF.000 and if the manager ID is either 101 or 124. ELSE DBMS_OUTPUT. END LOOP.
CURSOR c_emp_cursor IS SELECT last_name.manager_id FROM employees WHERE department_id = v_deptno.
NUMBER := 10. If the salary of the employee is less than 5. display the message “<<last_name>> Not due for a raise. salary.
d. and manager_id of the employees working in the department specified in v_deptno.
b. Run the lab_07_01. Declare a cursor.manager_id=124) THEN DBMS_OUTPUT.27
. display the message “<<last_name>> Due for a raise. END. In the declarative section. Create a PL/SQL block that does the following: a.
c. that retrieves the last_name.last_name || ' Not Due for a raise').PUT_LINE (emp_record.PUT_LINE (emp_record. salary.Practice 7: Using Explicit Cursors 1.salary < 5000 AND (emp_record. In the executable section.sql script to create the top_salaries table. c_emp_cursor. use the cursor FOR loop to operate on the data retrieved.manager_id=101 OR emp_record. Test the PL/SQL block for the following cases:
Oracle Database 11g: PL/SQL Fundamentals A . declare a variable v_deptno of type NUMBER and assign a value that holds the department ID.”
BEGIN FOR emp_record IN c_emp_cursor LOOP IF emp_record. 2.” Otherwise.
Oracle Database 11g: PL/SQL Fundamentals A . Livingston Not Due for a raise Johnson Not Due for a raise
3. use a cursor to retrieve the department number and the department name from the departments table for a department whose department_id is less than 100. OConnell Due for a raise Grant Due for a raise Russell Not Due for a raise Partners Not Due for a raise Errazuriz Not Due for a raise Cambrault Not Due for a raise . and salary of those employees whose employee_id is less than 120 and who work in that department. which declares and uses cursors with parameters. hire date. . Write a PL/SQL block.Department ID
10 20 50
Whalen Due for a raise Hartstein Not Due for a raise Fay Not Due for a raise Weiss Not Due for a raise Fripp Not Due for a raise Kaufling Not Due for a raise Vollman Not Due for a raise.28
. job. In a loop. . . Pass the department number to another cursor as a parameter to retrieve from the employees table the details of employee last name. . . .
d. open c_emp_cursor by passing the current department number as a parameter.last_name%TYPE. declare a cursor c_dept_cursor to retrieve department_id. Use the %TYPE attribute while declaring variables. Order by department_id.job_id. Display the department number and department name. job_id.
v_current_deptno departments. In the declarative section.
CURSOR c_emp_cursor(v_deptno NUMBER) IS SELECT last_name.
DECLARE CURSOR c_dept_cursor IS SELECT department_id.salary%TYPE.department_name FROM departments WHERE department_id < 100 ORDER BY department_id. use a simple loop.hire_date.hire_date%TYPE. v_sal employees.29
. DBMS_OUTPUT. and salary of those employees with employee_id of less than 120 and who work in that department. hire_date. Start another loop and fetch the values of emp_cursor into variables and print all the details retrieved from the employees table.v_current_dname.department_name%TYPE.PUT_LINE ('Department Number : ' || v_current_deptno || ' Department Name : ' || v_current_dname). v_current_dname departments. LOOP FETCH c_dept_cursor INTO v_current_deptno. v_job employees. and fetch values into the variables declared.department_id%TYPE.
b.job_id%TYPE. v_ename employees.
Oracle Database 11g: PL/SQL Fundamentals A .
BEGIN OPEN c_dept_cursor.salary FROM employees WHERE department_id = v_deptno AND employee_id < 120. v_hiredate employees.
c. Declare variables to hold the values retrieved from each cursor. Declare another cursor c_emp_cursor that takes the department number as parameter and retrieves last_name.a. and department_name for those departments with department_id less than 100. Open c_dept_cursor. For each department. EXIT WHEN c_dept_cursor%NOTFOUND.
PUT_LINE (v_ename || ' ' || v_job || ' ' || v_hiredate || ' ' || v_sal).
END LOOP. Close all the loops and cursors. DBMS_OUTPUT.v_hiredate.Note: You may want to print a line after you have displayed the details of each department.v_sal. check whether a cursor is already open before opening the cursor. Execute the script. CLOSE c_dept_cursor.v_job. END LOOP. OPEN c_emp_cursor (v_current_deptno). Use appropriate attributes for the exit condition.PUT_LINE('---------------------------------------------------------------------------------------'). END IF.
Oracle Database 11g: PL/SQL Fundamentals A .
f. and end the executable section. END. LOOP FETCH c_emp_cursor INTO v_ename.
IF c_emp_cursor%ISOPEN THEN CLOSE c_emp_cursor. CLOSE c_emp_cursor. Also. DBMS_OUTPUT. EXIT WHEN c_emp_cursor%NOTFOUND.30
Execute the lab_07_01. enter 5.The sample output is as follows:
If you have time. b. Remember that the salaries should not be duplicated. Declare a cursor.salary. a. for storing the salaries of the employees. declare a variable v_num of type NUMBER that holds a number n representing the number of top n earners from the employees table. c_emp_cursor. that retrieves the salaries of employees in descending order. In the declarative section.
Oracle Database 11g: PL/SQL Fundamentals A . top_salaries. to view the top five salaries. complete the following practice: 4.31
. Create a PL/SQL block that determines the top n salaries of the employees.sql script to create a new table. For example. Declare another variable sal of type employees.
Note: Make sure you add an exit condition to avoid having an infinite loop.
BEGIN OPEN c_emp_cursor. Also. END.
c. employees. END LOOP. WHILE c_emp_cursor%ROWCOUNT <= v_num AND c_emp_cursor%FOUND LOOP INSERT INTO top_salaries (salary) VALUES (v_sal).
Oracle Database 11g: PL/SQL Fundamentals A . FETCH c_emp_cursor INTO v_sal. In the executable section. c_emp_cursor IS salary employees salary DESC. try and use %ROWCOUNT and %FOUND attributes for the exit condition.salary%TYPE.DECLARE v_num v_sal CURSOR SELECT FROM ORDER BY
NUMBER(3) := 5.32
. You can use a simple loop to operate on the data. CLOSE c_emp_cursor. open the loop and fetch top n salaries and insert them into the top_salaries table. FETCH c_emp_cursor INTO v_sal.
Oracle Database 11g: PL/SQL Fundamentals A .33
. Test a variety of special cases.d.
e. such as v_num = 0 or where v_num is greater than the number of employees in the employees table.
/ SELECT * FROM top_salaries. display the rows with a SELECT statement. The output shown represents the five highest salaries in the employees table. Empty the top_salaries table after each test. After inserting into the top_salaries table.
handle the exception with an appropriate exception handler and insert into the messages table the message “No employee with a salary of <salary>.salary.”
WHEN too_many_rows THEN INSERT INTO messages (results) VALUES ('More than one employee with a salary of '|| TO_CHAR(v_emp_sal)).
BEGIN SELECT last_name INTO v_ename FROM employees WHERE salary = v_emp_sal.' || v_emp_sal). INSERT INTO messages (results) VALUES (v_ename || ' . Delete all the records in the messages table. Note: Do not use explicit cursors.Practice 8: Handling Exceptions 1. Initialize the latter to 6000. In the declarative section.
DECLARE v_ename employees. Write a PL/SQL block to select the name of the employee with a given salary value. SET VERIFY OFF
b. declare two variables: v_ename of type employees. In the executable section. handle the exception with an appropriate exception handler and insert into the messages table the message “More than one employee with a salary of <salary>. If the salary entered returns only one row.
DELETE FROM MESSAGES. v_emp_sal employees. The purpose of this practice is to show the usage of predefined exceptions.
. If the salary entered does not return any rows. Oracle Database 11g: PL/SQL Fundamentals A . insert into the messages table the employee’s name and the salary amount.salary%TYPE := 6000.”
EXCEPTION WHEN no_data_found THEN INSERT INTO messages (results) VALUES ('No employee with a salary of '|| TO_CHAR(v_emp_sal)). If the salary entered returns more than one row.last_name and v_emp_sal of type employees. a. retrieve the last names of employees whose salaries are equal to the value in v_emp_sal.last_name%TYPE.
Include an exception section to handle the e_childrecord_exists exception and display the appropriate message.. Use the Oracle server error ORA-02292 (integrity constraint violated – child record found).PUT_LINE(' Cannot delete this department..
Oracle Database 11g: PL/SQL Fundamentals A .
DECLARE e_childrecord_exists EXCEPTION... a. Handle any other exception with an appropriate exception handler and insert into the messages table the message “Some other error occurred. In the executable section. Associate the declared exception with the standard Oracle server error –02292.. delete from departments where department_id=40.35
. The purpose of this practice is to show how to declare exceptions with a standard Oracle Server error.PUT_LINE(' Deleting department 40.
2.. In the declarative section.
c. display “Deleting department 40. declare an exception e_childrecord_exists.. PRAGMA EXCEPTION_INIT(e_childrecord_exists. Display the rows from the messages table to check whether the PL/SQL block has executed successfully. END. Sample output is as follows:
EXCEPTION WHEN e_childrecord_exists THEN DBMS_OUTPUT.” Include a DELETE statement to delete the department with the department_id 40. There are employees in this department (child records exist.').
b.. -02292). END.
WHEN others THEN INSERT INTO messages (results) VALUES ('Some other error occurred.f..
g..').) '). Sample output is as follows:
/ SELECT * FROM messages.
Oracle Database 11g: PL/SQL Fundamentals A .36
Click the Clear button to clear the workspace. a.
Oracle Database 11g: PL/SQL Fundamentals A .sql script that you created for exercise 4 of practice 2. d.PUT_LINE(' Hello '|| p_name). Drop the greet procedure by issuing the following command:
DROP PROCEDURE greet
b. c. Print Hello <name> instead of printing Hello World.
d. Create and execute an anonymous block to invoke the greet procedure. Save your script as lab_09_02_soln.
CREATE PROCEDURE greet IS today DATE:=SYSDATE. Enable DBMS Output if needed using the DBMS Output tab in SQL Developer.Practice 9: Creating Stored Procedures and Functions 1.
BEGIN tomorrow:=today +1. e. Load the lab_09_01_soln. DBMS_OUTPUT. Sample output is as follows:
BEGIN greet.. Modify the procedure to accept an argument of type VARCHAR2.
CREATE PROCEDURE greet(p_name VARCHAR2) IS today DATE:=SYSDATE. tomorrow today%TYPE.
2. and then execute the script to create the procedure. Load the lab_02_04_soln. Save this script as lab_09_01_soln.sql. Call the argument p_name.
c.sql. END. tomorrow today%TYPE. Modify the script to convert the anonymous block to a procedure called greet.sql script. a.
Oracle Database 11g: PL/SQL Fundamentals A . Create and execute an anonymous block to invoke the greet procedure with a parameter. END. Execute the script to create the procedure. Sample output is as follows: