Upload
beverley-farmer
View
225
Download
0
Embed Size (px)
Citation preview
Program with PL/SQL
Lesson 5
Working with Composite Data Types
Composite Data Types
• Are of two types– PL/SQL RECORDS– PL/SQL Collections
•INDEX BY Table• Nested Table•VARRAY
• Contain internal components
• Are reusable
PL/SQL Records
• Must contain one or more components of any scalar, RECORD, or INDEX BY table data type, called fields
• Are similar in structure to records in a third generation language (3GL)
• Are not the same as rows in a database table
• Treat a collection of fields as a logical unit• Are convenient for fetching a row of data
from a table for processing
Creating a PL/SQL Record
Syntax:
Where field_declaration is:
TYPE type_name IS RECORD(field_declaration[, field_declaration] …);
Identifier type_name;
field_name {field_type | variable%TYPE| table.column%TYPE | table%ROWTYPE}[[NOT NULL] {:= | DEFAULT} expr]
PL/SQL Record Structure
100 King AD_PRES
Field1 (data type) Field2 (data type) Field3 (data type)
Field1 (data type) Field2 (data type) Field3 (data type)
Employee_id number(6) Last_name varchar2(25) Job_id varchar2(10)
Example:
The %ROWTYPE Attribute
• Declare a variable according to a collection of columns in a database table or view
• Prefix %ROWTYPE with the database table
• Fields in the record take their names and data types from the columns of the table or view
Advantages of Using %ROWTYPE
• The number and data types of the underlying database columns need not be known
• The number and data types of the underlying database column may change at run time
• The attribute is useful when retrieving a row with the SELECT * statement
INDEX BY Tables
• Are composed of two components:– Primary key of data type BINARY_INTEGER– Column of scalar or record data type
• Can increase in size dynamically because they are unconstrained
Creating an INDEX BY TableSyntax:
Declare an INDEX BY table to store names
Example:
TYPE type_name IS TABLE OF{column_type | variable%TYPE| table.column%TYPE} [NOT NULL]| table.%ROWTYPE[INDEX BY BINARY_INTEGER];
Identifier type_name;
. . .TYPE ename_table_type IS TABLE OF
employee.last_name%TYPEINDEX BY BINARY_INTEGER;
Ename_table ename_table_type;
INDEX BY Table Structure
. . .
1
2
3
. . .
. . .
Jones
Smith
Maduro
. . .
Unique identifier
BINARY_INTEGER
Column
Scalar
Using INDEX BY Table Methods
The following methods make INDEX BY tables easier to use:
– EXISTS– COUNT– FIRST and LAST– PRIOR– NEXT– TRIM– DELETE
Writing Executable Statement
PL/SQL Block Syntax and Guidelines
• Statements can be split across line, but keywords must not split
• Lexical units can be classified as:– Delimiters– Identifiers– Literals
• Character and date literals must be enclosed in single quotation marks
• Numbers can be simple values or scientific notation
– Comments
Identifiers
• Can contain up to 30 characters• Must begin with an alphabetical character• Can contain numerals, dollar signs,
underscores, and nuber signs• Cannot contain characters such as
hyphens, slashes, and spaces• Should not have the same name as a
database table column name• Should not be reserved words
Commenting Code
• Prefix single-line comments with two dashes (--)
• Place multiple-line comments between the symbols /* and */
SQL Functions in PL/SQL
• Available in procedural statements:– Single-row number– Single-row character– Data type conversion– Date– Timestamp – GREATEST and LEAST– Miscellaneous functions
• Not available in procedural statements– DECODE– Group functions
Nested Blocks and Variable Scope
• PL/SQL blocks can be nested wherever an executable statement is allowed
• A nested block becomes a statements• An exception section can contain nested
blocks• The scope of an identifier is that region of
a program unit (block, subprogram, or package) from which you can reference the identifier
Identifier Scope
An identifier is visible in the regions where you can reference the identifier without having to qualify it:
– A block can look up to the enclosing block– A block cannot look down to enclosed
blocks
Qualify an Identifier
• The qualifier can be the label of an enclosing block
• Qualify an identifier by using the block label prefix
Determining Variable Scope<<outer>>DECLARE
v_sal NUMBER(7,2) := 60000;v_comm NUMBER(7,2) := v_sal * 0.20;v_message VARCHAR2(255) := ‘eligible for
commision’;BEGIN
DECLAREv_sal NUMBER(7,2) := 50000;v_comm NUMBER(7,2) := 0;v_total_comp NUMBER(7,2) := v_sal + v_comm;
BEGINv_message := ‘CLERK not’||v_message;outer.v_comm := v_sal * 0.30;
END;v_message := ‘SALESMAN’||v_message;
END;
Operators in PL/SQL
• Logical
• Arithmetic
• Concatenation
• Parentheses to control order of operations
• Exponential operator (**)
Rules of Precedence
Operator Operation** Exponentiation
+, - Identity, negation
*, / Multiplication, division
+. -, || Addition, subtraction, concatenation
=, <. >, <=, >=, <>, !=, ~=, ^=, IS NULL, LIKE, BETWEEN, IN
Comparison
NOT Logical negation
AND Conjunction
OR Inclusion
Programming Guidelines
Make code maintenance easier by:
• Documenting code with comments
• Developing a case convention for tho code
• Developing naming conventions for identifies and other objects
• Enhancing readability by indenting