1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Oracle PL/SQL by Example- P6 pptx

50 517 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 50
Dung lượng 281,6 KB

Nội dung

LAB 10.3 SQLCODE and SQLERRM LAB OBJECTIVE After completing this lab, you will be able to . Use SQLCODE and SQLERRM In Chapter 8, “Error Handling and Built-in Exceptions,” you learned about the Oracle exception OTHERS. Recall that all Oracle errors can be trapped with the help of the OTHERS exception handler, as illustrated in the following example: FOR EXAMPLE DECLARE v_zip VARCHAR2(5) := '&sv_zip'; v_city VARCHAR2(15); v_state CHAR(2); BEGIN SELECT city, state INTO v_city, v_state FROM zipcode WHERE zip = v_zip; DBMS_OUTPUT.PUT_LINE (v_city||', '||v_state); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ('An error has occurred'); END; When 07458 is entered for the value of the zip code, this example produces the following output: Enter value for sv_zip: 07458 old 2: v_zip VARCHAR2(5) := '&sv_zip'; new 2: v_zip VARCHAR2(5) := '07458'; An error has occurred PL/SQL procedure successfully completed. LAB 10.3 222 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. This output informs you that an error occurred at runtime. However, you do not know what the error is and what caused it. Maybe no record in the ZIPCODE table corresponds to the value provided at runtime, or maybe a datatype mismatch was caused by the SELECT INTO state- ment. As you can see, even though this is a simple example, a number of possible runtime errors can occur. Of course, you cannot always know all the possible runtime errors that may occur when a program is running. Therefore, it is a good practice to have the OTHERS exception handler in your script. To improve the error-handling interface of your program, Oracle gives you two built-in functions, SQLCODE and SQLERRM, used with the OTHERS exception handler. The SQLCODE function returns the Oracle error number, and the SQLERRM function returns the error message. The maximum length of a message returned by the SQLERRM function is 512 bytes. Consider what happens if you modify the preceding by adding the SQLCODE and SQLERRM functions as follows (all changes are shown in bold): FOR EXAMPLE DECLARE v_zip VARCHAR2(5) := '&sv_zip'; v_city VARCHAR2(15); v_state CHAR(2); v_err_code NUMBER; v_err_msg VARCHAR2(200); BEGIN SELECT city, state INTO v_city, v_state FROM zipcode WHERE zip = v_zip; DBMS_OUTPUT.PUT_LINE (v_city||', '||v_state); EXCEPTION WHEN OTHERS THEN v_err_code := SQLCODE; v_err_msg := SUBSTR(SQLERRM, 1, 200); DBMS_OUTPUT.PUT_LINE ('Error code: '||v_err_code); DBMS_OUTPUT.PUT_LINE ('Error message: '||v_err_msg); END; When executed, this example produces the following output: Enter value for sv_zip: 07458 old 2: v_zip VARCHAR2(5) := '&sv_zip'; new 2: v_zip VARCHAR2(5) := '07458'; Error code: -6502 Error message: ORA-06502: PL/SQL: numeric or value error: LAB 10.3 SQLCODE and SQLERRM 223 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. character string buffer too small PL/SQL procedure successfully completed. In this example, you declare two variables: v_err_code and v_err_msg. Then, in the excep- tion-handling section of the block, you assign SQLCODE to the variable v_err_code and SQLERRM to the variable v_err_msg. Next, you use the DBMS_OUTPUT.PUT_LINE state- ments to display the error number and the error message on the screen. Notice that this output is more informative than the output produced by the previous version of the example, because it displays the error message. As soon as you know which runtime error has occurred in your program, you can take steps to prevent this error’s recurrence. Generally, the SQLCODE function returns a negative number for an error number. However, there are a few exceptions: . When SQLCODE is referenced outside the exception section, it returns 0 for the error code. The value of 0 means successful completion. . When SQLCODE is used with the user-defined exception, it returns +1 for the error code. . SQLCODE returns a value of 100 when the NO_DATA_FOUND exception is raised. The SQLERRM function accepts an error number as a parameter, and it returns an error message corresponding to the error number. Usually, it works with the value returned by SQLCODE. However, you can provide the error number yourself if such a need arises. Consider the follow- ing example: FOR EXAMPLE BEGIN DBMS_OUTPUT.PUT_LINE ('Error code: '||SQLCODE); DBMS_OUTPUT.PUT_LINE ('Error message1: '||SQLERRM(SQLCODE)); DBMS_OUTPUT.PUT_LINE ('Error message2: '||SQLERRM(100)); DBMS_OUTPUT.PUT_LINE ('Error message3: '||SQLERRM(200)); DBMS_OUTPUT.PUT_LINE ('Error message4: '||SQLERRM(-20000)); END; In this example, SQLCODE and SQLERRM are used in the executable section of the PL/SQL block. The SQLERRM function accepts the value of the SQLCODE in the second DBMS_ OUTPUT.PUT_LINE statement. In the following DBMS_OUPUT.PUT_LINE statements, SQLERRM accepts the values of 100, 200, and –20,000 respectively. When executed, this example produces the following output: Error code: 0 Error message1: ORA-0000: normal, successful completion Error message2: ORA-01403: no data found Error message3: -200: non-ORACLE exception Error message4: ORA-20000: PL/SQL procedure successfully completed. LAB 10.3 224 SQLCODE and SQLERRM Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. ▼ The first DBMS_OUTPUT.PUT_LINE statement displays the value of the SQLCODE function. Because no exception is raised, it returns 0. Next, SQLERRM accepts as a parameter the value returned by the SQLCODE function. This function returns the message ORA-0000: normal, . Next, SQLERRM accepts 100 as its parameter and returns ORA-01403: no data found. Notice that when SQLERRM accepts 200 as its parameter, it cannot find an Oracle exception that corresponds to the error number 200. Finally, when SQLERRM accepts –20,000 as its parameter, no error message is returned. Remember that –20,000 is an error number that can be associated with a named user-defined exception. LAB 10.3 EXERCISES This section provides exercises and suggested answers, with discussion related to how those answers resulted. The most important thing to realize is whether your answer works.You should figure out the implications of the answers and what the effects are of any different answers you may come up with. 10.3.1 Use SQLCODE and SQLERRM In this exercise, you add a new record to the ZIPCODE table.The original PL/SQL script does not contain any exception handlers.You are asked to add an exception-handling section to this script. Create the following PL/SQL script: ch10_3a.sql, version 1.0 SET SERVEROUTPUT ON BEGIN INSERT INTO ZIPCODE (zip, city, state, created_by, created_date, modified_by, modified_date) VALUES ('10027', 'NEW YORK', 'NY', USER, SYSDATE, USER, SYSDATE); COMMIT; END; Execute the script, and answer the following questions: A) What output is printed on the screen? ANSWER: The output should look like the following: BEGIN * ERROR at line 1: ORA-00001: unique constraint (STUDENT.ZIP_PK) violated ORA-06512: at line 2 The INSERT statement INSERT INTO ZIPCODE (zip, city, state, created_by, created_date, modified_by, modified_date) VALUES ('10027', 'NEW YORK', 'NY', USER, SYSDATE, USER, SYSDATE); causes an error because a record with zip code 10027 already exists in the ZIPCODE table. Column ZIP of the ZIPCODE table has a primary key constraint defined on it.Therefore, when you try to insert another record when the value of ZIP already exists in the ZIPCODE table, the error message ORA-00001: unique constraint is generated. LAB 10.3 Lab 10.3 Exercises 225 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. B) Modify the script so that it completes successfully and so that the error number and message are displayed on the screen. ANSWER: The script should resemble the script shown. All changes are shown in bold. ch10_3b.sql, version 2.0 SET SERVEROUTPUT ON BEGIN INSERT INTO ZIPCODE (zip, city, state, created_by, created_date, modified_by, modified_date) VALUES ('10027', 'NEW YORK', 'NY', USER, SYSDATE, USER, SYSDATE); COMMIT; EXCEPTION WHEN OTHERS THEN DECLARE v_err_code NUMBER := SQLCODE; v_err_msg VARCHAR2(100) := SUBSTR(SQLERRM, 1, 100); BEGIN DBMS_OUTPUT.PUT_LINE ('Error code: '||v_err_code); DBMS_OUTPUT.PUT_LINE ('Error message: '||v_err_msg); END; END; In this script, you add an exception-handling section with the OTHERS exception handler. Notice that two variables, v_err_code and v_err_msg, are declared in the exception-handling section of the block, adding an inner PL/SQL block. C) Run the new version of the script and explain the output it produces. ANSWER: The output should look similar to the following: Error code: -1 Error message: ORA-00001: unique constraint (STUDENT.ZIP_PK) violated PL/SQL procedure successfully completed. Because the INSERT statement causes an error, control is transferred to the OTHERS exception handler. The SQLCODE function returns –1, and the SQLERRM function returns the text of the error corresponding to the error code –1. After the exception-handling section completes its execution, control is passed to the host environment. LAB 10.3 226 Lab 10.3 Exercises Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. ▼ TRY IT YOURSELF In this chapter you’ve learned about advanced concepts of exception-handling techniques. Here are some projects that will help you test the depth of your understanding: 1) Modify the script you created in project 1 of the “Try It Yourself”section in Chapter 9. Raise a user- defined exception with the RAISE_APPLICATION_ERROR statement. Otherwise, display how many students are in a section. Make sure your program can process all sections. 2) Create the following script: Try to add a record to the INSTRUCTOR table without providing values for the columns MODIFIED_BY and MODIFIED_DATE. Define an exception and associate it with the Oracle error number so that the error generated by the INSERT statement is handled. 3) Modify the script you just created. Instead of declaring a user-defined exception, add the OTHERS exception handler to the exception-handling section of the block. Then display the error number and the error message on the screen. The projects in this section are meant to have you use all the skills you have acquired throughout this chapter. The answers to these projects can be found in Appendix D and on this book’s companion Web site.Visit the Web site periodically to share and discuss your answers. Try it Yourself 227 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. This page intentionally left blank Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. CHAPTER 11 Introduction to Cursors CHAPTER OBJECTIVES In this chapter, you will learn about . Cursor manipulation . Using cursor FOR loops and nested cursors Cursors are memory areas where Oracle executes SQL statements. In database programming cursors are internal data structures that allow processing of SQL query results. For example, you use a cursor to operate on all the rows of the STUDENT table for students who are taking a particular course (having associ- ated entries in the ENROLLMENT table). In this chapter, you will learn to declare an explicit cursor that enables a user to process many rows returned by a query and allows the user to write code that processes each row one at a time. Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. LAB 11.1 Cursor Manipulation LAB OBJECTIVES After completing this lab, you will be able to . Make use of record types . Process an explicit cursor . Make use of cursor attributes . Put it all together For Oracle to process a SQL statement, it needs to create an area of memory known as the context area; this will have the information needed to process the statement. This information includes the number of rows processed by the statement and a pointer to the parsed represen- tation of the statement. (Parsing a SQL statement is the process whereby information is trans- ferred to the server, at which point the SQL statement is evaluated as being valid.) In a query, the active set refers to the rows that are returned. A cursor is a handle, or pointer, to the context area. Through the cursor, a PL/SQL program can control the context area and what happens to it as the statement is processed. Cursors have two important features: . Cursors allow you to fetch and process rows returned by a SELECT statement one row at a time. . A cursor is named so that it can be referenced. TYPES OF CURSORS There are two types of cursors: . Oracle automatically declares an implicit cursor every time a SQL statement is executed. The user is unaware of this and cannot control or process the information in an implicit cursor. . The program defines an explicit cursor for any query that returns more than one row of data. This means that the programmer has declared the cursor within the PL/SQL code block. This declaration allows the application to sequentially process each row of data as the cursor returns it. LAB 11.1 230 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. IMPLICIT CURSOR To better understand the capabilities of an explicit cursor, you first need to understand the process of an implicit cursor: . Any given PL/SQL block issues an implicit cursor whenever a SQL statement is executed, as long as an explicit cursor does not exist for that SQL statement. . A cursor is automatically associated with every DML (data manipulation) statement (UPDATE, DELETE, INSERT). . All UPDATE and DELETE statements have cursors that identify the set of rows that will be affected by the operation. . An INSERT statement needs a place to receive the data that is to be inserted into the data- base; the implicit cursor fulfills this need. . The most recently opened cursor is called the SQL cursor. The implicit cursor is used to process INSERT, UPDATE, DELETE, and SELECT INTO state- ments. During the processing of an implicit cursor, Oracle automatically performs the OPEN, FETCH, and CLOSE operations. BY THE WAY An implicit cursor can tell you how many rows were affected by an update. Cursors have attributes such as ROWCOUNT. SQL%ROWCOUNT returns the number of rows updated. It can be used as follows: SET SERVEROUTPUT ON BEGIN UPDATE student SET first_name = 'B' WHERE first_name LIKE 'B%'; DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT); END; Consider the following example of an implicit cursor: FOR EXAMPLE SET SERVEROUTPUT ON; DECLARE v_first_name VARCHAR2(35); v_last_name VARCHAR2(35); BEGIN SELECT first_name, last_name INTO v_first_name, v_last_name FROM student WHERE student_id = 123; DBMS_OUTPUT.PUT_LINE ('Student name: '|| LAB 11.1 Cursor Manipulation 231 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. [...]... generated $0 by instructor Fernand Hanks is by instructor Tom Wojick is by instructor Nina Schorin is by instructor Gary Pertez is by instructor Anita Morris is by instructor Todd Smythe is by instructor Marilyn Frantzen is by instructor Charles Lowry is by instructor Rick Chow is by instructor Irene Willig is In this example, the nested cursor is tied to the current row of the outer cursor by means of... and closing of the cursor> This PL/SQL fragment demonstrates the first step of declaring a cursor A cursor named c_MyCursor is declared as a select statement of all the rows in the zipcode table that have the item state equal to NY BY THE WAY Cursor names follow the same rules of scope and visibility that apply to the PL/SQL identifiers Because the cursor name is a PL/SQL identifier, it must be declared... to fetch a cursor: FETCH cursor_name INTO PL/SQL variables; or FETCH cursor_name INTO PL/SQL record; When the cursor is fetched, the following occurs: 1 The FETCH command is used to retrieve one row at a time from the active set This is generally done inside a loop The values of each row in the active set can then be stored in the corresponding variables or PL/SQL record one at a time, performing operations... closed This tells the PL/SQL engine that the program is finished with the cursor, and the resources associated with it can be freed The syntax for closing the cursor is CLOSE cursor_name; BY THE WAY After a cursor is closed, you no longer can fetch from it Likewise, it is not possible to close an already closed cursor Trying to perform either of these actions would result in an Oracle error D) Continue... list with PL/SQL variables or PL/SQL record components The number of variables must be equal to the number of columns or expressions in the SELECT list The number of components in a record must match the columns or expressions in the SELECT list Cursor Scope The scope of a cursor declared in the main block (or an enclosing block) extends to the subblocks Expressions in a Cursor SELECT List PL/SQL variables,... FOR Loop A) Write a PL/SQL block that reduces the cost of all courses by 5 percent for courses having an enrollment of eight students or more Use a cursor FOR loop that updates the course table ANSWER: Your block should look like this: ch11_7b.sql DECLARE CURSOR c_group_discount IS SELECT DISTINCT s.course_no FROM section s, enrollment e WHERE s.section_id = e.section_id GROUP BY s.course_no, e.section_id,... you learn these four steps, this lab covers them one at a time A) Write the declaration section of a PL/SQL block It should define a cursor named c_student based on the student table, with last_name and first_name concatenated into one item called name It also should omit the created _by and modified _by columns Then declare a record based on this cursor ANSWER: DECLARE CURSOR c_student is SELECT first_name||'... would result in an Oracle error D) Continue with the code you have developed by adding a CLOSE statement to the cursor Is your code complete now? ANSWER: The following line should be added: CLOSE c_student; The code is not complete because there is not a proper way to exit the loop E) Explain what is occurring in the following PL/SQL block What will be the output from this example? FOR EXAMPLE SET SERVEROUTPUT... the body of the loop, you assign each record returned by the cursor to the cursor-based record, vr_student_name Next, you display its contents on the screen When run, the example produces the following output: Student name: Austin V Cadet Student name: Frank M Orent Student name: Yvonne Winnicki Student name: Mike Madej Student name: Paula Valentine PL/SQL procedure successfully completed F) Consider... END LOOP; CLOSE c_student; EXCEPTION WHEN OTHERS THEN IF c_student%ISOPEN THEN CLOSE c_student; END IF; END; Cursor attributes can be used with implicit cursors by using the prefix SQL, such as SQL%ROWCOUNT If you use SELECT INTO syntax in your PL/SQL block, you will create an implicit cursor You can then use these attributes on the implicit cursor B) What will happen if the following code is run? Describe . maximum length of a message returned by the SQLERRM function is 512 bytes. Consider what happens if you modify the preceding by adding the SQLCODE and SQLERRM functions. columns MODIFIED _BY and MODIFIED_DATE. Define an exception and associate it with the Oracle error number so that the error generated by the INSERT statement

Ngày đăng: 21/01/2014, 08:20

TỪ KHÓA LIÊN QUAN