My SQLPLSQL Final

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 43

1

3. PL/SQL
MySQL Stored Procedure
and User- Defined Function

PL/SQL 12-May-22
2 Stored Procedure

A stored procedure is a program with


SQL code which is stored in the
database catalog and can be invoked
later by a program, a trigger or even a
stored procedure.
MySQL supports stored procedure
since version 5.0 to allow MySQL more
flexible and powerful.

PL/SQL 12-May-22
3 Three Ways to CreateA
Procedure
1. Save the procedure commands in a text
file.
2. Use the phpMyAdmin or other utility to
enter commands.

3. Enter the commands using the MySQL


command prompt.

PL/SQL 12-May-22
4 Example of a command file

DELIMITER //

CREATE PROCEDURE Hello()


LANGUAGE SQL
DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'A procedure'
BEGIN
SELECT 'Hello World !';
END
//
PL/SQL 12-May-22
Optional characteristics
5
Type: Procedure/Function
Language :the default value is SQL.
Deterministic :If the procedure always t
he same results, given the same input.
The default value is NOTDETERMINISTIC.
SQL Security :At call time, check
privileges of the user. INVOKER is the user
who calls the procedure. DEFINER is the
creator of the procedure. The default
value is DEFINER.
Comment :For documentation
purposes; the default value is""
PL/SQL 12-May-22
6 Run a procedure

With client:
Routines/select the procedure and click execute
With the command prompt:

CALL stored_procedure_name
(param1, param2, ....);

PL/SQL 12-May-22
7 CREATE PROCEDURE
ProcName()
Stored procedure names are case
insensitive
A procedure may have parameters

PL/SQL 12-May-22
Define parameters within a stored procedure
8 Parameter list isempty
CREATE PROCEDURE proc1 ():
Define input parameter with key word IN:
CREATE PROCEDURE proc1 (IN varnameDATA-
TYPE)
The word IN is optional because parameters are
IN (input) by default.
Define output parameterwith OUT:
CREATE PROCEDURE proc1 (OUT varnameDATA-
TYPE)
A procedure may have input and output
paramters:
CREATE PROCEDURE proc1 (INOUT varname
PL/SQL
DATA-TYPE) 12-May-22
9 Executable Section

BEGIN
Statements
END

PL/SQL 12-May-22
Examples of parameters
10
CREATE PROCEDURE proc_IN (IN var1 INT)
BEGIN
SELECT var1 + 2 AS result;
END;

CREATE PROCEDURE proc_OUT(OUT var1 VARCHAR(100))


BEGIN
SET var1 = 'This is a test';
END

CREATE PROCEDURE proc_INOUT (IN var1 INT,OUT var2


INT)
BEGIN
SET var2 = var1 * 2;
ENDPL/SQL 12-May-22
Variable Declaration
11 DECLARE variable_name datatype(size)
DEFAULT default_value;
 Variable naming rules:Identifiers can
consistof any alphanumeric
characters, plus the characters '_' and
'$'.
 Identifiers can start with any character
that is legal in an identifier, including a
digit. However, an identifier cannot
consist entirely of digits.
Data types:A variable can have any MySQL data types. For
example:
Character: CHAR(n), VARCHAR(n)
Number: INT, SMALLINT, DECIMAL(i,j), DOUBLE
Date: DATE, TIME, DATETIME
BOOLEAN
PL/SQL 12-May-22
12 Examples

DECLARE x, y INT DEFAULT 0;

DECLARE today TIMESTAMP DEFAULT

CURRENT_DATE;

DECLARE ename VARCHAR(50);

DECLARE no_more_rows BOOLEAN;


SET no_more_rows = TRUE;
PL/SQL 12-May-22
13 Assigning variables

Using the SETcommand:


DECLARE total_count INT DEFAULT 0; SET total_count
=10;

Using the SELECT INTO command:


DECLARE total_products INT DEFAULT 0; SELECT
COUNT(*) INTO total_products

FROM products;

PL/SQL 12-May-22
14 SELECT … INTO

SELECT columns separated by commas


INTO variables separated by commas
FROM tablename
WHERE condition;
Ex:
SELECT cid, cname INTO custID,
customername
FROM customer
WHERE cid =‘c01’;

PL/SQL 12-May-22
15 Arithmetic and string
operators
Arithmetic operators:
+, -, *,/
Modulo operator:
% or mod
Other math calculations use math functions:
Pow(x,y)
Concatenation uses CONCAT function:
SELECT CONCAT('New ', 'York ', 'City');

PL/SQL 12-May-22
16 MySQL Comparison
Operators
EQUAL(=)
LESS THAN(<)
LESS THAN OR EQUAL(<=)
GREATER THAN(>)
GREATER THAN OR EQUAL(>=)
NOT EQUAL(<>,!=)

PL/SQL 12-May-22
Logical Operators
17
Logical AND:
AND, &&

UnitsInStock <ReorderLevel AND


CategoryID=1
UnitsInStock <ReorderLevel && CategoryID=1
Negates value:
NOT, !
Logical OR:
| | , OR
CategoryID=1 OR CategoryID=8
CategoryID=1 | | CategoryID=8

PL/SQL 12-May-22
IFstatement: The IFstatement can have
18 THEN, ELSE, and ELSEIFclauses, and it is
terminated with ENDIF.

IF variable1 = 0 THEN
SELECT variable1;
END IF;

IF param1 = 0 THEN
SELECT 'Parameter value = 0';
ELSE
SELECT 'Parameter value <> 0';
END IF;
PL/SQL 12-May-22
19
CASE Statement

CREATE PROCEDURE proc_CASE(IN param1 INT)


BEGIN
DECLARE variable1 INT;
SET variable1 = param1 + 1;
CASE variable1
WHEN 0 THEN
INSERT INTO table1 VALUES (param1);
WHEN 1 THEN
INSERT INTO table1 VALUES (variable1);
ELSE
INSERT INTO table1 VALUES (99);
END CASE;
END PL/SQL 12-May-22
20 WHILE cond DO statement

CREATE PROCEDURE proc_WHILE (IN param1 INT)


BEGIN
DECLARE variable1, variable2 INT;
SET variable1 = 0;
WHILE variable1 < param1 DO
INSERT INTO table1 VALUES (param1);
SELECT COUNT(*) INTO variable2 FROM table1;
SET variable1 = variable2;
END WHILE;
END

PL/SQL 12-May-22
21 Comment Syntax

From a /* sequence to the following */ sequence.


From a “#” character to the end of the line.
From a “-- ” sequence to the end of the line. In MySQL, the “-- ”
(double-dash) comment style requires the second dash to be
followed by at least one whitespace
-- Programmer: John Smith

PL/SQL 12-May-22
A Procedure to compute tax that takes sidIN and
22 taxRate as inputs and return taxOut as output

DELIMITER //
CREATE PROCEDURE Caltax(sidIN char(5), taxRate double, out taxOut
double)
LANGUAGE SQL
DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'Aprocedure'
BEGIN
DECLARE tax DOUBLE;
DECLARE empSalary DOUBLE;
select Salary into empSalary from salesreps where sid = sidIN;
set taxOut=taxRate*empSalary;
END
// PL/SQL 12-May-22
23

Note 1:No need to surround the sidIN with quotation


mark:
select Salary into empSalary from salesreps where
sid =sidIN;
Note 2: The delimiter is changed to // to enable the
entire definition to be passed to the server as a single
statement. It can be restored to “;” mysql>delimiter ;

PL/SQL 12-May-22
User-Defined
24 Temporary Variables
• User variables are written as @var_name.

mysql> SET @t1=1, @t2=2, @t3=4;


mysql> SELECT @t1, @t2, @t3, @t4 := @t1+@t2+@t3;
+------+------+------+--------------------+
| @t1 | @t2 | @t3 | @t4 := @t1+@t2+@t3 |
+------+------+------+--------------------+
| 1| 2| 4| 7|
+------+------+------+--------------------+

PL/SQL 12-May-22
Example ofrunning the procedure
25
from the command prompt

mysql> delimiter ;
mysql> set @tax=0;
Query OK, 0 rows affected (0.00 sec)

mysql> call caltax('S1',0.1,@tax);


Query OK, 1 row affected (0.00 sec)

mysql> select @tax;


+------+
| @tax |
+------+
| 650 |
+------+
1 row in setPL/SQL
(0.00 sec) 12-May-22
First, check if the customer exist before adding a new order
DELIMITER //
26 CREATE PROCEDURE addOrder(oidIN char(5), cidIN char(5), sidIN char(5),
odateIN date)
LANGUAGE SQL
DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'A procedure'
BEGIN
DECLARE cidTemp char(5) default "x";
select cid into cidTemp from customers where cid = cidIN;
IF cidTemp=cidIN THEN
insert into orders values(oidIN,cidIN,sidIN,odateIN);
END IF;
END
//

mysql> call
PL/SQL
addOrder('O8','C12','S1','2013-06-10'); 12-May-22
Query OK, 0 rows affected, 1 warning (0.00 sec) because C12 not exist!
Example:Procedure
27
showCustomers
DELIMITER //
DROP PROCEDURE IF EXISTS showCustomers;
CREATE PROCEDURE showCustomers ()
LANGUAGE SQL
DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'A procedure'
BEGIN
Select * from Customers;
END
//

DELIMITER ;
PL/SQL 12-May-22
28 Calling a procedure with
OUT parameter
Must use MySQL temporary @variable to receive the
output value.
Because a stored procedure does not return to PHP
anything, it returns the value into the MySQL variable
(@return) (scope is in MySQL), so you need to query
this variable in a separate call.

PL/SQL 12-May-22
Triggers
29

A trigger is a program stored in the


database and is called automatically
when a triggering event occurs.
It is associated with a table, and that
activates when a particular event occurs
for the table. Some uses for triggers are
to perform checks of values to be
inserted into a table or to perform
calculations on values involved in an
update.
A trigger is defined to activate when an
INSERT, DELETE, or UPDATE statement
executes for the associated table. A
trigger can be set to activate either
before or after the triggering statement.
PL/SQL 12-May-22
CREATE TRIGGERSyntax
30
CREATE TRIGGER trigger_name trigger_time
trigger_event ON tbl_name FOR EACH ROW
trigger_body

trigger_time: It can be BEFORE or AFTER


trigger_event: Insert, Delete, Update
Example:

CREATE TRIGGER ratingChanged AFTER


UPDATE ON customers
FOR EACH ROW

PL/SQL 12-May-22
31 OLD and NEW

You can refer to columns in the subject table (the


table associated with the trigger) by using the aliases
OLD and NEW. OLD.col_name refers to a column of an
existing row before it is updated or deleted.
NEW.col_name refers to the column of a new row to
be inserted or an existing row after it is updated.

PL/SQL 12-May-22
32 Example: Customer Rating
Change Log
Table name: CustomerLog
Fields: CID, Cname, OldRating,NewRating

PL/SQL 12-May-22
Demo :New and :Old
33
delimiter //
DROP TRIGGER IF EXISTS ratingChanged;
CREATE TRIGGER ratingChanged AFTER UPDATE ON
customers FOR EACH ROW
BEGIN
insert into customerlog
values(old.cid,old.cname,old.rating,new.rating);

END
//

PL/SQL 12-May-22

delimiter ;
34 Example
mysql> update customers set rating='c' where cid='C1';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from customerlog;


+-----+-------+-----------+-----------+
| cid | Cname | OldRating | NewRating |
+-----+-------+-----------+-----------+
| C1 | MYERS | A |c |
+-----+-------+-----------+-----------+
1 row in set (0.00 sec)

PL/SQL 12-May-22
Updating the onhand quantity after a new detail line is added:
35

delimiter //
DROP TRIGGER IF EXISTS adddetail;
CREATE TRIGGER adddetail AFTER INSERT ON odetails
FOR EACH ROW
BEGIN
DECLARE stocks decimal(5,1);
select onhand into stocks from products where pid=new.pid;
update products set onhand=onhand - new.qty where pid=new.pid;
END
//

delimiter ;

PL/SQL 12-May-22
User Defined Functions
36
Stored functions differ from stored procedures in that stored
functions actually return a value.
Stored functions have only input parameters (if any
parameters at all), so the IN , OUT , and INOUT keywords aren’t
used.
Stored functions have no output parameters; instead, you use
a RETURN statement to return a value whose type is
determined by the RETURNS type statement, which precedes
the body of the function.

PL/SQL 12-May-22
Example
37 DELIMITER //
DROP FUNCTION IF EXISTSempTax;
CREATE FUNCTION empTax(Salary Decimal(10,2)) RETURNS
Decimal(10,2)
BEGIN
Declare tax decimal(10,2);
if salary <3000.00 then
set tax=salary*0.1;
elseif Salary <5000.00then
set tax=Salary*0.2;
else
set tax=Salary*0.3;
end if;
return tax;
END
//

PL/SQL 12-May-22
38 Using the User-defined
Function with SQL

mysql> delimiter ;
mysql> select sname, emptax(Salary) as tax from salesreps;
+-------+---------+
| sname | tax |
+-------+---------+
| PETER | 1950.00 |
| PAUL | 2160.00 |
| MARY | 2250.00 |
+-------+---------+
3 rows in set (0.00 sec)
PL/SQL 12-May-22
39 Cursors

A cursor is a pointer to a set of records returned by a


SQL statement. It enables you to take a set of records
and deal with it on a row-by-row basis.

PL/SQL 12-May-22
40 Cursor has three important
properties
The cursor will not reflect changes in its source tables.
Read Only :Cursors are not updatable.
Not Scrollable :Cursors can be traversed only in one
direction, forward, and you can't skip records from
fetching.

PL/SQL 12-May-22
Defining and Using Cursors
41
Declare cursor:
DECLARE cursor-name CURSOR FOR SELECT
...;
DECLARE CONTINUE HANDLER FOR NOT FOUND:
Specify what to do when no more records found
DECLARE b INT;
DECLARE CONTINUE HANDLER FOR NOT FOUND SETb =1;

Open cursor:
OPEN cursor-name;

Fetch data intovariables:


FETCH cursor-name INTO variable [,variable];

CLOSE cursor:
PL/SQL 12-May-22

CLOSE cursor-name;
Cursor Example
42 DELIMITER //
DROP Procedure IF EXISTS maleSum;
CREATE Procedure maleSum(OUT sumSalary Decimal(10,2))
BEGIN
DECLARE Sal,sumSal decimal(10,2);
DECLARE continueFlag int default 0;
DECLARE maleCursor CURSOR FOR SELECT Salary FROM salesreps where sex='M';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET continueFlag = 1;
OPEN maleCursor;
SET Sal = 0;
SET sumSal= 0;
WHILE continueFlag = 0 DO
FETCH maleCursor INTO Sal;
IF continueFlag = 0 THEN
SET sumSal = sumSal+Sal;
END IF;
END WHILE;
CLOSE maleCursor;
SET sumSalary=sumSal;
END
PL/SQL 12-May-22
//
A procedure to create email list using cursor
43 DELIMITER //
DROP PROCEDURE IF EXISTS emailgroup;
CREATE PROCEDURE emailgroup (INOUT emaillist varchar(4000))
LANGUAGE SQL
DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'Aprocedure'
BEGIN
DECLARE continueFlag INTEGER DEFAULT 0;
DECLARE useremail varchar(100) DEFAULT "";
DEClARE email_cursor CURSOR FOR SELECT email FROM users;
= 1D;ECLARE CONTINUE HANDLER FOR NOT FOUND SET continueFlag
OPEN email_cursor;
WHILE continueFlag = 0 DO
FETCH email_cursor INTO useremail;
IF continueFlag = 0 THEN
SET emaillist = CONCAT(useremail,";",emaillist);
END IF;
END WHILE;
CLOSE email_cursor;
END
// PL/SQL 12-May-22

DELIMITER ;

You might also like