SlideShare ist ein Scribd-Unternehmen logo
1 von 53
Downloaden Sie, um offline zu lesen
programma s verbinden
met gegevensbanken


Katrien Verbert
katrien.verbert@cs.kuleuven.be
inhoud

•  benaderingen voor gegevensbankprogrammeren
•  ingebedde SQL
•  JDBC




                                                2
gebruik van SQL


•  Interactief
   –  opdracht wordt aangeboden en onmiddellijk uitgevoerd



•  Ingebed gebruik
   –  SQL wordt gebruikt in een programma




                                                             3
programmeren met gegevensbanken


 gebruikers         applicaties                    gegevensbanken




          C/C++,	
  Java,	
  PHP,	
  Perl...	
         SQL	
  

                                                                 4
benaderingen

1.  inbedden SQL opdrachten in een programma
   •    SQL opdrachten worden door een precompiler opgezocht
   •    en omgevormd tot functie-aanroepen van de programmeertaal
2.  gebruik van een bibliotheek met functies
   •    die toegang verschaffen tot de gegevensbank
   •    en resultaten beschikbaar stellen aan een programma in een API
3.  een (nieuwe) programmeertaal ontwikkelen
   •    die compatibel is met het gegevensmodel en query taal
   •    vb: PL/SQL van Oracle
SQL/Host Language Interface




                          SQL stmt
 Func6on	
  call	
                                     SQL
                              Table                    Library
 While(…){
                             Cursor                                         DBMS
 }
                       Fetch	
  rows	
  	
                  Impedance	
  
host program           from	
  the	
  cursor	
  	
          mismatch	
  
                                                            problem	
  

                                                                      [Kazuhiro Minami]
Impedance mismatch
•  verschillen tussen gegevensmodel en model van de programmeertaal
   –  CHAR, VARCHAR -- String
   –  INTEGER -- int


•  bindings voor verschillende programmeertalen
   –  definieert overeenkomsten van de attribuuttypes met de types in de programmeertaal
   –  bindt resultaat van query (=verzameling van tuples) aan datastructuur van het
      programma




                                                                                    7
typische interactie client/server model
•  het client programma opent een verbinding met de gegevensbankserver
   –  vereist meestal adres van machine met de server,
   –  en login-naam en paswoord voor gegevensbank
•  Interactie tussen het programma en de gegevensbank:
   –  programma biedt queries, updates,… aan
   –  server levert resultaten van de queries,…
•  Programma sluit de verbinding met de gegevensbank




                                                                    8
INGEBEDDE SQL
ingebedde SQL
•  SQL opdracht kan in een programma ingebed worden
•  een pre-compiler verwerkt de SQL opdrachten vóór de compilatie van
   het programma:
    –  SQL opdrachten worden vervangen door opdrachten (declaraties en
       functie-aanroepen) in de programmeertaal
•  syntaxis verschilt wat naargelang van de programmeertaal




      EXEC	
  SQL	
  <	
  embedded	
  SQL	
  statement	
  >	
  END-­‐EXEC	
  

            EXEC	
  SQL	
  <	
  embedded	
  SQL	
  statement	
  >	
  ;	
  

             #	
  SQL	
  {	
  <	
  embedded	
  SQL	
  statement	
  >	
  }	
  ;	
     10
ingebedde SQL
  –  Connecteren met de gegevensbank:


    CONNECT	
  TO	
  <	
  server	
  name	
  >	
  AS	
  <	
  connec6on	
  name	
  >	
  
    AUTHORIZATION	
  <	
  user	
  account	
  name	
  and	
  password	
  >	
  ;	
  

      •  slechts één connectie kan actief zijn;
      •  wijzigen van de actieve connectie:


    SET	
  CONNECT	
  <	
  connec6on	
  name	
  >	
  ;	
  

  –  Verbinding beëindigen:


    DISCONNECT	
  <	
  connec6on	
  name	
  >	
  ;	
                                 11
Ingebed gebruik van SQL

•  gemeenschappelijke variabelen
   –  SQL opdrachten kunnen verwijzingen naar variabelen uit het
      programma bevatten
   –  dubbele punt (:) als prefix
•  de gemeenschappelijke variabelen moeten
   gedeclareerd worden in een SQL declaratie sectie




                                                                   12
ingebedde SQL
•  Eén tupel ophalen uit een gegevensbank

•  Voorbeelden:
   –  1. Declaratie van variabelen (in C):



  EXEC SQL BEGIN DECLARE SECTION;
  varchar dname[16], fname[16], lname[16],
  char ssn[10], bdate[11], sex[2], minit[2];
  float salary, raise;
  int dno, dnumer;
  int SQLCODE ; char SQLSTATE[6];
  EXEC SQL END DECLARE SECTION;
ingebedde SQL: voorbeeld
   –  Herhaal een aantal maal: lees het ssn van een werknemer en
      schrijf (op de uitvoer) gegevens van die werknemer


loop = 1;
while (loop) {
   prompt(“Enter a social security number: “, ssn);
   EXEC SQL
     select Fname, Minit, Lname, Address, Salary
     into :fname, :minit, :lname, :address, :salary
     from EMPLOYEE
     where SSN = :ssn;
   if (SQLCODE == 0)
        printf(fname, minit, lname, address, salary)
   else printf(“social sec. numb. does not exist: “, ssn);

   prompt(“More s.s.numbers (enter 1 for Yes, 0 for No): “,
           loop) ;
   }
twee aanpakken

                  Host language
                        +
                  Embedded SQL


                  Preprocessor	
  

                  Host language
CLI (Call-level         +
interface)        Function calls


                  Host-­‐language	
  
 SQL library                            Object-code
                  compiler	
  
                                        program
SQLJ
•  SQL commando’s ingebed in Java
   –  SQLJ vertaler zet SQL commando’s om in Java,
   –  commando’s worden uitgevoerd d.m.v. de JDBC interface
   –  JDBC driver moet dus geïnstalleerd worden
•  vereist:
   –  importeren van verscheidene klassen
       •  JDBC en IO klassen
       •  extra klassen
   –  connecteren met de gewenste gegevensbank
       •  getConnection




                                                              16
SQLJ
  –  importeren van de nodige klassen (vb. met Oracle)

import   java.sql.*;
import   java.io.*;
import   sqlj.runtime.*;
import   sqlj.runtime.ref.*;
import   oracle.sqlj.runtime.*;
…
  –  connectie maken

DefaultContext cntxt =
   oracle.getConnection(“<url name>”,
     “<user name>”, “<pasword>”, true);
DefaultContext.setDefaultContext(cntxt);
…
SQLJ

    –  Voorbeeld 1:
        •  lees het ssn van een werknemer en schrijf (op de uitvoer) gegevens van
           die werknemer


ssn = readEntry(“Enter a social security number: “);
try {
    #sql{select Fname, Minit, Lname, Address, Salary
         into :fname, :minit, :lname, :address, :salary
         from EMPLOYEE where Ssn = :ssn};
}   catch (SQLException se) {
    System.out.println(“s.s.number does not exist: “+ ssn);
    return ;
    }

System.out.println(fname + “ “ + minit + “ “ + lname + “ “
                   + “ “ + salary)

                                                                                    18
dname = readEntry(“Enter the department name: “);
try {
    #sql{select Dnumber into :dnumber
         from DEPARTMENT where Dname = :dname};
    }
    catch (SQLException se) {
    System.out.println(“department does not exist:“ + dname);
    return;
    }
System.out.println(“ information for department: “ + dname);

#sql iterator Emp(String ssn, String fname, String minit,
                  String lname, double salary);

Emp e = null;
#sql e = {select ssn, fname, minit, lname, salary
          from EMPLOYEE where Dno = :dnumber};

while (e.next()) {
    System,out.println(e.ssn + “ “ “ e.fname + “ “ +
             e.minit + “ “ + e.lname + “ “ + e.salary);
    } ;
e.close();
JDBC
JDBC

•  Call function interface voor toegang vanuit Java
•  SQL statements worden dynamisch aangemaakt en
   doorgegeven als string
•  Gebruikt API voor toegang tot DBMS




                                                      21
twee aanpakken

              Host language
                    +
              Embedded SQL


              Preprocessor	
  

              Host language
      JDBC          +
              Function calls


              Host-­‐language	
  
SQL library                         Object-code
              compiler	
  
                                    program
JDBC
•  gestandaardiseerde API (Application Programming Interface)
   –  geregistreerde naam door Sun Microsystems
   –  Zou niet staan voor ‘Java DataBase Connectivity’


•  JDBC driver = een implementatie van de functie-aanroepen die
   gespecificeerd zijn in de JDBC API


•  DBMS leveranciers bieden JDBC drivers aan zodat het mogelijk wordt
   om gegevensbanken vanuit een Java programma aan te spreken




                                                                   23
JDBC architectuur

 Applica6on	
     JDBC	
                       Driver	
  

•  Java code roept JDBC library aan
•  JDBC laadt een driver
•  Driver spreekt met een gegevensbank




                   Copyright © 1997 Alex Chaffee            24
JDBC Driver

•  PostgreSQL: http://jdbc.postgresql.org/
•  Oracle: zie Toledo




                                             25
DriverManager klasse

•  een programma kan connecteren met verschillende
   gegevensbanken
•  de klasse DriverManager houdt bij welke drivers
   geïnstalleerd zijn
•  enkele (statische) methodes van DriverManager zijn:
   –  getDriver, registerDriver, deregisterDriver,…




                                                         26
stappen in JDBC gebruik

1.    importeer het java.sql pakket
2.    laad en registreer de driver
3.    zorg voor passende variabelen in Java
4.    maak een connectie met de gegevensbank
5.    creëer een opdracht
6.    voer de opdracht uit
7.    haal het resultaat (of de resultaten) op
8.    sluit de opdracht en de connectie
1. importeer het java.sql pakket

     import java.sql.*;

     of
of

     import   java.sql.Connection;
     import   java.sql.SQLException;
     import   java.sql.DriverManager;
     import   java.sql.Driver;
     import   java.sql.Statement;
     import   java.sql.ResultSet;
     …
                                        28
2. laad en registreer de driver
 •  dit gebeurt d.m.v. de klasse DriverManager
 •  laden van een specifieke driver gebeurt door de
    statische methode registerDriver() op te roepen




DriverManager.registerDriver
                (new oracle.jdbc.driver.OracleDriver());



DriverManager.registerDriver
                (new org.postgresql.Driver());

                                                      30
2. laad en registreer de driver

 •  alternatief:
    –  gebruik de generieke Java functie om een klasse te laden


Vb:
Class.forName(“oracle.jdbc.driver.OracleDriver”);




                                                                  31
JDBC gebruik
3. zorg voor de passende variabelen in Java

public class Department {
    private String dname;
    private String dnumber;
    private String mgrssn;
    private String mgrstartdate;

     public Department(String dname, String dnumber,
                 String mgrssn, String mgrstartdate) {
         setDname(dname);
         setDnumber(dnumber);
         setMgrssn(mgrssn);
         setMgrstartdate(mgrstartdate);
     }
     public String getDname() {
         return dname;
     }
}
3. maak een connectie met de gegevensbank

  •  gebruik de statische methode getConnection() uit de klasse
     DriverManager om een connection object te maken
  •  twee schrijfwijzen
    –  drie door komma’s gescheiden argumenten
    –  een string als argument


  Connection con = DriverManager.getConnection
                           (url,”userName”,”password”);




                                                             35
4. maak een connectie met de gegevensbank

  •     URL
       –    jdbc:postgresql:database
       –    jdbc:postgresql://host/database
       –    jdbc:postgresql://host:port/database
  •     Voorbeeld:


   Connection con = DriverManager.getConnection
 ("jdbc:postgresql:employee", "postgres", ”pwd");




                                                    36
5. creëer een opdracht
 •  Statement object

	
  Statement stmt = con.createStatement();

	
  vb: een tabel Department maken:
     Statement stmt = con.createStatement();
     String creeer= “CREATE TABLE Department (“ +
                   “ Dname         Varchar(15) Not Null,”+
                   “ Dnumber       Integer     Not Null,”+
                   “ MgrSsn        Char(9),”+
                   “ MgrStartDate DATE,”+
                   “ PRIMARY KEY (Dnumber),”+
                   “ UNIQUE (Dname)”+
                   “)”;


                                                       38
? : parameter,
7. voer de opdracht uit
 •  executeQuery
 •  executeUpdate


	
  try{
      stmt.executeUpdate ("INSERT INTO DEPARTMENT VALUES ("
              +quotes(d.getDname())+", "+d.getDnumber()+", "
              +quotes(d.getMgrssn())+", "
              +getDate(d.getMgrstartdate())+") ");
    stmt.executeUpdate("COMMIT");
    }
    catch(SQLException sqle){
         stmt.executeUpdate("ROLLBACK");
         throw new FailureNoticeException(sqle.getMessage());
    }
stmt.close();

                                                          40
Opdrachten

•  ResultSet executeQuery(String sql_query)
  –  Voert de query sql_query uit en geeft een ResultSet object
     dat het resultaat van de query bevat.

•  int executeUpdate(String sql_query)
  –  Voert de query sql_query uit en geeft als resultaat het aantal
     rijen dat werd toegevoegd/verwijderd/gewijzigd.




                                                                      41
7. haal het resultaat (of de resultaten) op

•  het resultaat wordt teruggegeven in een object van het
   type ResultSet

ResultSet rs = stmt.executeQuery
    ("SELECT dname, dnumber, mgrssn, mgrstartdate " +
     "	
  	
  FROM Department" +
     " WHERE dnumber = " + number );
if (!rs.next()) throw new FailureNoticeException
     ("Geen departement voldoet aan het zoekcriterium.");

Department d = new Department(rs.getString("dname"),
           rs.getString("dnumber"), rs.getString("mgrssn"),
           rs.getString("mgrstartdate"));

rs.close();

                                                        42
binding van 1-ste parameter met ssn


1, 2: attribuutposities,
als alternatrief voor de attribuutnamen
JDBC gebruik

8.  sluit de opdracht en de connectie
      •    (ook resultset(s) moeten worden afgesloten)



stmt.close();
con.close ();




                                                         44
JDBC: overzicht van acties



   DriverManager	
  

                   Connec6on	
  
getConnection

                                   Statement	
  
        createStatement

                                                   ResultSet	
  
                                   execute



                                                                   45
Gebruik van ResultSets
•  navigatie in een ResultSet
        •  next()
        •  previous()
        •  first()
        •  last()
        •  …
•  gegevens ophalen
        •  getRow()
        •  getString(int row)
        •  getString(String attribuutnaam)
        •  getLong(int row)
        •  getDate(int row)
        •  …
        •  wasNull()
•  andere operaties
        •  close()
                                             46
metadata
–  data die de structuur en de eigenschappen van de gegevens beschrijven
–  java.sql.ResultSetMetaData
   •  construct by calling getMetaData() of a ResultSet object
   •  getColumnCount()
      getColumnName(int i)
      getColumnSize(int i)
      getColumnType(int i)
      ...




   ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
   ResultSetMetaData rsmd = rs.getMetaData();
   int numberOfColumns = rsmd.getColumnCount();



                                                                    47
java.sql.Statement

•  meest gebruikt type opdracht
  –  v.b.      Connection con = …;
               Statement stmt = con.createStatement();
•  hoe worden SQL statements uitgevoerd?
  –    de gebruiker voert een SQL opdracht in
  –    het gevensbanksysteem ontleedt de opdracht
  –    het gegevensbanksysteem controleert de syntaxis
  –    het gegevensbanksysteem compileert de opdracht
  –    het gegevensbanksysteem voert de opdracht uit




                                                         48
java.sql.PreparedStatement
–  gebruikt voor de uitvoering van dynamische SQL opdrachten
   •  IN parameters




Res PreparedStatement p = con.prepareStatement(
             "SELECT dname, dnumber, mgrssn, mgrstartdate " +
             " FROM Department" +
             " WHERE dnumber = ?" );

p.clearParameters();
p.setInt(1, 1);
ResultSet rs=p.executeQuery();




                                                                49
java.sql.PreparedStatement
–  hoe worden SQL statements uitgevoerd?
   •    de gebruiker voert een SQL opdracht in
   •    het gevensbanksysteem ontleedt de opdracht
   •    het gegevensbanksysteem controleert de syntaxis
   •    het gegevensbanksysteem compileert de opdracht
   •    het gegevensbanksysteem voert de opdracht uit
–  enkele de laatste stap moet herhaald worden voor “prepared
   statements”
   •  opdracht wordt opnieuw gebruikt met andere waarde voor de parameter
–  voorbeeld         Connection con = …;
                     String query = “select * from department where id=?”;
                     PreparedStatement pstmt = con.prepareStatement(query);




                                                                              50
JDBC versus SQLJ

JDBC                                                                         SQLJ
stmt	
  =	
  conn.prepareStatement(	
                                        #sql	
  [ctx]	
  {	
  
	
  	
  	
  "INSERT	
  INTO	
  DSN8710.EMP	
  "	
  +	
                       	
  	
  INSERT	
  INTO	
  DSN8710.EMP	
  
	
  	
  	
  "(EMPNO,	
  FIRSTNME,	
  MIDINIT,	
                              	
  	
  	
  	
  (EMPNO,	
  	
  FIRSTNME,	
  	
  	
  MIDINIT,	
  	
  
              LASTNAME,	
  HIREDATE,	
  SALARY)	
  "	
                                         LASTNAME,	
  	
  HIREDATE,	
  	
  	
  	
  	
  SALARY)	
  
	
  +	
  "VALUES	
  (?,	
  ?,	
  ?,	
  ?,	
  CURRENT	
  DATE,	
  ?)");	
     	
  	
  VALUES	
  
stmt.setString(1,	
  empno);	
                                               	
  (:empno,	
  :firstname,	
  :midinit,	
  :lastname,	
  
stmt.setString(2,	
  firstname);	
                                                              CURRENT	
  DATE,	
  :salary)	
  
stmt.setString(3,	
  midinit);	
                                             };	
  
stmt.setString(4,	
  lastname);	
  
stmt.setBigDecimal(5,	
  salary);	
  
stmt.executeUpdate();	
  
stmt.close();	
  


                                                                                                                                                       51
SQLJ versus JDBC

                                SQLJ         JDBC
    SQL statements              static       dynamic

    Strong typing               yes          no

    Checking                    static       runtime only

    Syntax                      concis e     API

    Standard                    ANSI         Sun

    Portable                    yes          yes

    Object support              yes*         yes*


    Source: www.cs.manchester.ac.uk/~horrocks/cs2312/Lectures/PPT/jdbc.ppt
VRAGEN?

Weitere ähnliche Inhalte

Ähnlich wie JDBC en embedded SQL

Versiebeheer van database changes
Versiebeheer van database changesVersiebeheer van database changes
Versiebeheer van database changesArjen van Vliet
 
Nord Toelichting Techniek
Nord Toelichting TechniekNord Toelichting Techniek
Nord Toelichting Techniektjercus
 
Gegevensbanken: begrippen
Gegevensbanken: begrippenGegevensbanken: begrippen
Gegevensbanken: begrippenErik Duval
 
2019 diy migration webinar gs nl
2019 diy migration webinar gs nl2019 diy migration webinar gs nl
2019 diy migration webinar gs nlEDB
 
Software Engineering College 2 - ETL and databases
Software Engineering College 2 - ETL and databasesSoftware Engineering College 2 - ETL and databases
Software Engineering College 2 - ETL and databasesJurjen Helmus
 
IMPACT Framework en Evaluatie by Clemens Neudecker
IMPACT Framework en Evaluatie by Clemens NeudeckerIMPACT Framework en Evaluatie by Clemens Neudecker
IMPACT Framework en Evaluatie by Clemens NeudeckerIMPACT Centre of Competence
 
16:00 -ArcGIS 10.1 & Databases
16:00 -ArcGIS 10.1 & Databases16:00 -ArcGIS 10.1 & Databases
16:00 -ArcGIS 10.1 & DatabasesGISTech2012
 
Database Platformen Versus Etl Tools
Database Platformen Versus Etl ToolsDatabase Platformen Versus Etl Tools
Database Platformen Versus Etl ToolsAlexander van Helm
 
Techdays System Center 2012 Operations Manager end-to-end management walter ...
Techdays  System Center 2012 Operations Manager end-to-end management walter ...Techdays  System Center 2012 Operations Manager end-to-end management walter ...
Techdays System Center 2012 Operations Manager end-to-end management walter ...wwwally
 
Sql developer 4 workshop
Sql developer 4 workshopSql developer 4 workshop
Sql developer 4 workshopmakker_nl
 
Meetup DB testing met SoapUI en Robot Framework.pdf
Meetup DB testing met SoapUI en Robot Framework.pdfMeetup DB testing met SoapUI en Robot Framework.pdf
Meetup DB testing met SoapUI en Robot Framework.pdfchristiantester
 
OpenESB -- Hello World Intor
OpenESB -- Hello World IntorOpenESB -- Hello World Intor
OpenESB -- Hello World Intorpappavis
 
Geocortex opimizer1.5
Geocortex opimizer1.5Geocortex opimizer1.5
Geocortex opimizer1.5GeoWeb2012
 
Flexibiliteit & Snel Schakelen
Flexibiliteit & Snel SchakelenFlexibiliteit & Snel Schakelen
Flexibiliteit & Snel SchakelenMarco Gralike
 
HTML 5, ASP.NET MVC & Windows Azure sessie voor Ivo Brugge
HTML 5, ASP.NET MVC & Windows Azure sessie voor Ivo BruggeHTML 5, ASP.NET MVC & Windows Azure sessie voor Ivo Brugge
HTML 5, ASP.NET MVC & Windows Azure sessie voor Ivo BruggePureplexity
 
Presentatie drupal sass
Presentatie drupal sassPresentatie drupal sass
Presentatie drupal sassKees
 
Tivoli Directory Integrator door Marcel de Hoog
Tivoli Directory Integrator door Marcel de HoogTivoli Directory Integrator door Marcel de Hoog
Tivoli Directory Integrator door Marcel de HoogRoland Driesen
 

Ähnlich wie JDBC en embedded SQL (20)

Versiebeheer van database changes
Versiebeheer van database changesVersiebeheer van database changes
Versiebeheer van database changes
 
Nord Toelichting Techniek
Nord Toelichting TechniekNord Toelichting Techniek
Nord Toelichting Techniek
 
Gegevensbanken: begrippen
Gegevensbanken: begrippenGegevensbanken: begrippen
Gegevensbanken: begrippen
 
2019 diy migration webinar gs nl
2019 diy migration webinar gs nl2019 diy migration webinar gs nl
2019 diy migration webinar gs nl
 
Software Engineering College 2 - ETL and databases
Software Engineering College 2 - ETL and databasesSoftware Engineering College 2 - ETL and databases
Software Engineering College 2 - ETL and databases
 
IMPACT Framework en Evaluatie by Clemens Neudecker
IMPACT Framework en Evaluatie by Clemens NeudeckerIMPACT Framework en Evaluatie by Clemens Neudecker
IMPACT Framework en Evaluatie by Clemens Neudecker
 
16:00 -ArcGIS 10.1 & Databases
16:00 -ArcGIS 10.1 & Databases16:00 -ArcGIS 10.1 & Databases
16:00 -ArcGIS 10.1 & Databases
 
Database Platformen Versus Etl Tools
Database Platformen Versus Etl ToolsDatabase Platformen Versus Etl Tools
Database Platformen Versus Etl Tools
 
Techdays System Center 2012 Operations Manager end-to-end management walter ...
Techdays  System Center 2012 Operations Manager end-to-end management walter ...Techdays  System Center 2012 Operations Manager end-to-end management walter ...
Techdays System Center 2012 Operations Manager end-to-end management walter ...
 
Sql developer 4 workshop
Sql developer 4 workshopSql developer 4 workshop
Sql developer 4 workshop
 
Meetup DB testing met SoapUI en Robot Framework.pdf
Meetup DB testing met SoapUI en Robot Framework.pdfMeetup DB testing met SoapUI en Robot Framework.pdf
Meetup DB testing met SoapUI en Robot Framework.pdf
 
OpenESB -- Hello World Intor
OpenESB -- Hello World IntorOpenESB -- Hello World Intor
OpenESB -- Hello World Intor
 
Geocortex opimizer1.5
Geocortex opimizer1.5Geocortex opimizer1.5
Geocortex opimizer1.5
 
Geocortex opimizer1.5
Geocortex opimizer1.5Geocortex opimizer1.5
Geocortex opimizer1.5
 
Flexibiliteit & Snel Schakelen
Flexibiliteit & Snel SchakelenFlexibiliteit & Snel Schakelen
Flexibiliteit & Snel Schakelen
 
Flexibiliteit, Agility & Snel Schakelen - SHIFT13 congres
Flexibiliteit, Agility & Snel Schakelen - SHIFT13 congresFlexibiliteit, Agility & Snel Schakelen - SHIFT13 congres
Flexibiliteit, Agility & Snel Schakelen - SHIFT13 congres
 
HTML 5, ASP.NET MVC & Windows Azure sessie voor Ivo Brugge
HTML 5, ASP.NET MVC & Windows Azure sessie voor Ivo BruggeHTML 5, ASP.NET MVC & Windows Azure sessie voor Ivo Brugge
HTML 5, ASP.NET MVC & Windows Azure sessie voor Ivo Brugge
 
Presentatie drupal sass
Presentatie drupal sassPresentatie drupal sass
Presentatie drupal sass
 
Automated testing with SpecFlow
Automated testing with SpecFlowAutomated testing with SpecFlow
Automated testing with SpecFlow
 
Tivoli Directory Integrator door Marcel de Hoog
Tivoli Directory Integrator door Marcel de HoogTivoli Directory Integrator door Marcel de Hoog
Tivoli Directory Integrator door Marcel de Hoog
 

Mehr von Katrien Verbert

Human-centered AI: how can we support end-users to interact with AI?
Human-centered AI: how can we support end-users to interact with AI?Human-centered AI: how can we support end-users to interact with AI?
Human-centered AI: how can we support end-users to interact with AI?Katrien Verbert
 
Human-centered AI: how can we support end-users to interact with AI?
Human-centered AI: how can we support end-users to interact with AI?Human-centered AI: how can we support end-users to interact with AI?
Human-centered AI: how can we support end-users to interact with AI?Katrien Verbert
 
Human-centered AI: how can we support lay users to understand AI?
Human-centered AI: how can we support lay users to understand AI?Human-centered AI: how can we support lay users to understand AI?
Human-centered AI: how can we support lay users to understand AI?Katrien Verbert
 
Explaining job recommendations: a human-centred perspective
Explaining job recommendations: a human-centred perspectiveExplaining job recommendations: a human-centred perspective
Explaining job recommendations: a human-centred perspectiveKatrien Verbert
 
Explaining recommendations: design implications and lessons learned
Explaining recommendations: design implications and lessons learnedExplaining recommendations: design implications and lessons learned
Explaining recommendations: design implications and lessons learnedKatrien Verbert
 
Designing Learning Analytics Dashboards: Lessons Learned
Designing Learning Analytics Dashboards: Lessons LearnedDesigning Learning Analytics Dashboards: Lessons Learned
Designing Learning Analytics Dashboards: Lessons LearnedKatrien Verbert
 
Human-centered AI: towards the next generation of interactive and adaptive ex...
Human-centered AI: towards the next generation of interactive and adaptive ex...Human-centered AI: towards the next generation of interactive and adaptive ex...
Human-centered AI: towards the next generation of interactive and adaptive ex...Katrien Verbert
 
Explainable AI for non-expert users
Explainable AI for non-expert usersExplainable AI for non-expert users
Explainable AI for non-expert usersKatrien Verbert
 
Towards the next generation of interactive and adaptive explanation methods
Towards the next generation of interactive and adaptive explanation methodsTowards the next generation of interactive and adaptive explanation methods
Towards the next generation of interactive and adaptive explanation methodsKatrien Verbert
 
Personalized food recommendations: combining recommendation, visualization an...
Personalized food recommendations: combining recommendation, visualization an...Personalized food recommendations: combining recommendation, visualization an...
Personalized food recommendations: combining recommendation, visualization an...Katrien Verbert
 
Explaining and Exploring Job Recommendations: a User-driven Approach for Inte...
Explaining and Exploring Job Recommendations: a User-driven Approach for Inte...Explaining and Exploring Job Recommendations: a User-driven Approach for Inte...
Explaining and Exploring Job Recommendations: a User-driven Approach for Inte...Katrien Verbert
 
Learning analytics for feedback at scale
Learning analytics for feedback at scaleLearning analytics for feedback at scale
Learning analytics for feedback at scaleKatrien Verbert
 
Interactive recommender systems and dashboards for learning
Interactive recommender systems and dashboards for learningInteractive recommender systems and dashboards for learning
Interactive recommender systems and dashboards for learningKatrien Verbert
 
Interactive recommender systems: opening up the “black box”
Interactive recommender systems: opening up the “black box”Interactive recommender systems: opening up the “black box”
Interactive recommender systems: opening up the “black box”Katrien Verbert
 
Interactive Recommender Systems
Interactive Recommender SystemsInteractive Recommender Systems
Interactive Recommender SystemsKatrien Verbert
 
Web Information Systems Lecture 2: HTML
Web Information Systems Lecture 2: HTMLWeb Information Systems Lecture 2: HTML
Web Information Systems Lecture 2: HTMLKatrien Verbert
 
Information Visualisation: perception and principles
Information Visualisation: perception and principlesInformation Visualisation: perception and principles
Information Visualisation: perception and principlesKatrien Verbert
 
Web Information Systems Lecture 1: Introduction
Web Information Systems Lecture 1: IntroductionWeb Information Systems Lecture 1: Introduction
Web Information Systems Lecture 1: IntroductionKatrien Verbert
 
Information Visualisation: Introduction
Information Visualisation: IntroductionInformation Visualisation: Introduction
Information Visualisation: IntroductionKatrien Verbert
 

Mehr von Katrien Verbert (20)

Explainability methods
Explainability methodsExplainability methods
Explainability methods
 
Human-centered AI: how can we support end-users to interact with AI?
Human-centered AI: how can we support end-users to interact with AI?Human-centered AI: how can we support end-users to interact with AI?
Human-centered AI: how can we support end-users to interact with AI?
 
Human-centered AI: how can we support end-users to interact with AI?
Human-centered AI: how can we support end-users to interact with AI?Human-centered AI: how can we support end-users to interact with AI?
Human-centered AI: how can we support end-users to interact with AI?
 
Human-centered AI: how can we support lay users to understand AI?
Human-centered AI: how can we support lay users to understand AI?Human-centered AI: how can we support lay users to understand AI?
Human-centered AI: how can we support lay users to understand AI?
 
Explaining job recommendations: a human-centred perspective
Explaining job recommendations: a human-centred perspectiveExplaining job recommendations: a human-centred perspective
Explaining job recommendations: a human-centred perspective
 
Explaining recommendations: design implications and lessons learned
Explaining recommendations: design implications and lessons learnedExplaining recommendations: design implications and lessons learned
Explaining recommendations: design implications and lessons learned
 
Designing Learning Analytics Dashboards: Lessons Learned
Designing Learning Analytics Dashboards: Lessons LearnedDesigning Learning Analytics Dashboards: Lessons Learned
Designing Learning Analytics Dashboards: Lessons Learned
 
Human-centered AI: towards the next generation of interactive and adaptive ex...
Human-centered AI: towards the next generation of interactive and adaptive ex...Human-centered AI: towards the next generation of interactive and adaptive ex...
Human-centered AI: towards the next generation of interactive and adaptive ex...
 
Explainable AI for non-expert users
Explainable AI for non-expert usersExplainable AI for non-expert users
Explainable AI for non-expert users
 
Towards the next generation of interactive and adaptive explanation methods
Towards the next generation of interactive and adaptive explanation methodsTowards the next generation of interactive and adaptive explanation methods
Towards the next generation of interactive and adaptive explanation methods
 
Personalized food recommendations: combining recommendation, visualization an...
Personalized food recommendations: combining recommendation, visualization an...Personalized food recommendations: combining recommendation, visualization an...
Personalized food recommendations: combining recommendation, visualization an...
 
Explaining and Exploring Job Recommendations: a User-driven Approach for Inte...
Explaining and Exploring Job Recommendations: a User-driven Approach for Inte...Explaining and Exploring Job Recommendations: a User-driven Approach for Inte...
Explaining and Exploring Job Recommendations: a User-driven Approach for Inte...
 
Learning analytics for feedback at scale
Learning analytics for feedback at scaleLearning analytics for feedback at scale
Learning analytics for feedback at scale
 
Interactive recommender systems and dashboards for learning
Interactive recommender systems and dashboards for learningInteractive recommender systems and dashboards for learning
Interactive recommender systems and dashboards for learning
 
Interactive recommender systems: opening up the “black box”
Interactive recommender systems: opening up the “black box”Interactive recommender systems: opening up the “black box”
Interactive recommender systems: opening up the “black box”
 
Interactive Recommender Systems
Interactive Recommender SystemsInteractive Recommender Systems
Interactive Recommender Systems
 
Web Information Systems Lecture 2: HTML
Web Information Systems Lecture 2: HTMLWeb Information Systems Lecture 2: HTML
Web Information Systems Lecture 2: HTML
 
Information Visualisation: perception and principles
Information Visualisation: perception and principlesInformation Visualisation: perception and principles
Information Visualisation: perception and principles
 
Web Information Systems Lecture 1: Introduction
Web Information Systems Lecture 1: IntroductionWeb Information Systems Lecture 1: Introduction
Web Information Systems Lecture 1: Introduction
 
Information Visualisation: Introduction
Information Visualisation: IntroductionInformation Visualisation: Introduction
Information Visualisation: Introduction
 

JDBC en embedded SQL

  • 1. programma s verbinden met gegevensbanken Katrien Verbert katrien.verbert@cs.kuleuven.be
  • 2. inhoud •  benaderingen voor gegevensbankprogrammeren •  ingebedde SQL •  JDBC 2
  • 3. gebruik van SQL •  Interactief –  opdracht wordt aangeboden en onmiddellijk uitgevoerd •  Ingebed gebruik –  SQL wordt gebruikt in een programma 3
  • 4. programmeren met gegevensbanken gebruikers applicaties gegevensbanken C/C++,  Java,  PHP,  Perl...   SQL   4
  • 5. benaderingen 1.  inbedden SQL opdrachten in een programma •  SQL opdrachten worden door een precompiler opgezocht •  en omgevormd tot functie-aanroepen van de programmeertaal 2.  gebruik van een bibliotheek met functies •  die toegang verschaffen tot de gegevensbank •  en resultaten beschikbaar stellen aan een programma in een API 3.  een (nieuwe) programmeertaal ontwikkelen •  die compatibel is met het gegevensmodel en query taal •  vb: PL/SQL van Oracle
  • 6. SQL/Host Language Interface SQL stmt Func6on  call   SQL Table Library While(…){ Cursor DBMS } Fetch  rows     Impedance   host program from  the  cursor     mismatch   problem   [Kazuhiro Minami]
  • 7. Impedance mismatch •  verschillen tussen gegevensmodel en model van de programmeertaal –  CHAR, VARCHAR -- String –  INTEGER -- int •  bindings voor verschillende programmeertalen –  definieert overeenkomsten van de attribuuttypes met de types in de programmeertaal –  bindt resultaat van query (=verzameling van tuples) aan datastructuur van het programma 7
  • 8. typische interactie client/server model •  het client programma opent een verbinding met de gegevensbankserver –  vereist meestal adres van machine met de server, –  en login-naam en paswoord voor gegevensbank •  Interactie tussen het programma en de gegevensbank: –  programma biedt queries, updates,… aan –  server levert resultaten van de queries,… •  Programma sluit de verbinding met de gegevensbank 8
  • 10. ingebedde SQL •  SQL opdracht kan in een programma ingebed worden •  een pre-compiler verwerkt de SQL opdrachten vóór de compilatie van het programma: –  SQL opdrachten worden vervangen door opdrachten (declaraties en functie-aanroepen) in de programmeertaal •  syntaxis verschilt wat naargelang van de programmeertaal EXEC  SQL  <  embedded  SQL  statement  >  END-­‐EXEC   EXEC  SQL  <  embedded  SQL  statement  >  ;   #  SQL  {  <  embedded  SQL  statement  >  }  ;   10
  • 11. ingebedde SQL –  Connecteren met de gegevensbank: CONNECT  TO  <  server  name  >  AS  <  connec6on  name  >   AUTHORIZATION  <  user  account  name  and  password  >  ;   •  slechts één connectie kan actief zijn; •  wijzigen van de actieve connectie: SET  CONNECT  <  connec6on  name  >  ;   –  Verbinding beëindigen: DISCONNECT  <  connec6on  name  >  ;   11
  • 12. Ingebed gebruik van SQL •  gemeenschappelijke variabelen –  SQL opdrachten kunnen verwijzingen naar variabelen uit het programma bevatten –  dubbele punt (:) als prefix •  de gemeenschappelijke variabelen moeten gedeclareerd worden in een SQL declaratie sectie 12
  • 13. ingebedde SQL •  Eén tupel ophalen uit een gegevensbank •  Voorbeelden: –  1. Declaratie van variabelen (in C): EXEC SQL BEGIN DECLARE SECTION; varchar dname[16], fname[16], lname[16], char ssn[10], bdate[11], sex[2], minit[2]; float salary, raise; int dno, dnumer; int SQLCODE ; char SQLSTATE[6]; EXEC SQL END DECLARE SECTION;
  • 14. ingebedde SQL: voorbeeld –  Herhaal een aantal maal: lees het ssn van een werknemer en schrijf (op de uitvoer) gegevens van die werknemer loop = 1; while (loop) { prompt(“Enter a social security number: “, ssn); EXEC SQL select Fname, Minit, Lname, Address, Salary into :fname, :minit, :lname, :address, :salary from EMPLOYEE where SSN = :ssn; if (SQLCODE == 0) printf(fname, minit, lname, address, salary) else printf(“social sec. numb. does not exist: “, ssn); prompt(“More s.s.numbers (enter 1 for Yes, 0 for No): “, loop) ; }
  • 15. twee aanpakken Host language + Embedded SQL Preprocessor   Host language CLI (Call-level + interface) Function calls Host-­‐language   SQL library Object-code compiler   program
  • 16. SQLJ •  SQL commando’s ingebed in Java –  SQLJ vertaler zet SQL commando’s om in Java, –  commando’s worden uitgevoerd d.m.v. de JDBC interface –  JDBC driver moet dus geïnstalleerd worden •  vereist: –  importeren van verscheidene klassen •  JDBC en IO klassen •  extra klassen –  connecteren met de gewenste gegevensbank •  getConnection 16
  • 17. SQLJ –  importeren van de nodige klassen (vb. met Oracle) import java.sql.*; import java.io.*; import sqlj.runtime.*; import sqlj.runtime.ref.*; import oracle.sqlj.runtime.*; … –  connectie maken DefaultContext cntxt = oracle.getConnection(“<url name>”, “<user name>”, “<pasword>”, true); DefaultContext.setDefaultContext(cntxt); …
  • 18. SQLJ –  Voorbeeld 1: •  lees het ssn van een werknemer en schrijf (op de uitvoer) gegevens van die werknemer ssn = readEntry(“Enter a social security number: “); try { #sql{select Fname, Minit, Lname, Address, Salary into :fname, :minit, :lname, :address, :salary from EMPLOYEE where Ssn = :ssn}; } catch (SQLException se) { System.out.println(“s.s.number does not exist: “+ ssn); return ; } System.out.println(fname + “ “ + minit + “ “ + lname + “ “ + “ “ + salary) 18
  • 19. dname = readEntry(“Enter the department name: “); try { #sql{select Dnumber into :dnumber from DEPARTMENT where Dname = :dname}; } catch (SQLException se) { System.out.println(“department does not exist:“ + dname); return; } System.out.println(“ information for department: “ + dname); #sql iterator Emp(String ssn, String fname, String minit, String lname, double salary); Emp e = null; #sql e = {select ssn, fname, minit, lname, salary from EMPLOYEE where Dno = :dnumber}; while (e.next()) { System,out.println(e.ssn + “ “ “ e.fname + “ “ + e.minit + “ “ + e.lname + “ “ + e.salary); } ; e.close();
  • 20. JDBC
  • 21. JDBC •  Call function interface voor toegang vanuit Java •  SQL statements worden dynamisch aangemaakt en doorgegeven als string •  Gebruikt API voor toegang tot DBMS 21
  • 22. twee aanpakken Host language + Embedded SQL Preprocessor   Host language JDBC + Function calls Host-­‐language   SQL library Object-code compiler   program
  • 23. JDBC •  gestandaardiseerde API (Application Programming Interface) –  geregistreerde naam door Sun Microsystems –  Zou niet staan voor ‘Java DataBase Connectivity’ •  JDBC driver = een implementatie van de functie-aanroepen die gespecificeerd zijn in de JDBC API •  DBMS leveranciers bieden JDBC drivers aan zodat het mogelijk wordt om gegevensbanken vanuit een Java programma aan te spreken 23
  • 24. JDBC architectuur Applica6on   JDBC   Driver   •  Java code roept JDBC library aan •  JDBC laadt een driver •  Driver spreekt met een gegevensbank Copyright © 1997 Alex Chaffee 24
  • 25. JDBC Driver •  PostgreSQL: http://jdbc.postgresql.org/ •  Oracle: zie Toledo 25
  • 26. DriverManager klasse •  een programma kan connecteren met verschillende gegevensbanken •  de klasse DriverManager houdt bij welke drivers geïnstalleerd zijn •  enkele (statische) methodes van DriverManager zijn: –  getDriver, registerDriver, deregisterDriver,… 26
  • 27. stappen in JDBC gebruik 1.  importeer het java.sql pakket 2.  laad en registreer de driver 3.  zorg voor passende variabelen in Java 4.  maak een connectie met de gegevensbank 5.  creëer een opdracht 6.  voer de opdracht uit 7.  haal het resultaat (of de resultaten) op 8.  sluit de opdracht en de connectie
  • 28. 1. importeer het java.sql pakket import java.sql.*; of of import java.sql.Connection; import java.sql.SQLException; import java.sql.DriverManager; import java.sql.Driver; import java.sql.Statement; import java.sql.ResultSet; … 28
  • 29.
  • 30. 2. laad en registreer de driver •  dit gebeurt d.m.v. de klasse DriverManager •  laden van een specifieke driver gebeurt door de statische methode registerDriver() op te roepen DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver()); DriverManager.registerDriver (new org.postgresql.Driver()); 30
  • 31. 2. laad en registreer de driver •  alternatief: –  gebruik de generieke Java functie om een klasse te laden Vb: Class.forName(“oracle.jdbc.driver.OracleDriver”); 31
  • 32.
  • 33. JDBC gebruik 3. zorg voor de passende variabelen in Java public class Department { private String dname; private String dnumber; private String mgrssn; private String mgrstartdate; public Department(String dname, String dnumber, String mgrssn, String mgrstartdate) { setDname(dname); setDnumber(dnumber); setMgrssn(mgrssn); setMgrstartdate(mgrstartdate); } public String getDname() { return dname; } }
  • 34.
  • 35. 3. maak een connectie met de gegevensbank •  gebruik de statische methode getConnection() uit de klasse DriverManager om een connection object te maken •  twee schrijfwijzen –  drie door komma’s gescheiden argumenten –  een string als argument Connection con = DriverManager.getConnection (url,”userName”,”password”); 35
  • 36. 4. maak een connectie met de gegevensbank •  URL –  jdbc:postgresql:database –  jdbc:postgresql://host/database –  jdbc:postgresql://host:port/database •  Voorbeeld: Connection con = DriverManager.getConnection ("jdbc:postgresql:employee", "postgres", ”pwd"); 36
  • 37.
  • 38. 5. creëer een opdracht •  Statement object  Statement stmt = con.createStatement();  vb: een tabel Department maken: Statement stmt = con.createStatement(); String creeer= “CREATE TABLE Department (“ + “ Dname Varchar(15) Not Null,”+ “ Dnumber Integer Not Null,”+ “ MgrSsn Char(9),”+ “ MgrStartDate DATE,”+ “ PRIMARY KEY (Dnumber),”+ “ UNIQUE (Dname)”+ “)”; 38
  • 40. 7. voer de opdracht uit •  executeQuery •  executeUpdate  try{ stmt.executeUpdate ("INSERT INTO DEPARTMENT VALUES (" +quotes(d.getDname())+", "+d.getDnumber()+", " +quotes(d.getMgrssn())+", " +getDate(d.getMgrstartdate())+") "); stmt.executeUpdate("COMMIT"); } catch(SQLException sqle){ stmt.executeUpdate("ROLLBACK"); throw new FailureNoticeException(sqle.getMessage()); } stmt.close(); 40
  • 41. Opdrachten •  ResultSet executeQuery(String sql_query) –  Voert de query sql_query uit en geeft een ResultSet object dat het resultaat van de query bevat. •  int executeUpdate(String sql_query) –  Voert de query sql_query uit en geeft als resultaat het aantal rijen dat werd toegevoegd/verwijderd/gewijzigd. 41
  • 42. 7. haal het resultaat (of de resultaten) op •  het resultaat wordt teruggegeven in een object van het type ResultSet ResultSet rs = stmt.executeQuery ("SELECT dname, dnumber, mgrssn, mgrstartdate " + "    FROM Department" + " WHERE dnumber = " + number ); if (!rs.next()) throw new FailureNoticeException ("Geen departement voldoet aan het zoekcriterium."); Department d = new Department(rs.getString("dname"), rs.getString("dnumber"), rs.getString("mgrssn"), rs.getString("mgrstartdate")); rs.close(); 42
  • 43. binding van 1-ste parameter met ssn 1, 2: attribuutposities, als alternatrief voor de attribuutnamen
  • 44. JDBC gebruik 8.  sluit de opdracht en de connectie •  (ook resultset(s) moeten worden afgesloten) stmt.close(); con.close (); 44
  • 45. JDBC: overzicht van acties DriverManager   Connec6on   getConnection Statement   createStatement ResultSet   execute 45
  • 46. Gebruik van ResultSets •  navigatie in een ResultSet •  next() •  previous() •  first() •  last() •  … •  gegevens ophalen •  getRow() •  getString(int row) •  getString(String attribuutnaam) •  getLong(int row) •  getDate(int row) •  … •  wasNull() •  andere operaties •  close() 46
  • 47. metadata –  data die de structuur en de eigenschappen van de gegevens beschrijven –  java.sql.ResultSetMetaData •  construct by calling getMetaData() of a ResultSet object •  getColumnCount() getColumnName(int i) getColumnSize(int i) getColumnType(int i) ... ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2"); ResultSetMetaData rsmd = rs.getMetaData(); int numberOfColumns = rsmd.getColumnCount(); 47
  • 48. java.sql.Statement •  meest gebruikt type opdracht –  v.b. Connection con = …; Statement stmt = con.createStatement(); •  hoe worden SQL statements uitgevoerd? –  de gebruiker voert een SQL opdracht in –  het gevensbanksysteem ontleedt de opdracht –  het gegevensbanksysteem controleert de syntaxis –  het gegevensbanksysteem compileert de opdracht –  het gegevensbanksysteem voert de opdracht uit 48
  • 49. java.sql.PreparedStatement –  gebruikt voor de uitvoering van dynamische SQL opdrachten •  IN parameters Res PreparedStatement p = con.prepareStatement( "SELECT dname, dnumber, mgrssn, mgrstartdate " + " FROM Department" + " WHERE dnumber = ?" ); p.clearParameters(); p.setInt(1, 1); ResultSet rs=p.executeQuery(); 49
  • 50. java.sql.PreparedStatement –  hoe worden SQL statements uitgevoerd? •  de gebruiker voert een SQL opdracht in •  het gevensbanksysteem ontleedt de opdracht •  het gegevensbanksysteem controleert de syntaxis •  het gegevensbanksysteem compileert de opdracht •  het gegevensbanksysteem voert de opdracht uit –  enkele de laatste stap moet herhaald worden voor “prepared statements” •  opdracht wordt opnieuw gebruikt met andere waarde voor de parameter –  voorbeeld Connection con = …; String query = “select * from department where id=?”; PreparedStatement pstmt = con.prepareStatement(query); 50
  • 51. JDBC versus SQLJ JDBC SQLJ stmt  =  conn.prepareStatement(   #sql  [ctx]  {        "INSERT  INTO  DSN8710.EMP  "  +      INSERT  INTO  DSN8710.EMP        "(EMPNO,  FIRSTNME,  MIDINIT,          (EMPNO,    FIRSTNME,      MIDINIT,     LASTNAME,  HIREDATE,  SALARY)  "   LASTNAME,    HIREDATE,          SALARY)    +  "VALUES  (?,  ?,  ?,  ?,  CURRENT  DATE,  ?)");      VALUES   stmt.setString(1,  empno);    (:empno,  :firstname,  :midinit,  :lastname,   stmt.setString(2,  firstname);   CURRENT  DATE,  :salary)   stmt.setString(3,  midinit);   };   stmt.setString(4,  lastname);   stmt.setBigDecimal(5,  salary);   stmt.executeUpdate();   stmt.close();   51
  • 52. SQLJ versus JDBC SQLJ JDBC SQL statements static dynamic Strong typing yes no Checking static runtime only Syntax concis e API Standard ANSI Sun Portable yes yes Object support yes* yes* Source: www.cs.manchester.ac.uk/~horrocks/cs2312/Lectures/PPT/jdbc.ppt