PLSQL s02 l05
PLSQL s02 l05
PLSQL s02 l05
All rights
reserved.
Database Programming with
PL/SQL
Writing PL/SQL Executable Statements
2 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Objectives
This lesson covers the following objectives:
Construct accurate variable assignment statements in
PL/SQL
Construct accurate statements using built-in SQL
functions in PL/SQL
Differentiate between implicit and explicit conversions of
data types
Describe when implicit conversions of data types take
place
Writing PL/SQL Executable Statements
3 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Objectives (cont.)
This lesson covers the following objectives:
List the drawbacks of implicit data type conversions
Construct accurate statements using functions to
explicitly convert data types
Construct statements using operators in PL/SQL
Writing PL/SQL Executable Statements
4 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Purpose
Weve introduced variables and identifiers.
Now, you build your knowledge of the PL/SQL
programming language by writing code to assign variable
values. These values can be literals.
They can also be functions. SQL provides a number of
predefined functions that you can use in SQL statements.
Most of these functions are also valid in PL/SQL
expressions.
Writing PL/SQL Executable Statements
5 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Assigning New Values to Variables
Character and date literals must be enclosed in single
quotation marks.
Statements can continue over several lines.
Writing PL/SQL Executable Statements
v_name := 'Henderson';
v_start_date := '12-DEC-2005';
v_quote := 'The only thing that we can know is that we know nothing and
that is the highest flight of human reason.';
6 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Assigning New Values to Variables (cont.)
Numbers can be simple values or scientific notation
(2E5 meaning 2x10 to the power of 5 = 200,000).
.
Writing PL/SQL Executable Statements
v_my_integer := 100;
v_my_sci_not := 2E5;
7 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
SQL Functions in PL/SQL
You are already familiar with functions in SQL
statements. For example:
You can also use these functions in PL/SQL procedural
statements. For example:
Writing PL/SQL Executable Statements
SELECT country_name, LAST_DAY(date_of_independence)
FROM wf_countries
WHERE date_of_independence IS NOT NULL;
DECLARE
v_last_day DATE;
BEGIN
v_last_day := LAST_DAY(SYSDATE);
DBMS_OUTPUT.PUT_LINE(v_last_day);
END;
8 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
SQL Functions in PL/SQL (cont.)
Available in procedural statements:
Single-row character
Single-row number
Date
Data-type conversion
Miscellaneous functions
Not available in procedural statements:
DECODE
Group functions
Writing PL/SQL Executable Statements
9 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Character Functions
Valid character functions in PL/SQL include:
This is not an exhaustive list. Refer to the Oracle
documentation for the complete list.
Writing PL/SQL Executable Statements
ASCII LENGTH RPAD
CHR LOWER RTRIM
CONCAT LPAD SUBSTR
INITCAP LTRIM TRIM
INSTR REPLACE UPPER
10 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Examples of Character Functions
Get the length of a string:
Convert the name of the country capitol to upper case:
Concatenate the first and last names:
Writing PL/SQL Executable Statements
v_desc_size INTEGER(5);
v_prod_description VARCHAR2(70):='You can use this product with your
radios for higher frequency';
-- get the length of the string in prod_description
v_desc_size:= LENGTH(v_prod_description);
v_capitol_name:= UPPER(v_capitol_name);
v_emp_name:= v_first_name||' '||v_last_name;
11 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Number Functions
Valid number functions in PL/SQL include:
This is not an exhaustive list. Refer to the Oracle
documentation for the complete list.
Writing PL/SQL Executable Statements
ABS EXP ROUND
ACOS LN SIGN
ASIN LOG SIN
ATAN MOD TAN
COS POWER TRUNC
12 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Examples of Number Functions
Get the sign of a number:
Round a number to 0 decimal places:
Writing PL/SQL Executable Statements
DECLARE
v_my_num BINARY_INTEGER :=-56664;
BEGIN
DBMS_OUTPUT.PUT_LINE(SIGN(v_my_num));
END;
DECLARE
v_median_age NUMBER(6,2);
BEGIN
SELECT median_age INTO v_median_age
FROM wf_countries WHERE country_id=27;
DBMS_OUTPUT.PUT_LINE(ROUND(v_median_age,0));
END;
13 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Date Functions
Valid date functions in PL/SQL include:
This is not an exhaustive list. Refer to the Oracle
documentation for the complete list.
Writing PL/SQL Executable Statements
ADD_MONTHS MONTHS_BETWEEN
CURRENT_DATE ROUND
CURRENT_TIMESTAMP SYSDATE
LAST_DAY TRUNC
14 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Examples of Date Functions
Add months to a date:
Calculate the number of months between two dates:
Writing PL/SQL Executable Statements
DECLARE
v_new_date DATE;
v_num_months NUMBER := 6;
BEGIN
v_new_date := ADD_MONTHS(SYSDATE,v_num_months);
DBMS_OUTPUT.PUT_LINE(v_new_date);
END;
DECLARE
v_no_months PLS_INTEGER:=0;
BEGIN
v_no_months := MONTHS_BETWEEN('31-JAN-2006','31-MAY-2005');
DBMS_OUTPUT.PUT_LINE(v_no_months);
END;
15 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Data-Type Conversion
In any programming language, converting one data type
to another is a common requirement. PL/SQL can handle
such conversions with scalar data types.
Data-type conversions can be of two types:
Implicit conversions
Explicit conversions
Writing PL/SQL Executable Statements
16 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Implicit Conversions
In implicit conversions, PL/SQL attempts to convert data
types dynamically if they are mixed in a statement. Implicit
conversions can happen between many types in PL/SQL,
as illustrated by the following chart.
Writing PL/SQL Executable Statements
DATE LONG NUMBER PLS_INTEGER VARCHAR2
DATE N/A X X
LONG N/A X
NUMBER X N/A X X
PLS_INTEGER X X N/A X
VARCHAR2 X X X X N/A
17 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Example of Implicit Conversion
In this example, the variable v_sal_increase is of type
VARCHAR2. While calculating the total salary, PL/SQL first
converts v_sal_increase to NUMBER and then performs
the operation. The result of the operation is the NUMBER
type.
Writing PL/SQL Executable Statements
DECLARE
v_salary NUMBER(6):=6000;
v_sal_increase VARCHAR2(5):='1000';
v_total_salary v_salary%TYPE;
BEGIN
v_total_salary:= v_salary + v_sal_increase;
DBMS_OUTPUT.PUT_LINE(v_total_salary);
END;
18 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Drawbacks of Implicit Conversions
At first glance, implicit conversions might seem useful;
however, there are several drawbacks:
Implicit conversions can be slower.
When you use implicit conversions, you lose control over
your program because you are making an assumption
about how Oracle handles the data. If Oracle changes
the conversion rules, then your code can be affected.
Writing PL/SQL Executable Statements
19 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Drawbacks of Implicit Conversions (cont.)
Implicit conversion rules depend upon the environment
in which you are running.
For example, the date format varies depending on the
language setting and installation type. Code that uses
implicit conversion might not run on a different server or in
a different language.
Code that uses implicit conversion is harder to read and
understand.
Writing PL/SQL Executable Statements
20 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Drawbacks of Implicit Conversions (cont.)
It is the programmer's responsibility to ensure that values
can be converted. For instance, PL/SQL can convert the
CHAR value '02-JUN-1992' to a DATE value, but cannot
convert the CHAR value Yesterday' to a DATE value.
Similarly, PL/SQL cannot convert a VARCHAR2 value
containing alphabetic characters to a NUMBER value.
Writing PL/SQL Executable Statements
Valid? Statement
Yes
v_new_date DATE := '02-JUN-1992';
No
v_new_date DATE := 'Yesterday';
Yes
v_my_number NUMBER := '123';
No
v_my_number NUMBER := 'abc';
21 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Explicit Conversions
Explicit conversions convert values from one data type to
another by using built-in functions. Examples of
conversion functions include:
Writing PL/SQL Executable Statements
TO_NUMBER()
ROWIDTONCHAR()
TO_CHAR()
HEXTORAW()
TO_CLOB()
RAWTOHEX()
CHARTOROWID()
RAWTONHEX()
ROWIDTOCHAR()
TO_DATE()
22 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Examples of Explicit Conversions
TO_CHAR
TO_DATE
Writing PL/SQL Executable Statements
BEGIN
DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,'Month YYYY'));
END;
BEGIN
DBMS_OUTPUT.PUT_LINE(TO_DATE('April-1999','Month-YYYY'));
END;
23 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Examples of Explicit Conversions (cont.)
TO_NUMBER
Writing PL/SQL Executable Statements
DECLARE
v_a VARCHAR2(10) := '-123456';
v_b VARCHAR2(10) := '+987654';
v_c PLS_INTEGER;
BEGIN
v_c := TO_NUMBER(v_a) + TO_NUMBER(v_b);
DBMS_OUTPUT.PUT_LINE(v_c);
END;
24 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Data Type Conversion Example
1
2
3
Writing PL/SQL Executable Statements
v_date_of_joining DATE:= '02-Feb-2000';
v_date_of_joining DATE:= 'February 02,2000';
v_date_of_joining DATE:= TO_DATE('February 02,2000','Month DD,YYYY');
25 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Operators in PL/SQL
The operations within an expression are performed in a
particular order depending on their precedence (priority).
Writing PL/SQL Executable Statements
Logical
Arithmetic
Concatenation
Parentheses to control
the order of operations
Exponential operator
(**)
Same as in
SQL
26 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Operators in PL/SQL (cont.)
The following table shows the default order of operations
from high priority to low priority:
Writing PL/SQL Executable Statements
Operator Operation
**
Exponentiation
+, - Identity, negation
*, / Multiplication, division
+, -, || Addition, subtraction, concatenation
=, <, >, <=, >=, <>, !=, ~=, ^=, IS NULL,
LIKE, BETWEEN, IN
Comparison
NOT Logical negation
AND Conjunction
OR Inclusion
27 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Operators in PL/SQL Examples
Increment the counter for a loop.
Set the value of a Boolean flag.
Validate whether an employee number contains a value.
Writing PL/SQL Executable Statements
v_loop_count := v_loop_count + 1;
v_good_sal := v_sal BETWEEN 50000 AND 150000;
v_valid := (v_empno IS NOT NULL);
28 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Terminology
Key terms used in this lesson included:
Explicit conversion
Implicit conversion
Writing PL/SQL Executable Statements
29 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Summary
In this lesson, you should have learned how to:
Construct accurate variable assignment statements in
PL/SQL
Construct accurate statements using built-in SQL
functions in PL/SQL
Differentiate between implicit and explicit conversions of
data types
Describe when implicit conversions of data types take
place
Writing PL/SQL Executable Statements
30 Copyright 2013, Oracle and/or its affiliates. All rights
reserved.
Summary (cont.)
In this lesson, you should have learned how to:
List the drawbacks of implicit data type conversions
Construct accurate statements using functions to
explicitly convert data types
Construct statements using operators in PL/SQL
Writing PL/SQL Executable Statements