Programming in postgreSQL with PL/pgSQL ProceduralLanguageextension topostgreSQL.

Slides:



Advertisements
Similar presentations
PL/SQL.
Advertisements

BD05/06 PL/SQL  Introduction  Structure of a block  Variables and types  Accessing the database  Control flow  Cursors  Exceptions  Procedures.
AN INTRODUCTION TO PL/SQL Mehdi Azarmi 1. Introduction PL/SQL is Oracle's procedural language extension to SQL, the non-procedural relational database.
PL/SQL. Introduction to PL/SQL PL/SQL is the procedure extension to Oracle SQL. It is used to access an Oracle database from various environments (e.g.
Database Management System Module 3:. Complex Constraints In this we specify complex integrity constraints included in SQL. It relates to integrity constraints.
SQL Constraints and Triggers
Triggers The different types of integrity constraints discussed so far provide a declarative mechanism to associate “simple” conditions with a table such.
Chapter 4B: More Advanced PL/SQL Programming
Programming in Oracle with PL/SQL ProceduralLanguageExtension toSQL.
Using Oracle PL/SQL PL/SQL stands for Procedural Language/SQL. PL/SQL extends SQL by adding constructs found in procedural languages, resulting in a structural.
1 Triggers. 2 What is a Trigger? A trigger is a PL/SQL block that is automatically called when certain events occur in the database. Triggers can be made.
SQL*plus commit policy We saw in JDBC that we can control the commit policy, and that it is autocommit(true) by default. We can control the policy in SQL*plus.
Programming in Oracle with PL/SQL
1 SQL: Structured Query Language (‘Sequel’) Chapter 5 (cont.)
PL/SQL Introduction Database 1. Practice. Sample Database The schema of the sample database is the following: Drinkers (name, occupation, birthday, salary)
Cursors in Pl/SQL Database 1. Practice. Sample Database The schema of the sample database is the following: Drinkers (name, occupation, birthday, salary)
Introduction to PL/SQL. Procedural Language extension for SQL Oracle Proprietary 3GL Capabilities Integration of SQL Portable within Oracle data bases.
Programming in Oracle with PL/SQL ProceduralLanguageExtension toSQL.
PL / SQL P rocedural L anguage / S tructured Q uery L anguage Chapter 7 in Lab Reference.
SQL Training Procedures & Functions. Confidential & Proprietary Copyright © 2009 Cardinal Directions, Inc. DB Procedures & Functions Procedures and Functions.
Cursor and Exception Handling By Nidhi Bhatnagar.
Lecture 4 PL/SQL language. PL/SQL – procedural SQL Allows combining procedural and SQL code PL/SQL code is compiled, including SQL commands PL/SQL code.
Overview · What is PL/SQL · Advantages of PL/SQL · Basic Structure of a PL/SQL Block · Procedure · Function · Anonymous Block · Types of Block · Declaring.
Advanced SQL: Cursors & Stored Procedures
Stored Procedures Week 9. Test Details Stored Procedures SQL can call code written in iSeries High Level Languages –Called stored procedures SQL has.
CS178 Database Management PL/SQL session 8 References: ORACLE 9i PROGRAMMING A Primer Rajshekhar Sunderraman.
Хранимые процедуры PL/plPgSQL. Общий вид [ DECLARE declarations ] BEGIN statements END.
Constraints, Triggers and Views COMSATS INSTITUTE OF INFORMATION TECHNOLOGY, VEHARI.
Programmatic SQL Shaista Khan CS 157B. Topic Embedded SQL statements in high-level programming languages.
CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.
PL/SQL Block Structure DECLARE - Optional Variables, cursors, user-defined exceptions BEGIN - Mandatory SQL Statements PL/SQL Statements EXCEPTIONS - Optional.
Trigger Oracle PL/SQL. Triggers Associated with a particular table Associated with a particular table Automatically executed when a particular event occurs.
PL/SQL. Introduction to PL/SQL block Declare declarations Begin executable statement Exception exception handlers End;
Fall 2001Database Systems1 Triggers Assertions –Assertions describe rules that should hold for a given database. –An assertion is checked anytime a table.
Advanced SQL: Triggers & Assertions
Objectives Database triggers and syntax
PL/SQLPL/SQL Oracle10g Developer: PL/SQL Programming Chapter 9 Database Triggers.
Using Partial Indexes with PostgreSQL By Lloyd Albin 4/3/2012.
INSERT BOOK COVER 1Copyright © 2012 Pearson Education, Inc. Publishing as Prentice Hall. Exploring Getting Started with VBA for Microsoft Office 2010 by.
PL/SQLPL/SQL Oracle11g: PL/SQL Programming Chapter 9 Database Triggers.
PL/SQLPL/SQL Oracle10g Developer: PL/SQL Programming Chapter 9 Database Triggers.
Professor: Dr. Shu-Ching Chen TA: Hsin-Yu Ha Stored Procedure used in PosgreSQL.
Professor: Dr. Shu-Ching Chen TA: Hsin-Yu Ha Function, Trigger used in PosgreSQL.
Professor: Dr. Shu-Ching Chen TA: Hsin-Yu Ha Views, Sequence, and Stored Procedure used in PosgreSQL.
1 SQL: Structured Query Language Chapter 5 (cont.)  Constraints  Triggers.
Assertions and Triggers in SQL
Chapter 8 Advanced SQL Pearson Education © Chapter 8 - Objectives How to use the SQL programming language How to use SQL cursors How to create stored.
Advanced SQL: Cursors & Stored Procedures Instructor: Mohamed Eltabakh 1.
Kingdom of Saudi Arabia Ministry of Higher Education Al-Imam Muhammad Ibn Saud Islamic University College of Computer and Information Sciences Overview.
Introduction to PL/SQL N. Dimililer. About PL/SQL –PL/SQL is an extension to SQL with design features of programming languages. –Data manipulation and.
Programming in postgreSQL with PL/pgSQL ProceduralLanguageextension topostgreSQL 1.
CS422 Principles of Database Systems Stored Procedures and Triggers Chengyu Sun California State University, Los Angeles.
1. Advanced SQL Functions Procedural Constructs Triggers.
Programming in postgreSQL with PL/pgSQL
Programming in postgreSQL with PL/pgSQL
PL/pgSQL
Programming in Oracle with PL/SQL
PostgreSQL Conference East 2009
Handling Exceptions.
Stored Procedure used in PosgreSQL
CS4222 Principles of Database System
Stored Procedure used in PosgreSQL
Stored Procedure used in PosgreSQL
CS4222 Principles of Database System
Advanced SQL: Views & Triggers
Instructor: Mohamed Eltabakh
Instructor: Mohamed Eltabakh
Stored Procedure used in PosgreSQL
Oracle9i Developer: PL/SQL Programming Chapter 8 Database Triggers.
Prof. Arfaoui. COM390 Chapter 9
Presentation transcript:

Programming in postgreSQL with PL/pgSQL ProceduralLanguageextension topostgreSQL

Consider the relation Point(X,Y) Q: How would you query the coordinates of all points situated on the curve y=x 2 +3x+5 ? A: Select x,y from point where y=x*x+3*x+5 Q: How would you query the coordinates of all pairs of points with a distance> 5 ? A: select p1.x, p1.y, p2.x, p2.y from point p1, point p2 where (p1.y-p2.y)*(p1.y-p2.y)+(p1.x-p2.x)*(p1.x- p2.x)>25

Consider the relation Point(X,Y) Q: Suppose you have another relation, called edge(point1, point2). How would you query the coordinates of all points in the shortest path from (3,7) to (32,77)? A: With standard SQL, you cannot..

PL/pgSQL Allows using general programming tools with SQL, for example: loops, conditions, functions, etc. This allows a lot more freedom than general SQL We write PL/pgSQL code in a regular file, for example firstPl.sql, and load it with \i in the psql console.

PL/pgSQL Blocks PL/pgSQL code is built of Blocks, with a unique structure: LABEL DECLARE (optional) /* Variable declaration*/ BEGIN (mandatory) /* Executable statements (what the block DOES!)*/ EXCEPTION (optional) /* Exception handling*/ END; (mandatory) LABEL

Labeling a function: And at the end of the function: Example: Create [or replace] function funcName(varName1 varType1,varName2 varType2,…) Returns returnVarType AS $$ $$ language plpgsql; Create or replace function myMultiplication(var1 integer, var2 integer) returns integer as $$ BEGIN return var1*var2; END; $$ language plpgsql

Alternatively, the return value and type can be declared as function parameters: This allows returning more than one value without defining a record Create [or replace] function funcName(varName1 varType1,varName2 varType2,…,out retVarName retvarType) AS $$ Create or replace function myAddition(var1 integer, var2 integer, out addRes integer) returns integer as $$ BEGIN addRes:=var1+var2; END; $$ language plpgsql Example:

Declare The general syntax of a variable declaration is: name [CONSTANT] type [ NOT NULL] [DEFAULT := expression] Examples: user_id integer; quantity numeric(5); url varchar(20); myrow tablename%ROWTYPE;

Example Create or replace function addTax(price real, OUT res1 real) as $$ begin res1:= price*1.155; end; $$ language plpgsql; first.sql: In the psql console write: \i first.sql Then you can use the function: Insert into pricesTable values(addTax(20)); or Select (addTax(20));

Declaring Variables with the %TYPE Attribute Examples DECLARE snameSailors.sname%TYPE; fav_boatVARCHAR(30); my_fav_boatfav_boat%TYPE := 'Pinta';... Accessing column sname in table Sailors Accessing a variable

Declaring Variables with the %ROWTYPE Attribute Declare a variable with the type of a ROW of a table. And how do we access the fields in reserves_record? reserves_record Reserves%ROWTYPE; reserves_record.sid=9; Reserver_record.bid=877; Accessing table Reserves

Select into If select returns more than one result, the first row will be taken, or nulls if no rows were returned Notice that unless ‘Order by’ was specified, the first row is not well defined Create or replace function mySp(var1 integer) returns integer as $$ declare sp_var sportsman%rowtype; BEGIN select * into sp_var from sportsman; return sp_var.age*var1; END; $$ language plpgsql

Select into strict In this case, if more or less than one row is returned, a run-time error will occur Create or replace function mySp(var1 integer) returns integer as $$ declare sp_var sportsman%rowtype; BEGIN select * into strict sp_var from sportsman; return sp_var.age*var1; END; $$ language plpgsql

Record A record is similar to row-type, but we don’t have to predefine its structure DECLARE varRecord record; BEGIN select * into varRecord from students; DECLARE varRecord record; BEGIN select * into varRecord from students;

select myMult(ms.*) from multipliers ms where ms.mult>100 order by mult asc; What does this return? The multiplication of the smallest mult which is larger than 100 by the age of the oldest sportsman whose age is less than 30 CREATE or replace FUNCTION myMult(t2_row multipliers) RETURNS real AS $$ declare t_row sportsman%rowtype; BEGIN SELECT * INTO t_row FROM sportsman WHERE age<30 order by age desc; RETURN t_row.age*t2_row.mult; END; $$ LANGUAGE plpgsql;

Checking if a row was returned Declare myVar sportsman%rowtype; Begin Select * into myVar from sportsman where age=4; If not found then…

Conditioning IF boolean-expression THEN statements END IF; … IF v_age > 22 THEN UPDATE sportsman SET salary = salary+1000 WHERE sid = v_sid; END IF; …

Conditioning 2 IF boolean-expression THEN statements ELSE statements END IF;

Conditioning 3 IF boolean-expression THEN statements ELSIF boolean-expression THEN statements ELSIF boolean-expression THEN statements … ELSE statements END IF;

Example Select assessRate(6.7); CREATE or replace FUNCTION assessRate(rating real) RETURNS text AS $$ BEGIN if rating>9 then return 'great'; elsif rating>7 then return 'good'; elsif rating>5 then return 'keep on working'; elsif rating>3 then return 'work harder!'; else return 'you can stop working'; end if; END; $$ LANGUAGE plpgsql;

Suppose we have the following table: Want to keep track of how many times users have run a PL/SQL block When the block is run, if user is already in table, increment num_run. Otherwise, insert user into table create table mylog( who text, num_run integer ); num_run who 3Peter 4John 2Moshe mylog

Solution CREATE FUNCTION updateLogged() RETURNS void AS $$ DECLARE cnt integer; BEGIN Select count(*) into cnt from mylog where who=user; If cnt>0 then update mylog set num_run = num_run + 1 where who = user; else insert into mylog values(user, 1); end if; end; $$ LANGUAGE plpgsql;

Simple loop LOOP statements END LOOP; Terminated by Exit or return Exit: only causes termination of the loop Can be specified with a condition: Exit when …

Examples LOOP -- some computations IF count > 0 THEN EXIT; END IF; END LOOP; LOOP -- some computations EXIT WHEN count > 0; END LOOP; BEGIN -- some computations IF stocks > THEN EXIT; END IF; END;

Continue The next iteration of the loop is begun Create or replace function myTest(var1 integer) returns integer as $$ DECLARE i integer; BEGIN i:=1 loop exit when i>var1 i=i+1 continue when i<20 raise notice 'num is %',i end loop return i*var1 END $$ language plpgsql What does this print for select myTest(30)? 20…31

While loop WHILE expression LOOP --statements END LOOP; WHILE money_amount > 0 AND happiness<9 LOOP -- buy more END LOOP;

For loop FOR var IN [ REVERSE ] stRange..endRange [ BY jumps ] LOOP statements END LOOP; FOR i IN LOOP RAISE NOTICE 'i is %', i; END LOOP; FOR i IN REVERSE LOOP -- some computations here END LOOP; FOR i IN REVERSE BY 2 LOOP RAISE NOTICE 'i is %', i; END LOOP;

Looping Through Query Results FOR target IN query LOOP statements END LOOP; CREATE or replace FUNCTION assessRates() RETURNS void AS $$ DECLARE i record; BEGIN for i in select rating from ratings order by rating loop if i.rating>9 then raise notice 'great'; elsif i.rating>7 then raise notice 'good'; elsif i.rating>5 then raise notice 'keep on working'; elsif i.rating>3 then raise notice 'work harder!'; else raise notice 'you can stop working'; end if; end loop; END; $$ LANGUAGE plpgsql;

Trapping exceptions DECLARE declarations BEGIN statements EXCEPTION WHEN condition [ OR condition... ] THEN handler_statements... END;

Create or replace function errors(val integer) returns real as $$ Declare val2 real; BEGIN val2:=val/(val-1); return val2; Exception when division_by_zero then raise notice 'caught a zero division'; return val2; End; $$ LANGUAGE plpgsql;

Errors and messages RAISE DEBUG RAISE LOG RAISE INFO RAISE NOTICE RAISE WARNING RAISE EXCEPTION.

Triggers A trigger defines an action we want to take place whenever some event has occurred. Can execute before or after the triggering event A triggering event can be an insert, update or delete The trigger can be defined to run once per changed row or once per statement The trigger function can be written in PL/pgSQL The function must not take arguments and returns type trigger First we create a trigger function and then create the trigger using create trigger

Triggers- cont. Row-level before triggers are usually used to modify or check the data that is changing Row-level after triggers are usually used to propagate the effect of the changes to other tables Pay attention to recursive trigger firing

CREATE TRIGGER name { BEFORE | AFTER } { event [ OR... ] } ON table [ FOR EACH ROW |STATEMENT ] EXECUTE PROCEDURE funcname ( arguments ) Create trigger CREATE TRIGGER emp_trig BEFORE INSERT OR UPDATE ON employee FOR EACH ROW EXECUTE PROCEDURE emp_trig_func() ;

Writing a trigger function When a trigger is fired, several variables are automatically created: New Old TG_OP …

CREATE FUNCTION toUpper() RETURNS trigger AS $$ BEGIN new.sname := UPPER(new.sname); END; $$ LANGUAGE plpgsql; CREATE TRIGGER toUpperTrig BEFORE INSERT or UPDATE on sportsman FOR EACH ROW execute procedure toUpper();

CREATE TABLE emp (empname text, salary integer, last_date timestamp, last_user text );

CREATE FUNCTION emp_stamp() RETURNS trigger AS $$ BEGIN -- Check that empname and salary are given IF NEW.empname IS NULL THEN RAISE EXCEPTION 'empname cannot be null'; END IF; IF NEW.salary IS NULL THEN RAISE EXCEPTION '% cannot have null salary', NEW.empname; END IF; IF NEW.salary < 0 THEN RAISE EXCEPTION '% cannot have a negative salary', NEW.empname; END IF; NEW.last_date := current_timestamp; NEW.last_user := current_user; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp FOR EACH ROW EXECUTE PROCEDURE emp_stamp() ;

CREATE TABLE emp ( empname text NOT NULL, salary integer ); CREATE TABLE emp_backup( operation char(1) NOT NULL, stamp timestamp NOT NULL, userid text NOT NULL, empname text NOT NULL, salary integer );

CREATE OR REPLACE FUNCTION process_emp_backup() RETURNS TRIGGER AS $$ BEGIN IF (TG_OP = 'DELETE') THEN INSERT INTO emp_backup SELECT 'D', now(), user, OLD.*; RETURN OLD; ELSIF (TG_OP = 'UPDATE') THEN INSERT INTO emp_backup SELECT 'U', now(), user, NEW.*; RETURN NEW; ELSIF (TG_OP = 'INSERT') THEN INSERT INTO emp_backup SELECT 'I', now(), user, NEW.*; RETURN NEW; END IF; RETURN NULL; END; $$ LANGUAGE plpgsql;

CREATE TRIGGER emp_backup AFTER INSERT OR UPDATE OR DELETE ON emp FOR EACH ROW EXECUTE PROCEDURE process_emp_backup() ;

Statement Trigger CREATE FUNCTION shabbat_trig_func() RETURNS trigger AS $$ BEGIN if (TO_CHAR(current_date,'DY')='SAT') then raise exception ‘no work on shabbat!’; end if; Return; END; $$ LANGUAGE plpgsql; CREATE TRIGGER no_work_on_shabbat_trig BEFORE INSERT or DELETE or UPDATE on sportsman for each statement execute procedure shabbat_trig_func();