P L / S Q L Oracle10g Developer: PL/SQL Programming Chapter 3 Handling Data in PL/SQL Blocks Chapter Objectives P L / S Q L • After completing this lesson, you should be able to understand: – – – – SQL queries within PL/SQL Host or bind variables The %TYPE attribute Expanding block processing to include queries and control structures Oracle10g Developer: PL/SQL Programming 2 Chapter Objectives (continued) P L / S Q L • After completing this lesson, you should be able to understand (continued): – – – – Embedding DML statements within PL/SQL Composite data types Creating collections Understanding the GOTO statement Oracle10g Developer: PL/SQL Programming 3 Brewbean’s Challenge P L / S Q L • Consider actions needed upon check out Oracle10g Developer: PL/SQL Programming 4 Include SQL within a Block P L / S Q L • Data query needs to identify if the customer has a saved basket Oracle10g Developer: PL/SQL Programming 5 Include SQL within a Block (continued) P L / S Q L • SQL statements can be embedded into the executable area of a PL/SQL block • SELECT statements are embedded to query needed data • An INTO clause is added to a SELECT statement to move data retrieved into variables Oracle10g Developer: PL/SQL Programming 6 Include SQL within a Block (continued) P L / S Q L SQL Query – add INTO clause Assignment Statement Oracle10g Developer: PL/SQL Programming 7 Executing a Block with Errors P L / S Q L • Common Errors – – – – – Use = rather than := Not declaring a variable Misspelling a variable name Not ending a statement with ; No data returned from a SELECT statement Oracle10g Developer: PL/SQL Programming 8 Executing a Block with Errors (continued) P L / S Q L • Not closing a statement with ; Oracle10g Developer: PL/SQL Programming 9 Host or Bind Variables P L / S Q L • Reference host variables with a preceding colon in PL/SQL BEGIN :g_shopper := 25; END; / WHERE idShopper = :g_shopper AND orderplaced = 0; Oracle10g Developer: PL/SQL Programming Create host variable Reference host variable 10 %TYPE Attribute P L / S Q L • Use in variable declaration to provide data type based on a table column • Ideal for declaring variables that will hold data from the database • Minimizes maintenance by avoiding program changes to reflect database column changes • Called an anchored data type lv_basket_num bb_basket.idBasket%TYPE; Oracle10g Developer: PL/SQL Programming 11 Data Retrieval with Decision Structures P L / S Q L Oracle10g Developer: PL/SQL Programming 12 IF Statement Example P L / S Q L Oracle10g Developer: PL/SQL Programming 13 Including DML P L / S Q L • DML statements can be embedded into PL/SQL blocks to accomplish data changes • DML includes INSERT, UPDATE, and DELETE statements Oracle10g Developer: PL/SQL Programming 14 Including DML (continued) P L / S Q L • Add a new shopper - INSERT Oracle10g Developer: PL/SQL Programming 15 Composite Data Types P L / S Q L • Stores multiple values of different data types as one unit • Record – can hold one row of data • Table of records – can hold multiple rows of data Oracle10g Developer: PL/SQL Programming 16 Record Data Type P L / S Q L DECLARE TYPE type_basket IS RECORD ( basket bb_basket.idBasket%TYPE, created bb_basket.dtcreated%TYPE, qty bb_basket.quantity%TYPE, sub bb_basket.subtotal%TYPE); rec_basket type_basket; lv_days_num NUMBER(3); lv_shopper_num NUMBER(3) := 25; BEGIN SELECT idBasket, dtcreated, quantity, subtotal INTO rec_basket FROM bb_basket WHERE idShopper = lv_shopper_num AND orderplaced = 0; lv_days_num := SYSDATE - rec_basket.created; END; Oracle10g Developer: PL/SQL Programming 17 %ROWTYPE Attribute P L / S Q L • Create record structure based on table structure DECLARE rec_shopper bb_shopper%ROWTYPE; BEGIN SELECT * INTO rec_shopper FROM bb_shopper WHERE idshopper = :g_shopper; DBMS_OUTPUT.PUT_LINE(rec_shopper.lastname); DBMS_OUTPUT.PUT_LINE(rec_shopper.address); DBMS_OUTPUT.PUT_LINE(rec_shopper.email); END; Oracle10g Developer: PL/SQL Programming 18 Table of Records P L / S Q L Oracle10g Developer: PL/SQL Programming 19 Collections P L / S Q L • Store multiple values of the same data type • Similar to arrays in other languages • Index-by Tables – handle many rows of one field Onedimensional Can only have one column Unconstrained Rows added dynamically as needed Sparse A row only exists when a value is assigned; rows do not have to be assigned sequentially Homogeneous All elements have same data type Indexed Integer index serves as primary key of the table Oracle10g Developer: PL/SQL Programming 20 Index-by Table Attributes P L / S Q L Attribute Name Value Data type Description COUNT NUMBER Number of rows in the table DELETE None Removes a row from the table EXISTS BOOLEAN TRUE if specified row does exist FIRST BINARY_INTEGER Index for the first row in the table LAST BINARY_INTEGER Index for the last row in the table NEXT BINARY_INTEGER Index for the next row in the table after the row specified PRIOR BINARY_INTEGER Index for the row in the table before the row specified Oracle10g Developer: PL/SQL Programming 21 Index-by Table Example P L / S Q L Host variables declaration and initialization Oracle10g Developer: PL/SQL Programming 22 Index-by Table Example Index-by table data type declaration P L / S Q L Index-by table variable declaration Put host variable values into the table variable A FOR loop adds all the sample measurements that have been entered into the table variable lv_avg_num calculates the Average measurement Oracle10g Developer: PL/SQL Programming 23 GOTO Statement P L / S Q L • Jumping control that instructs the program to move to another area of code to continue processing • Most developers discourage the use of GOTO as it complicates the flow of execution Oracle10g Developer: PL/SQL Programming 24 Summary P L / S Q L • SQL queries and DML statements can be embedded into a block • An INTO clause must be added to a SELECT • The %TYPE attribute is used to use a column data type • Composite data types can hold multiple values in a single variable Oracle10g Developer: PL/SQL Programming 25 Summary (continued) P L / S Q L • A record can hold a row of data • A table of records can hold multiple rows of data • The %ROWTYPE attribute can be used to declare a data type based on a table’s structure • An index-by table is a collection similar to arrays • The GOTO statement enables execution to jump to specific portions of code Oracle10g Developer: PL/SQL Programming 26