Professional Documents
Culture Documents
PLSQLPPT 2263
PLSQLPPT 2263
Introduction
Benefits
Basic Constructs
Anonymous blocks
Procedures
Functions
Packages
Triggers
Cursors
Dynamic SQL
1ICS 334
Introduction
2ICS 334
- Benefits
Iteration (loops)
Selection (Ifs)
Cursors
Block Structures
Stored Procedures
etc.
3ICS 334
- Basic Constructs
Basic Structure
Running a program
Variables
SELECT INTO
Comments
IFs
LOOPs
Output
4ICS 334
-- Basic Structure
DECLARE
BEGIN
EXCEPTION
END;
5ICS 334
- OUTPUT
SET SERVEROUTPUT ON;
BEGIN
DBMS_OUTPUT.PUT_LINE('This is my fist program');
END;
/
END;
7ICS 334
-- Running a Program
DECLARE
BEGIN
EXCEPTION
END;
9ICS 334
-- Variables
NUMBER
DATE
INTEGER
VARCHAR2
CHAR
BOOLEAN
Declaration
V_salary
V_id
V_dob
V_name
V_gender
V_salary
NUMBER(9,2);
INTEGER;
DATE;
VARCHAR2(35);
CHAR;
emp.salary%TYPE;
10ICS 334
-- SELECT INTO
DECLARE
v_job
v_sal
v_empno
emp.job%TYPE;
emp.sal%TYPE;
emp.empno%TYPE;
BEGIN
v_empno := 1234567;
SELECT job, sal
INTO v_job,v_sal
FROM emp
WHERE empno = v_empno;
END;
/
11ICS 334
-- Another Example
declare
v_ename
emp.ename%TYPE;
v_sal
emp.sal%TYPE;
begin
select ename, sal
into v_ename, v_sal
from emp
where empno = '7844';
DBMS_OUTPUT.PUT_LINE('solution is:'||v_ename||'---'||v_sal);
exception
When others then
DBMS_OUTPUT.PUT_LINE('no record');
end;
/
Before executing code that contains DBMS_OUTPUT.PUT_LINE,
must run at SQL prompt: set serveroutput on
12ICS 334
-- Comments
DECLARE
/*
This block will do
so and so and so.
*/
v_job
emp.job%TYPE;
v_sal
emp.sal%TYPE;
v_empno
emp.empno%TYPE;
BEGIN
v_empno := 1234567; -- The use of this sentence is so and so.
-- The following SELECT INTO statement will do so and so.
SELECT job, sal
INTO v_job,v_sal
FROM emp
WHERE empno = v_empno;
END;
/
13ICS 334
-- IFs
IF END IF
IF ELSE END IF
IF ELSIF ELSE END IF
14ICS 334
--- IF END IF
DECLARE
BEGIN
v_commison := 7500;
IF v_dept = 10 THEN
v_commision := 5000;
END IF;
END;
/
15ICS 334
BEGIN
IF v_dept = 10 THEN
v_commision := 5000;
ELSE
v_commision := 7500;
END IF;
END;
/
16ICS 334
BEGIN
IF v_dept = 10 THEN
v_commision := 5000;
ELSIF v_dept = 20 THEN
v_commison := 5500;
ELSIF v_dept = 30 THEN
v_commison := 6200;
ELSE
v_commision := 7500;
END IF;
END;
/
17ICS 334
-- LOOPs
18ICS 334
BEGIN
LOOP
INSERT INTO dept(deptno)
VALUES(v_deptno);
v_counter := v_counter + 1;
v_deptno := v_deptno + 10;
EXIT WHEN v_counter > 5;
END LOOP;
END;
/
19ICS 334
BEGIN
END;
/
20ICS 334
BEGIN
v_counter := 1;
WHILE v_counter <= 5 LOOP
INSERT INTO dept(deptno)
VALUES(v_deptno);
v_deptno := v_deptno + 10;
END LOOP;
END;
/
21ICS 334
- OUTPUT
SET SERVEROUTPUT ON;
DECLARE
v_sum_sal
v_deptno
emp.sal%TYPE;
emp.deptno%TYPE := 10;
BEGIN
SELECT SUM(sal)
INTO v_sum_sal
FROM emp
WHERE deptno = v_deptno;
DBMS_OUTPUT.PUT_LINE('The sum is || TO_CHAR(v_sum_sal));
END;
/
22ICS 334
- Anonymous Block
DECLARE
v_id
INTEGER;
BEGIN
v_id := 1234567;
DELETE
FROM EMP
WHERE id = v_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No record exists');
/
END;
23ICS 334
24ICS 334
Exceptions
Examples are
NO_DATA_FOUND
OTHERS
To display details of oracle standard error
message
EXCEPTION
- Procedure
IN
OUT
IN OUT
Is stored (USER_SOURCE)
26ICS 334
) IS
BEGIN
EXCEPTION
END;
/
27ICS 334
-- Creating or Replacing a
Procedure
SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE proc_test(p_empno IN VARCHAR2) IS
v_job
v_sal
EMP.job%TYPE;
EMP.sal%TYPE;
BEGIN
SELECT job, sal
INTO v_job,v_sal
FROM emp
WHERE empno = p_empno;
DBMS_OUTPUT.PUT_LINE('job is '||v_job);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR...');
END;
/
28ICS 334
-- Invoking a Procedure
DECLARE
BEGIN
proc_test(23);
END;
/
Or
SQL> exec proc_test(1123)
29ICS 334
Another Example
SQL> ed
Wrote file afiedt.buf
1
2
3
4
5
6
7
8
9
10
11
12*
SQL>
Procedure created.
SQL> exec test_proc
No record exists
PL/SQL procedure successfully completed.
SQL> show errors
30ICS 334
- Function
31ICS 334
BEGIN
EXECPTION
END;
/
32ICS 334
emp.sal%TYPE;
BEGIN
SELECT SUM(sal)
INTO v_sum_sal
FROM emp
WHERE deptno = p_deptno;
RETURN v_sum_sal;
END;
/
33ICS 334
-- Invoking a Function
SET SERVEROUTPUT ON;
DECLARE
v_sal
emp.sal%TYPE;
BEGIN
v_sal := sum_dept_sal(10);
DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_sal));
END;
/
34ICS 334
35ICS 334
Exercise
- Packages
Package
Package Specification
Package Body
37ICS 334
-- Package Specification
CREATE OR REPLACE PACKAGE emp_info is
v_count
INTEGER;
38ICS 334
-- Package Body
CREATE OR REPLACE PACKAGE BODY emp_info is`
PROCEDURE insert_record(p_empno IN NUMBER,p_ename IN VARCHAR2,
p_job IN VARCHAR2,p_sal IN NUMBER,
p_comm IN NUMBER,p_deptno IN VARCHAR2) IS
BEGIN
INSERT INTO EMP(empno,ename,job,sal,comm,deptno)
VALUES(p_empno,p_ename,p_job,p_sal,p_comm,p_deptno);
END insert_record;
PROCEDURE delete_record(p_empno IN NUMBER) IS
BEGIN
DELETE FROM EMP
WHERE empno=p_empno;
END delete_record;
FUNCTION sum_dept_sal(p_deptno IN NUMBER) RETURN emp.sal%TYPE IS
v_sum_sal emp.sal%TYPE;
BEGIN
SELECT SUM(sal)
INTO v_sum_sal
FROM emp
WHERE deptno = p_deptno;
RETURN v_sum_sal;
END;
END emp_info; --end of package body
/
39ICS 334
v_sum_sal := emp_info.sum_dept_sal(10);
emp_info.delete_record(1234567);
END;
/
Or
SQL> exec
emp_info.insert_record(,)
40ICS 334
- Triggers
Security
Enforce complex integrity constraint
Prevent invalid transaction
Event logging
41ICS 334
42ICS 334
43ICS 334
--Exercise
Write a trigger for the following:
When a record is added or deleted from
an employee table, DEPT.NoOfEmp
column gets updated accordingly to
number of employees in EMP table
corresponding to department number.
44ICS 334
- Cursors
Is a pointer to a row.
Its is mainly used with tables which
return more than one row.
It is handled implicitly and explicitly.
45ICS 334
- Cusrors
CURSOR c_emp IS
SELECT empno, ename, job
FROM emp
WHERE deptno = 20;
7369
7566
7788
7876
7906
Smith Clerk
Jones Manager
SCOTT Analyst
Adams Clerk
FORD Analyst
current row
46ICS 334
- Cursors
DECLARE
CURSOR c_emp IS
SELECT empno, ename, job
FROM emp
WHERE deptno = 20;
BEGIN
FOR v_c IN c_emp LOOP
DBMS_OUTPUT.PUT_LINE(v_c.ename);
END LOOP;
end;
/
47ICS 334
- Example
- Examples solution
49ICS 334
Dynamic SQL
begin
execute immediate 'create table tt(id
number(3))';
end;
/
50ICS 334