Méthode générale d'accès à une BD en lecture par un langage de programmation

DéfinitionPointeur sur un résultat de requête

Lorsqu'un programme exécute une requête dans une BD, il récupère un pointeur sur un résultat de requête permettant de parcourir le tableau résultant de l'exécution de la requête ligne par ligne.

En effet :

  • Une requête SQL retourne toujours un tableau (même si parfois il n'a qu'une ligne et une colonne), c'est le fondement du modèle relationnel

  • En général il n'est pas souhaitable que ce tableau soit transmis directement sous la forme d'une structure en mémoire (array), car le résultat d'une requête peut être aussi volumineux que la BD complète stockée en mémoire secondaire

  • La solution générale est donc que la BD fournisse le résultat ligne par ligne

Le pointeur permet de :

  • Retourner la ligne pointée sous la forme d'un vecteur (tableau à une seule ligne)

  • Passer à la ligne suivante

  • Savoir si l'on a atteint la fin du tableau (ligne N)

Pointeur sur un résultat de requête

Méthode

  1. Connexion à la base de données et récupération d'un identifiant de connexion

  2. Écriture de la requête de sélection

  3. Exécution de la requête sur la connexion ouverte et récupération d'un pointeur sur un résultat de requête

  4. Parcours du pointeur dans une boucle permettant rapporter (fetch) et traiter (afficher par exemple) le tableau ligne par ligne

  5. Clôture de la connexion

MéthodePseudo-code

CTRL+C pour copier, CTRL+V pour coller
1
// Connexion à la base de données
2
$vHost = "foo.fr"
3
$vPort = "6666"
4
$vData = "myDatabase"
5
$vUser = "me"
6
$vPass = "secret"
7
$vConn = CONNECT ($vHost, $vPort, $vDb, $vUser, $vPass)
// Connexion à la base de données
$vHost = "foo.fr"
$vPort = "6666"
$vData = "myDatabase"
$vUser = "me"
$vPass = "secret"
$vConn = CONNECT ($vHost, $vPort, $vDb, $vUser, $vPass)
CTRL+C pour copier, CTRL+V pour coller
1
// Écriture de la requête
2
$vSql = "select a, b from  t;"
// Écriture de la requête
$vSql = "select a, b from  t;"
CTRL+C pour copier, CTRL+V pour coller
1
// Exécution de la requête
2
$vPointeur = QUERY ($vConn, $vSql)
// Exécution de la requête
$vPointeur = QUERY ($vConn, $vSql)
CTRL+C pour copier, CTRL+V pour coller
1
// Traitement du résultat
2
IF (NOT $vPointeur) THEN MESSAGE("Échec de l'exécution")
3
ELSE
4
  WHILE ($vPointeur) 
5
     FETCH $vPointeur IN $vResult[]
6
    PRINT $vResult[1]
7
    PRINT $vResult[2]
8
    NEXT $vPointeur
9
   END WHILE
10
END IF
// Traitement du résultat
IF (NOT $vPointeur) THEN MESSAGE("Échec de l'exécution")
ELSE
  WHILE ($vPointeur) 
     FETCH $vPointeur IN $vResult[]
    PRINT $vResult[1]
    PRINT $vResult[2]
    NEXT $vPointeur
   END WHILE
END IF
CTRL+C pour copier, CTRL+V pour coller
1
// Clôture de la connexion
2
CLOSE ($vConn)
// Clôture de la connexion
CLOSE ($vConn)

ExempleFonction PHP

CTRL+C pour copier, CTRL+V pour coller
1
<?php
2
function fSelect () {
3
// Connexion à la base de données
4
  $vHost = "foo.fr" ;
5
  $vPort = "5432" ;
6
  $vData= "myDatabase" ;
7
  $vUser = "me" ;
8
  $vPass = "secret" ;
9
  $vConn = new PDO('pgsql:host=$vHost;port=$vPort;dbname=$vData', '$vUser', '$vPass');
10
// Écriture, préparation et exécution de la requête
11
  $vSql = "SELECT a, b FROM t;"
12
  $vResultSet = $connexion->prepare($vSql);
13
  $vResultSet->execute();
14
// Traitement du résultat
15
  while ($vRow = $vResultSet->fetch(PDO::FETCH_ASSOC)) {
16
	  echo $row['a'];
17
    echo " ";
18
	  echo $row['b'];
19
	}
20
// Clôture de la connexion
21
  pg_close($vConn)
22
}
23
?>
<?php
function fSelect () {
// Connexion à la base de données
  $vHost = "foo.fr" ;
  $vPort = "5432" ;
  $vData = "myDatabase" ;
  $vUser = "me" ;
  $vPass = "secret" ;
  $vConn = new PDO('pgsql:host=$vHost;port=$vPort;dbname=$vData', '$vUser', '$vPass');
// Écriture, préparation et exécution de la requête
  $vSql = "SELECT a, b FROM t;"
  $vResultSet = $connexion->prepare($vSql);
  $vResultSet->execute();
// Traitement du résultat
  while ($vRow = $vResultSet->fetch(PDO::FETCH_ASSOC)) {
	  echo $row['a'];
    echo " ";
	  echo $row['b'];
	}
// Clôture de la connexion
  pg_close($vConn)
}
?>

ExempleProcédure VBA

CTRL+C pour copier, CTRL+V pour coller
1
Sub fSelect()
2
  vSql = "select a, b from t"
3
  Set vRs = CurrentDb.CreateQueryDef("", vSql).OpenRecordset
4
  Do While Not vRs.EOF
5
    Debug.Print vRs.Fields(0)
6
    Debug.Print vRs.Fields(1)
7
    vRs.MoveNext
8
  Loop
9
End Sub
Sub fSelect()
  vSql = "select a, b from t"
  Set vRs = CurrentDb.CreateQueryDef("", vSql).OpenRecordset
  Do While Not vRs.EOF
    Debug.Print vRs.Fields(0)
    Debug.Print vRs.Fields(1)
    vRs.MoveNext
  Loop
End Sub

ExempleProgramme Java

CTRL+C pour copier, CTRL+V pour coller
1
class fInsert {
2
public static void main(String[] args) {
3
try {
4
  // Connexion
5
  DriverManager.registerDriver (new OracleDriver());
6
  Connection vCon = DriverManager.getConnection("jdbc:oracle:thin:nf17/nf17@localhost:1521:test");
7
  // Exécution de la requête
8
  Statement vSt = vCon.createStatement();
9
  ResultSet vRs = vSt.executeQuery("SELECT a, b FROM  t");
10
  // Affichage du résultat
11
  while(vRs.next()){
12
   String vA = vRs.getString(1);
13
   String vB = vRs.getString(2);
14
   System.out.println(vA + " - " + vB));
15
  }
16
 } 
17
catch (Exception e) {
18
  e.printStackTrace();
19
 }
20
 }
21
}
class fInsert {
 public static void main(String[] args) {
 try {
  // Connexion
  DriverManager.registerDriver (new OracleDriver());
  Connection vCon = DriverManager.getConnection("jdbc:oracle:thin:nf17/nf17@localhost:1521:test");
  // Exécution de la requête
  Statement vSt = vCon.createStatement();
  ResultSet vRs = vSt.executeQuery("SELECT a, b FROM  t");
  // Affichage du résultat
  while(vRs.next()){
   String vA = vRs.getString(1);
   String vB = vRs.getString(2);
   System.out.println(vA + " - " + vB));
  }
 } 
 catch (Exception e) {
  e.printStackTrace();
 }
 }
}