Professional Documents
Culture Documents
PLSQLPPT 2263
PLSQLPPT 2263
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)
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
7ICS 334
INTEGER;
-- Running a Program
DECLARE
BEGIN
EXCEPTION END;
/
9ICS 334
-- Variables
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
14ICS 334
--- IF END IF
DECLARE BEGIN v_commison := 7500; IF v_dept = 10 THEN v_commision := 5000; END IF; END; /
15ICS 334
IF v_dept = 10 THEN v_commision := 5000; ELSE v_commision := 7500; END IF; END; /
16ICS 334
17ICS 334
-- LOOPs
LOOP EXIT WHEN END LOOP FOR LOOP END LOOP WHILE LOOP END LOOP
18ICS 334
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
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
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
24ICS 334
Exceptions
Examples are NO_DATA_FOUND OTHERS
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
EXCEPTION
END; /
27ICS 334
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
EXECPTION END; /
32ICS 334
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
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
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
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
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 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