Database programming 20/08/2015. DBprog news. Outline. Motivation for DB programming. Using SQL queries in a program. Using SQL queries in a program



Similar documents
Handling Exceptions. Schedule: Timing Topic. 45 minutes Lecture 20 minutes Practice 65 minutes Total

Handling Exceptions. Copyright 2006, Oracle. All rights reserved. Oracle Database 10g: PL/SQL Fundamentals 8-1

Oracle For Beginners Page : 1

STUDY OF PL/SQL BLOCK AIM: To Study about PL/SQL block.

DECLARATION SECTION. BODY STATEMENTS... Required

Handling Exceptions. Schedule: Timing Topic 45 minutes Lecture 20 minutes Practice 65 minutes Total

SQL/PSM. Outline. Database Application Development Oracle PL/SQL. Why Stored Procedures? Stored Procedures PL/SQL. Embedded SQL Dynamic SQL

Handling PL/SQL Errors

When an exception occur a message which explains its cause is received. PL/SQL Exception message consists of three parts.

COMS20700 DATABASES 13 PL/SQL. COMS20700 Databases Dr. Essam Ghadafi

Training Guide. PL/SQL for Beginners. Workbook

ORACLE 9I / 10G / 11G / PL/SQL COURSE CONTENT

14 Triggers / Embedded SQL

Handling PL/SQL Errors

Darshan Institute of Engineering & Technology PL_SQL

Oracle PL/SQL Best Practices

How To Name A Program In Apl/Sql

Database Programming with PL/SQL: Learning Objectives

Handling Exceptions. Copyright 2008, Oracle. All rights reserved.

Review your answers, feedback, and question scores below. An asterisk (*) indicates a correct answer.

Review your answers, feedback, and question scores below. An asterisk (*) indicates a correct answer.

Overview of PL/SQL. About PL/SQL

Oracle Database: Program with PL/SQL

PL/SQL Overview. Basic Structure and Syntax of PL/SQL

PL/SQL (Cont d) Let s start with the mail_order database, shown here:

Persistent Stored Modules (Stored Procedures) : PSM

Oracle Database: Program with PL/SQL

Oracle Database: Program with PL/SQL

Programming Database lectures for mathema

An Introduction to PL/SQL. Mehdi Azarmi

Oracle Database: Program with PL/SQL

Oracle PL/SQL Language. CIS 331: Introduction to Database Systems

Writing Control Structures

Oracle Database: SQL and PL/SQL Fundamentals

Oracle Database: Program with PL/SQL

Oracle Database: SQL and PL/SQL Fundamentals

Triggers & Packages. {INSERT [OR] UPDATE [OR] DELETE}: This specifies the DML operation.

Procedural Extension to SQL using Triggers. SS Chung

Oracle Database: SQL and PL/SQL Fundamentals NEW

Elena Baralis, Silvia Chiusano Politecnico di Torino. Pag. 1. Active database systems. Triggers. Triggers. Active database systems.

Topics Advanced PL/SQL, Integration with PROIV SuperLayer and use within Glovia

Oracle Database: Develop PL/SQL Program Units

More SQL: Assertions, Views, and Programming Techniques

Oracle For Beginners Page : 1

Introduction to PL/SQL Programming

1 Stored Procedures in PL/SQL 2 PL/SQL. 2.1 Variables. 2.2 PL/SQL Program Blocks

Error Management in Oracle PL/SQL

SQL - QUICK GUIDE. Allows users to access data in relational database management systems.

Chapter 8: Introduction to PL/SQL 1

Creating PL/SQL Blocks. Copyright 2007, Oracle. All rights reserved.

Chapter 9, More SQL: Assertions, Views, and Programming Techniques

Oracle For Beginners Page : 1

Intro to Embedded SQL Programming for ILE RPG Developers

Oracle PL/SQL Injection

PL/SQL MOCK TEST PL/SQL MOCK TEST I

12 Embedding SQL in Programming languages


SQL Programming. CS145 Lecture Notes #10. Motivation. Oracle PL/SQL. Basics. Example schema:

Oracle Database 10g: Program with PL/SQL

Programming in postgresql with PL/pgSQL. Procedural Language extension to postgresql

What is a database? COSC 304 Introduction to Database Systems. Database Introduction. Example Problem. Databases in the Real-World

Physical File. Collection or Schema

1 Triggers. 2 PL/SQL Triggers

SQL Server Database Coding Standards and Guidelines

PL/SQL Programming Concepts: Review. Copyright 2004, Oracle. All rights reserved.

12 Embedding SQL in Programming languages

Chapter 39. PL/pgSQL - SQL Procedural Language

Answers to the Try It Yourself Sections

Why programming extensions? to program complex update transactions. where referential integrity is not addressed by data definition

5.1 Database Schema Schema Generation in SQL

Oracle to MySQL Migration

PL/SQL. Database Procedural Programming PL/SQL and Embedded SQL. Procedures and Functions

VARRAY AND NESTED TABLE

PL/SQL: Introduction. Overview. Anonymous Blocks and Basic Language Features

Course Objectives. Database Applications. External applications. Course Objectives Interfacing. Mixing two worlds. Two approaches

Oracle 11g PL/SQL training

Oracle Database: SQL and PL/SQL Fundamentals NEW

Embedded SQL. Unit 5.1. Dr Gordon Russell, Napier University

Embedded SQL programming

CS 377 Database Systems SQL Programming. Li Xiong Department of Mathematics and Computer Science Emory University

Embedding SQL in High Level Language Programs

Oracle Database 11g: Program with PL/SQL

Database Programming. Week *Some of the slides in this lecture are created by Prof. Ian Horrocks from University of Oxford

Duration Vendor Audience 5 Days Oracle End Users, Developers, Technical Consultants and Support Staff

Hacking and Protecting Oracle DB. Slavik Markovich CTO, Sentrigo

Introduction to Oracle PL/SQL Programming V2.1 - Lessons 11-End

9 Using Triggers. Using Triggers 9-1

Using SQL in RPG Programs: An Introduction

Chapter 9 Java and SQL. Wang Yang wyang@njnet.edu.cn

Duration Vendor Audience 5 Days Oracle Developers, Technical Consultants, Database Administrators and System Analysts

RDBMS Using Oracle. Lecture Week 7 Introduction to Oracle 9i SQL Last Lecture. kamran.munir@gmail.com. Joining Tables

Oracle 10g PL/SQL Training

CSC 443 Database Management Systems. The SQL Programming Language

An Oracle White Paper June RESTful Web Services for the Oracle Database Cloud - Multitenant Edition

A Brief Introduction to MySQL

1 File Processing Systems

PROCEDURES, FUNCTIONS AND PACKAGES

Oracle Database 11g Express Edition PL/SQL and Database Administration Concepts -II

Oracle Internal & Oracle Academy

Transcription:

DBprog news Database programming http://eric.univ-lyon2.fr/~jdarmont/?page_id=451 M1 Informatique Year 2015-2016 Jérôme Darmont http://eric.univ-lyon2.fr/~jdarmont/ http://eric.univ-lyon2.fr/~jdarmont/?feed=rss2 https://twitter.com/darmont_lyon2 hashtag #dbprog Database programming http://eric.univ-lyon2.fr/~jdarmont/ 1 Motivation for DB programming SQL: query language for relational databases Standard Query optimizers available Low-level Programming is needed for: Complex tasks User interfaces Database programming http://eric.univ-lyon2.fr/~jdarmont/ 2 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 3 Using SQL queries in a program Embedded SQL: SQL queries are incorporated in the source code of a programming language (PL/SQL, T-SQL, PL/pgSQL, Pro*C ). Application programming interfaces: SQL queries are allowed by a set of functions of the programming language (Java Persistence API, PHP Data Objects ). Call level interfaces: middleware between programming language and DBMS (ODBC, JDBC, ADO ) Using SQL queries in a program Embedded SQL APIs Call level interfaces Stored procedures Our choice of programming language : Oracle PL/SQL Unique principle: cursors Stored procedures: SQL functions stored in database and executed by the DBMS (written in PL/SQL, T-SQL, PL/pgSQL) Database programming http://eric.univ-lyon2.fr/~jdarmont/ 4 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 5 1

PL/SQL features PL/SQL features 4 th generation procedural language Extension of SQL Declaration of variables and constants (collections, records, objects) Modularity (subprograms, packages) Run-time error management (exceptions) Tight interaction with Oracle/SQL (same data types) Support of SQL, including dynamic SQL Support of object-oriented programming Performance (batch processes) Productivity (uniformity of all tools) Portability (on all Oracle systems) Security (stored procedures, triggers) Database programming http://eric.univ-lyon2.fr/~jdarmont/ 6 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 7 Oracle architecture PL/SQL engine Software engineering SQL Developer SQL Oracle server Network Third party software PL/SQL Administration Oracle Database PL/SQL User s Guide and Reference Database programming http://eric.univ-lyon2.fr/~jdarmont/ 8 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 9 Types of PL/SQL blocks PL/SQL block structure Anonymous block Stored out of the database (file) Compiled and executed on-the-fly AB [ -- Types, constants and variables] Stored procedure Separately compiled Permanently stored in the database Trigger Stored procedure associated with a given table Automatic execution when an event occurs SP DB Trg -- PL/SQL statements [EXCEPTION -- Error management] Database programming http://eric.univ-lyon2.fr/~jdarmont/ 10 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 11 2

Variables & constants Declaration in PL/SQL block section Variables ex. birth_date DATE; counter INTEGER := 0; -- Initialization counter2 INTEGER DEFAULT 0; -- Default value id CHAR(5) NOT NULL := AP001 ; Constants ex. vat CONSTANT REAL := 0.2; Database programming http://eric.univ-lyon2.fr/~jdarmont/ 12 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 13 Data types Referencing an existing type Type of another variable ex. credit REAL; debit credit%type; Type of a table attribute ex. emp_num EMP.EMPNO%TYPE; Type of a table tuple (row) ex. my_student STUDENT%ROWTYPE; Oracle Database PL/SQL User s Guide and Reference Database programming http://eric.univ-lyon2.fr/~jdarmont/ 14 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 15 Affectation operators Simple affectation ex. n := 0; n := n + 1; Value(s) from a database ex. SELECT custname INTO name FROM customer WHERE custnum = 10; SELECT ename, sal INTO name, salary FROM emp WHERE empno = 5000; Database programming http://eric.univ-lyon2.fr/~jdarmont/ 16 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 17 3

Expressions and comparisons Control structures: Selection Arithmetic operators: + - / * ** Concatenation operator: Comparison operators = < > <= >= <> IS NULL, LIKE, BETWEEN, IN Logical operators: AND, OR, NOT IF-THEN, IF-THEN-ELSE or IF-THEN-ELSIF IF condition1 THEN [ELSIF condition2 THEN ] [ELSE ] Database programming http://eric.univ-lyon2.fr/~jdarmont/ 18 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 19 Control structures: Iteration For loop FOR iterator IN [REVERSE] min..max LOOP END LOOP; While loop WHILE condition LOOP END LOOP; Repeat until loop LOOP EXIT WHEN condition; END LOOP; Database programming http://eric.univ-lyon2.fr/~jdarmont/ 20 Screen output DBMS_OUTPUT.PUT('string'); /* No CR */ DBMS_OUTPUT.PUT_LINE('string'); /* With CR */ DBMS_OUTPUT.PUT('Hello'); DBMS_OUTPUT.PUT_LINE('name=' name); DBMS_OUTPUT.PUT_LINE('num=' TO_CHAR(num)); DBMS_OUTPUT.PUT_LINE('num=' num); NB: To make screen output work, environment variable SERVEROUTPUT must be set to ON. SET SERVEROUTPUT ON under SQL Developer In case of overflow, the size of the display buffer must be increased. Ex. DBMS_OUTPUT.ENABLE(10000); Database programming http://eric.univ-lyon2.fr/~jdarmont/ 21 Sample anonymous block -- Computation of tax-included price vat CONSTANT REAL := 0.2; price product.rawprice%type; -- Affectation SELECT rawprice INTO price FROM product WHERE prodcode = Pr345blue'; -- Add in VAT price := price * (1 + vat); -- Screen output DBMS_OUTPUT.PUT_LINE(price ' euros'); Database programming http://eric.univ-lyon2.fr/~jdarmont/ 22 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 23 4

Collections Declaring and using collections Definition: Ordered set of elements of identical type. Each element bears an index that determines its position in the collection. Two types of collections: Array (VARRAY): bounded size, dense Table (TABLE): extensible, non-dense 1. Declare a type collection ex. TYPE TableChar IS TABLE OF VARCHAR(20); TYPE ArrayInt IS VARRAY(10) OF INTEGER; 2. Declare a variable of that type & initialize it ex. my_table TableChar := TableChar('Aa', 'Bb', 'Cc'); my_array ArrayInt := ArrayInt(); Oracle Database PL/SQL User s Guide and Reference NB: A collection may be initialized empty. It is not mandatory to initialize all elements of an array. Database programming http://eric.univ-lyon2.fr/~jdarmont/ 24 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 25 Collection affectation Collection manipulation Whole collections ex. TYPE T1 IS TABLE OF INT; TYPE T2 IS TABLE OF INT; et11 T1 := T1(1, 2, 3, 4); et12 T1 := T1(5, 6); et2 T2 := T2(); et12 := et11; -- Legal et2 := et11; -- Illegal Collection elements ex. et11(1) := 10; Set of predefined methods ( procedures) Usage: col_name.method_name[(parameters)] EXISTS(i) returns TRUE if the i th element exists in the collection. COUNT returns the number of elements in the collection. LIMIT returns the maximum size of the collection (NULL for tables). EXTEND(n) increases collection size by n elements. EXTEND is equivalent to EXTEND(1). Database programming http://eric.univ-lyon2.fr/~jdarmont/ 26 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 27 Collection manipulation Sample collection manipulation block TRIM(n) removes n elements from the end of the collection (collection size decreases accordingly). TRIM is equivalent to TRIM(1). DELETE(i) and DELETE delete the i th element and all elements from the collection, respectively (tables only). FIRST and LAST return the index of the first and last element in the collection, respectively. NB: FIRST = 1 et LAST = COUNT in an array. PRIOR(n) and NEXT(n) return the index of the previous and next element of element of index n, respectively. TYPE IntList IS TABLE OF INTEGER; stack IntList := IntList(); element INTEGER; -- Add on top of stack (push) stack.ext stack(stack.count) := 1; stack.ext stack(stack.count) := 11; -- Delete on top of stack (pop) element := stack(stack.count); -- element = 11 stack.trim; Database programming http://eric.univ-lyon2.fr/~jdarmont/ 28 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 29 5

Records Record affectation Definition: Set of logically related data stored in fields. 1. Declare a type record ex. TYPE Student IS RECORD( student_num INTEGER, name VARCHAR(50), age INTEGER ); 2. Declare a variable of that type ex. a_student Student; Direct reference ex. a_student.student_num := 12212478; a_student.name := 'Toto'; a_student.age := 6; a_student := my_student; -- declared as STUDENT%ROWTYPE Query result ex. SELECT student_number, student_name, student_age INTO a_student FROM STUDENT WHERE student_number = 12212478; Database programming http://eric.univ-lyon2.fr/~jdarmont/ 30 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 31 Definition: Data structure that stores the result of a query returning several tuples (rows). Declaration: CURSOR cursor_name IS SQL_query; ex. CURSOR vat IS SELECT prod_num, price * 1.2 taxinc_price FROM product; NB : A cursor tuple is of type vat%rowtype. Database programming http://eric.univ-lyon2.fr/~jdarmont/ 32 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 33 Cursor usage Cursor usage -- Simple (complete) traversal CURSOR vat IS SELECT prod_num, price * 1.2 taxinc_price FROM product; tuple vat%rowtype; FOR tuple IN vat LOOP DBMS_OUTPUT.PUT_LINE( tuple.prod_num ' : ' tuple.taxinc_price); END LOOP; -- Ad-hoc traversal... OPEN vat; FETCH vat INTO tuple; WHILE vat%found LOOP... FETCH vat INTO tuple; END LOOP; CLOSE vat; -- 1st row -- Next row Database programming http://eric.univ-lyon2.fr/~jdarmont/ 34 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 35 6

Cursor attributes %NOTFOUND equals to FALSE if FETCH returns a result. %FOUND is the logical opposite of %NOTFOUND. %ROWCOUNT returns the number of rows read. %ISOPEN equals to TRUE if cursor is open. Database programming http://eric.univ-lyon2.fr/~jdarmont/ 36 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 37 When a run-time error occurs, an exception id raised (executed). are handled in separate routines. Advantages Systematic error management Grouped management of similar errors Code readability (error management is out of main code) PL/SQL functions for error management SQLCODE: Code of the last raised exception SQLERRM: Associate error message System exceptions Name Error code SQLCODE --------------------------------------------------------------------------------------- CURSOR_ALREADY_OPEN ORA-06511-6511 DUP_VAL_ON_INDEX ORA-00001-1 INVALID_CURSOR ORA-01001-1001 INVALID_NUMBER ORA-01722-1722 LOGIN_DENIED ORA-01017-1017 NO_DATA_FOUND ORA-01403-1403 NOT_LOGGED_ON ORA-01012-1012 PROGRAM_ERROR ORA-06501-6501 STORAGE_ERROR ORA-06500-6500 TIMEOUT_ON_RESOURCE ORA-00051-51 TOO_MANY_ROWS ORA-01422-1422 VALUE_ERROR ORA-06502-6502 ZERO_DIVIDE ORA-01476-1476 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 38 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 39 Personalized exceptions Sample exception Declare exception ( section) exception_name EXCEPTION; Raise (fire) exception ( section) IF condition THEN RAISE exception_name; Handle exception (EXCEPTION section) WHEN exception_name THEN...; c INTEGER; nobody EXCEPTION; SELECT COUNT(*) INTO c FROM EMP; IF c = 0 THEN RAISE nobody; EXCEPTION WHEN nobody THEN RAISE_APPLICATION_ERROR(-20501, Error! ); -- Error code between 20999 and -20001 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 40 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 41 7

Procedures -- Procedure definition PROCEDURE proc_name (param1, param2 ) IS -- Local declarations [EXCEPTION -- Exception handling] Database programming http://eric.univ-lyon2.fr/~jdarmont/ 42 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 43 Functions Declaration and parameterization -- Function definition FUNCTION function_name (param1, param2 ) RETURN return_value_type IS -- Local declarations RETURN return_value; [EXCEPTION -- Exception handling] Declaration: Any subprogram must be defined before being called. definition in the section if a PL/SQL block Parameter definition and mode param_name [IN OUT IN OUT] TYPE ex. result OUT REAL IN: Input (read only / by value) parameter OUT: Output (write only / by reference) parameter IN OUT: Input-output (read-write / by reference) parameter Database programming http://eric.univ-lyon2.fr/~jdarmont/ 44 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 45 Sample procedure Sample (recursive) function PROCEDURE Conversion_FF_Euro (pricef IN REAL, pricee OUT REAL) IS euro CONSTANT REAL := 6.55957; nullprice EXCEPTION; IF pricef IS NOT NULL THEN pricee := pricef / euro; ELSE RAISE nullprice; EXCEPTION WHEN nullprice THEN DBMS_OUTPUT.PUT_LINE('Cannot compute!'); Database programming http://eric.univ-lyon2.fr/~jdarmont/ 46 -- Let s compute n! FUNCTION facto (n INTEGER) RETURN INTEGER IS IF n = 1 THEN -- Stop condition RETURN 1; ELSE -- Recursive call RETURN n * facto(n - 1); Database programming http://eric.univ-lyon2.fr/~jdarmont/ 47 8

Stored procedures Database programming http://eric.univ-lyon2.fr/~jdarmont/ 48 Definition: Precompiled procedures permanently stored in the database Creation CREATE PROCEDURE ProcName (Parameters) AS... ex. CREATE PROCEDURE HelloWorld AS DBMS_OUTPUT.PUT_LINE('Hello World!'); / Execution under SQL Developer in PL/SQL ex. EXECUTE HelloWorld HelloWorld; Suppression ex. DROP PROCEDURE HelloWorld; Database programming http://eric.univ-lyon2.fr/~jdarmont/ 49 Packages Definition: Set of types, cursors, variables et subprograms that are logically related and permanently stored together A package is subdivided into two parts: Specification: interface (public declarations), Package body: private declaration and code. Schema from Oracle 8 documentation (Fig. 8-1) Database programming http://eric.univ-lyon2.fr/~jdarmont/ 50 Packages -- Package specification definition CREATE [OR REPLACE] PACKAGE package_name AS [-- Type definitions] [-- Cursor specifications] [-- Variable declarations] [-- declarations] -- Package body definition (optional) CREATE [OR REPLACE] PACKAGE BODY package_name AS [-- Type definitions] [-- Cursor specifications] [-- Variable declarations] [-- declarations] Database programming http://eric.univ-lyon2.fr/~jdarmont/ 51 Packages -- Sample specifications CREATE OR REPLACE PACKAGE Employees AS TYPE EmpTuple IS RECORD (ename emp.ename%type, salary emp.sal%type); CURSOR desc_salary RETURN EmpTuple; PROCEDURE hire ( empno NUMBER, ename VARCHAR, job VARCHAR, mgr NUMBER, sal NUMBER, comm NUMBER, deptno NUMBER); PROCEDURE fire (emp_id NUMBER); Database programming http://eric.univ-lyon2.fr/~jdarmont/ 52 Packages -- Sample body CREATE OR REPLACE PACKAGE BODY Employees AS CURSOR desc_salary RETURN EmpTuple IS SELECT empno, sal FROM emp ORDER BY sal DESC; PROCEDURE hire (empno NUMBER, ename VARCHAR, job VARCHAR, mgr NUMBER, sal NUMBER, comm NUMBER, deptno NUMBER) IS INSERT INTO emp VALUES (empno, ename, job, mgr, SYSDATE, sal, comm, deptno); PROCEDURE fire (emp_id NUMBER) IS DELETE FROM emp WHERE empno = emp_id; Database programming http://eric.univ-lyon2.fr/~jdarmont/ 53 9

Definition: Stored procedure associated to a given table and automatically fired by events related to actions on the table. complement integrity constraints by allowing to apply complex integrity rules. They are features of active databases. Database programming http://eric.univ-lyon2.fr/~jdarmont/ 54 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 55 Types of triggers Trigger definition Insertion Deletion Update Before #1 #2 #3 After #4 #5 #6 CREATE [OR REPLACE] TRIGGER trig_name BEFORE AFTER INSERT DELETE UPDATE [INSERT] [[OR] DELETE] [[OR] UPDATE] ON table_name [FOR EACH ROW] -- PL/SQL block coding the actions -- to process of a database table Database programming http://eric.univ-lyon2.fr/~jdarmont/ 56 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 57 Trigger definition Specific variables :NEW.attribute_name : Attribute value after update Ex. INSERT INTO CUSTOMER (1, 'NewCust'); :NEW.CustNum takes value 1. :NEW.Name takes value NewCust'. :OLD.attribute_name : Attribute value before update Ex. DELETE FROM CUSTOMER WHERE CustNum = 1; :OLD.CustNum takes value 1. Database programming http://eric.univ-lyon2.fr/~jdarmont/ 58 Sample trigger -- Primary key check on table customer CREATE OR REPLACE TRIGGER customer_pk BEFORE INSERT OR UPDATE ON customer FOR EACH ROW n INTEGER; key_exists EXCEPTION; key_null EXCEPTION; -- Is new key null? IF :NEW.custnum IS NULL THEN RAISE key_null; Database programming http://eric.univ-lyon2.fr/~jdarmont/ 59 10

Sample trigger -- Does new key already exist? SELECT COUNT(custnum) INTO n FROM customer WHERE custnum = :NEW.custnum; IF n > 0 THEN RAISE key_exists; EXCEPTION WHEN key_exists THEN RAISE_APPLICATION_ERROR(-20501, Primary key already used! ); WHEN key_null THEN RAISE_APPLICATION_ERROR(-20502, Primary key must have non-null value! ); Database programming http://eric.univ-lyon2.fr/~jdarmont/ 60 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 61 Static SQL vs. dynamic SQL Dynamic query execution Examples Stored procedure that updates table EMP static SQL (query is known at compilation time) Stored procedure that updates a table whose name is a parameter dynamic SQL (query is not known at compilation time) Definition: Building an SQL query on-the-fly in a PL/SQL block is mandatory for DDL queries that alter database structure (CREATE, DROP, etc.) Execution statement EXECUTE IMMEDIATE query [INTO var1, var2...] [USING [IN OUT IN OUT] param1 [, [IN OUT IN OUT] param2]... ]; Database programming http://eric.univ-lyon2.fr/~jdarmont/ 62 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 63 Sample dynamic queries Sample dynamic queries q VARCHAR(100); my_deptno dept.deptno%type := 50; my_dname dept.dname%type := 'Staff'; my_loc dept.loc%type := 'Lyon'; emp_tuple emp%rowtype; table_name VARCHAR(15) := 'dept'; -- Parameterized query q := 'INSERT INTO dept VALUES (:p1, :p2, :p3)'; EXECUTE IMMEDIATE q USING my_deptno, my_dname, my_loc; -- Result storage q := 'SELECT * FROM emp WHERE empno = :id'; EXECUTE IMMEDIATE q INTO emp_tuple USING 5; -- Without a query variable EXECUTE IMMEDIATE 'DELETE FROM dept WHERE deptno = :n' USING my_deptno; -- Using the concatenation operator EXECUTE IMMEDIATE 'DELETE FROM ' table_name ' WHERE deptno = ' my_deptno; Database programming http://eric.univ-lyon2.fr/~jdarmont/ 64 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 65 11

Dynamic cursors -- Example TYPE DynCurs IS REF CURSOR; -- Type pointer emp_cv DynCurs; -- Dynamic cursor name emp.ename%type; salary emp.sal%type := 10000; OPEN emp_cv FOR -- Open cursor 'SELECT ename, sal FROM emp WHERE sal > ' salary; FETCH emp_cv INTO name, salary; WHILE emp_cv%found LOOP FETCH emp_cv INTO name, salary; END LOOP; CLOSE emp_cv; -- Close cursor Database programming http://eric.univ-lyon2.fr/~jdarmont/ 66 Database programming http://eric.univ-lyon2.fr/~jdarmont/ 67 12