Вы находитесь на странице: 1из 50

1ICS 334

PL/SQL (Embedded SQL)


Introduction
Benefits
Basic Constructs
Anonymous blocks
Procedures
Functions
Packages
Triggers
Cursors
Dynamic SQL

2ICS 334
Introduction
Embedded SQL (PL/SQL, JAVA/ VB & DB)
Database Server Level Programming
(PL/SQL, Transact-SQL, IBM DB2-Cobol, ProC, ProCobol)
Database Client Programming
Developer 9i, JDeveloper 9i, Java (J2EE), VB, .Net
3ICS 334
- Benefits
More powerful than pure SQL because it
combines the power of SQL and
Iteration (loops)
Selection (Ifs)
Cursors
Block Structures
Stored Procedures
etc.


4ICS 334
- Basic Constructs
Basic Structure
Running a program
Variables
SELECT INTO
Comments
IFs
LOOPs
Output
5ICS 334
-- Basic Structure
DECLARE

BEGIN




EXCEPTION

END;
6ICS 334
- OUTPUT
SET SERVEROUTPUT ON;


BEGIN
DBMS_OUTPUT.PUT_LINE('This is my fist program');
END;
/

Before executing code that contains DBMS_OUTPUT.PUT_LINE,
must run (in a current session) at SQL prompt: set serveroutput on

7ICS 334
--- Basic Structure: Example
DECLARE
v_id INTEGER;
v_empno NUMBER;
BEGIN
v_id := 1234567;

SELECT EMPNO
INTO V_EMPNO
FROM EMP
WHERE empno = v_id;

DBMS_OUTPUT.PUT_LINE('Value is '||v_empno);

EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No record exists');

END;
/

8ICS 334
--- Basic Structure: Example
DECLARE
v_id INTEGER;

BEGIN
v_id := 1234567;

DELETE
FROM EMP
WHERE id = v_id;

END;
/

9ICS 334
-- Running a Program
DECLARE

BEGIN




EXCEPTION

END;
/
10ICS 334
-- Variables
Common Data Types
NUMBER
DATE
INTEGER
VARCHAR2
CHAR
BOOLEAN
Declaration
V_salary NUMBER(9,2);
V_id INTEGER;
V_dob DATE;
V_name VARCHAR2(35);
V_gender CHAR;
V_salary emp.salary%TYPE;

11ICS 334
-- SELECT INTO
DECLARE

v_job emp.job%TYPE;
v_sal emp.sal%TYPE;
v_empno emp.empno%TYPE;

BEGIN

v_empno := 1234567;

SELECT job, sal
INTO v_job,v_sal
FROM emp
WHERE empno = v_empno;

END;
/

12ICS 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
13ICS 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;
/

14ICS 334
-- IFs
IF END IF
IF ELSE END IF
IF ELSIF ELSE END IF
15ICS 334
--- IF END IF
DECLARE


BEGIN


v_commison := 7500;

IF v_dept = 10 THEN
v_commision := 5000;
END IF;


END;
/

16ICS 334
--- IF ELSE END IF
DECLARE


BEGIN



IF v_dept = 10 THEN
v_commision := 5000;
ELSE
v_commision := 7500;
END IF;


END;
/

17ICS 334
--- IF ELSIF ELSE END IF
DECLARE


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;
/

18ICS 334
-- LOOPs
LOOP EXIT WHEN END LOOP
FOR LOOP END LOOP
WHILE LOOP END LOOP

19ICS 334
--- LOOP EXIT WHEN END LOOP
DECLARE

v_deptno dept.deptno%TYPE := 50;
v_counter integer := 1;

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;
/
20ICS 334
--- FOR LOOP - END LOOP
DECLARE

v_deptno dept.deptno%TYPE := 50;
v_counter integer;

BEGIN

FOR v_counter IN 1..5 LOOP
INSERT INTO dept(deptno)
VALUES(v_deptno);
v_deptno := v_deptno + 10;
END LOOP;

END;
/
21ICS 334
--- WHILE LOOP - END LOOP
DECLARE

v_deptno dept.deptno%TYPE := 50;
v_counter integer;

BEGIN

v_counter := 1;
WHILE v_counter <= 5 LOOP
INSERT INTO dept(deptno)
VALUES(v_deptno);
v_deptno := v_deptno + 10;
END LOOP;

END;
/
22ICS 334
- OUTPUT
SET SERVEROUTPUT ON;

DECLARE

v_sum_sal emp.sal%TYPE;
v_deptno 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;
/

23ICS 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;
/

24ICS 334
-- Nesting Anonymous Blocks
25ICS 334
Exceptions
Examples are
NO_DATA_FOUND
OTHERS

To display details of oracle standard error message
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(Error detail is: ||SQLERRM)


26ICS 334
- Procedure
Is a block with a name
The DECLARE key word is not used
Parameters can be
IN
OUT
IN OUT
Is stored (USER_SOURCE)
27ICS 334
-- Creating or Replacing a Procedure
CREATE OR REPLACE PROCEDURE pname( ) IS

BEGIN




EXCEPTION

END;
/
28ICS 334
-- Creating or Replacing a Procedure

SET SERVEROUTPUT ON;

CREATE OR REPLACE PROCEDURE proc_test(p_empno IN VARCHAR2) IS

v_job EMP.job%TYPE;
v_sal 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;
/
SQL> Show errors
SQL> execute proc_test(5893);
29ICS 334
-- Invoking a Procedure
DECLARE

BEGIN

proc_test(23);

END;
/

Or
SQL> exec proc_test(1123)
30ICS 334
Another Example
SQL> ed
Wrote file afiedt.buf

1 create or replace procedure test_proc is
2 v_id INTEGER;
3 v_empno emp.empno%TYPE;
4 BEGIN
5 v_id := 1234567;
6 select empno into v_empno
7 FROM EMP
8 WHERE empno = v_id;
9 EXCEPTION
10 WHEN NO_DATA_FOUND THEN
11 DBMS_OUTPUT.PUT_LINE('No record exists');
12* END;
SQL> /

Procedure created.

SQL> exec test_proc
No record exists

PL/SQL procedure successfully completed.

SQL> show errors (to see errors for procedures, functions)
31ICS 334
- Function
Is a block with a name
Returns one value only.
The DECLARE key word is not used
Parameters can only be IN
Is stored
32ICS 334
-- Creating or Replacing a Function
CREATE OR REPLACE FUNCTION fname( )
RETURN datatype IS

BEGIN




EXECPTION

END;
/
33ICS 334
-- Creating or Replacing a Function
CREATE OR REPLACE 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;
/

34ICS 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;
/
35ICS 334
Example, passing parameters
36ICS 334
Exercise
Write down a procedure that displays all
records (all columns) from EMP table. Make
sure program should restricted to fix number
of records of this table. Display Date and
TIME portions of column that has data type
DATE.
Write down a procedure that can insert large
number of records entered at the time of its
execution. You can use EMP table and
appending counter with some columns values
37ICS 334
- Packages
Package
Package Specification
Package Body
Invoking Package subprogram
38ICS 334
-- Package Specification
CREATE OR REPLACE PACKAGE emp_info is

v_count INTEGER;

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);

PROCEDURE delete_record(p_empno IN NUMBER);

FUNCTION sum_dept_sal( p_deptno IN dept.deptno%TYPE) RETURN is dept.sal%TYPE;

END emp_info;
/

39ICS 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
/
40ICS 334
-- Invoking Package Subprogram
DECLARE
v_sum_sal emp.sal%TYPE;
BEGIN

v_sum_sal := emp_info.sum_dept_sal(10);

emp_info.delete_record(1234567);

END;
/

Or
SQL> exec emp_info.insert_record(,)

41ICS 334
- Triggers
Is a stored subprogram associated with a
table.
Are fired by an event
Are mainly used for
Security
Enforce complex integrity constraint
Prevent invalid transaction
Event logging
42ICS 334
-- Creating or Replacing Triggers

CREATE OR REPLACE TRIGGER del_emp( p_empno emp.empno%TYPE)
BEFORE DELETE ON emp
FOR EACH ROW
BEGIN
INSERT INTO emp_audit
VALUES(p_empno, USER, sysdate);
END;
/
43ICS 334
-- Trigger with function usage Example
44ICS 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.
45ICS 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.


46ICS 334
- Cusrors
CURSOR c_emp IS
SELECT empno, ename, job
FROM emp
WHERE deptno = 20;

7369 Smith Clerk
7566 Jones Manager current row
7788 SCOTT Analyst
7876 Adams Clerk
7906 FORD Analyst
47ICS 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;
/
48ICS 334
- Example
Given a table with first
three columns are
composite keys. Write
a PL/SQL program
using cursor to update
cat_template1 with
LONG column
cat_template.
Assuming this tables
contains more than
40,000 records.
49ICS 334
- Examples solution
50ICS 334
Dynamic SQL
begin
execute immediate 'create table tt(id number(3))';
end;
/

Вам также может понравиться