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

PL/SQL (Embedded SQL)

Introduction Benefits Basic Constructs Anonymous blocks Procedures Functions Packages Triggers Cursors Dynamic SQL
1ICS 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

2ICS 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.

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 END; /
DBMS_OUTPUT.PUT_LINE('This is my fist program');

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

6ICS 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;

7ICS 334

--- Basic Structure: Example


DECLARE v_id

INTEGER;

BEGIN v_id := 1234567; DELETE FROM EMP WHERE id = v_id; END; /


8ICS 334

-- Running a Program
DECLARE
BEGIN

EXCEPTION END;

/
9ICS 334

-- Variables

Common Data Types


NUMBER DATE INTEGER VARCHAR2 CHAR BOOLEAN


V_salary V_id V_dob V_name V_gender V_salary NUMBER(9,2); INTEGER; DATE; VARCHAR2(35); CHAR; emp.salary%TYPE;

Declaration

10ICS 334

-- SELECT INTO
DECLARE v_job v_sal v_empno BEGIN v_empno := 1234567; SELECT job, sal INTO v_job,v_sal FROM emp WHERE empno = v_empno; END; / emp.job%TYPE; emp.sal%TYPE; emp.empno%TYPE;

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

--- IF ELSE END IF


DECLARE BEGIN

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

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

17ICS 334

-- LOOPs

LOOP EXIT WHEN END LOOP FOR LOOP END LOOP WHILE LOOP END LOOP

18ICS 334

--- LOOP EXIT WHEN END LOOP


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

BEGIN

END; /

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;

19ICS 334

--- FOR LOOP - END LOOP


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

BEGIN

END; /

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

20ICS 334

--- WHILE LOOP - END LOOP


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

BEGIN

END; /

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

21ICS 334

- OUTPUT
SET SERVEROUTPUT ON; DECLARE v_sum_sal v_deptno 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; / emp.sal%TYPE; emp.deptno%TYPE := 10;

22ICS 334

- Anonymous Block
DECLARE v_id 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;

INTEGER;

23ICS 334

-- Nesting Anonymous Blocks

24ICS 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)

25ICS 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)

26ICS 334

-- Creating or Replacing a Procedure


CREATE OR REPLACE PROCEDURE pname( BEGIN ) IS

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 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; / EMP.job%TYPE; EMP.sal%TYPE;

SQL> Show errors SQL> execute proc_test(5893);

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> create or replace procedure test_proc is v_id INTEGER; v_empno emp.empno%TYPE; BEGIN v_id := 1234567; select empno into v_empno FROM EMP WHERE empno = v_id; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('No record exists'); END; /

Procedure created. SQL> exec test_proc No record exists PL/SQL procedure successfully completed. SQL> show errors (to see errors for procedures, functions)

30ICS 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

31ICS 334

-- Creating or Replacing a Function


CREATE OR REPLACE FUNCTION fname( RETURN datatype IS BEGIN )

EXECPTION END; /
32ICS 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; /
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

Example, passing parameters

35ICS 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
36ICS 334

- Packages

Package

Package Specification Package Body

Invoking Package subprogram

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

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

-- 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(,)

40ICS 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
41ICS 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; /

42ICS 334

-- Trigger with function usage Example

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 Jones SCOTT Adams FORD Clerk Manager Analyst Clerk 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

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.
48ICS 334

- Examples solution

49ICS 334

Dynamic SQL
begin execute immediate 'create table tt(id number(3))'; end; /

50ICS 334