Intégration JAVA & RPG.




Voyez d'abord les concepts Java Native Interface (JNI)

Projet JDBCR4


Scott Klement propose un projet en Open Source sur IBM i



Il s'agit d'un programme de service qui sert de passerelle avec JDBC , écrit en RPG pour RPG : JDBCR4


Téléchargement à l'adresse:    hhttps://www.scottklement.com/jdbc/RpgAndJdbc.zip
  la documentation est disponible à:  http://www.scottklement.com/presentations/External%20Databases%20from%20RPG.pdf

 

  Pour utiliser un Driver JDBC celui-ci doit être de type 4 (écrit en Java)  il est en général livré sous forme de fichier .jar

   Il vous faut impérativement connaitre la classe du driver et l'URL de connexion

 SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc:sqlserver://myserver.example.com:1433
  Jtds net.sourceforge.jtds.jdbc.Driver jdbc:jtds:sqlserver://myserver.example.com:1433
Oracle oracle.jdbc.OracleDriver jdbc:oracle:thin:@myserver.example.com:1521:myDataBase
Mysql com.mysql.jdbc.Driver jdbc:mysql://myserver.example.com/myDataBase
DB2 for i com.ibm.as400.access.AS400JDBCDriver jdbc:as400://myserver.example.com
DB2 (autre) com.ibm.db2.jcc.DB2Driver jdbc:db2://myserver.example.com:50000/myDataBase

Ecrivez ensuite un pgm java de test pour vérifier la validité du driver et la syntaxe de l'URL

import java.sql.*;

public class testJDBC
{
  public static void main (String[] parameters)
  {

    String sqlurl = "jdbc:<voir le tableau ci-dessus>";
    String userid = "uuuuu";
    String password = "pppp";
    Connection connection = null;

    try {
      DriverManager.registerDriver(new org.postgresql.Driver());
      connection = DriverManager.getConnection ( sqlurl, userid, password );
      Statement select = connection.createStatement ();
      ResultSet rs = select.executeQuery("SELECT nom,cepage FROM vins");

      while (rs.next ()) {
        System.out.println (rs.getString(1) + "," + rs.getString(2));
      }

    } catch (Exception e) {
      System.out.println ();
      System.out.println ("Erreur: " + e.getMessage());
    }

    try {
      if (connection != null)
        connection.close ();
    } catch (SQLException e) {
       // Ignore.
    }
  }
}

Exemples







Compilez par javac (sous QSH)

RPG


Ceci étant fait, passons au RPG

Nous travaillerons avec une base de test sur laquelle nous aurons passé le script suivant

create database test;

CREATE TABLE clients (
  nocli int(10) unsigned NOT NULL AUTO_INCREMENT,
  nom varchar(45) NOT NULL,
  dep decimal(2,0) DEFAULT NULL,
  datcrt date DEFAULT NULL,
      PRIMARY KEY (`nocli`)
);

INSERT INTO clients VALUES (1, 'premier client', 44, '2009-11-02');
INSERT INTO clients VALUES (2, 'deuxieme', 35, '2009-11-02');
INSERT INTO clients VALUES (3, 'et de trois', 22, '2009-10-31');


Connexion

Par exemple la propriété databaseName pour SQL server ou naming pour jt400

   (voir la liste des propriétés pour chaque driver)


Manipulation de données

une fois connecté, vous devez distinguer deux types d'ordres

 


Exemple

dow JDBC_nextRow(Result);
     Dept = JDBC_getCol(Result: 1);
     EmpNo = %int(JDBC_getCol(Result: 2));
     Name = JDBC_getCol(Result: 3);

       // traitement des données lues.
enddo;

Les valeurs retounées sont toujours caractère, au besoin, utilisez

Métadonnées

une fois le resultSet créé vous pouvez retouver les métaDonnées (description des zones, comme DSPFFD)


Instructions préparées

L'instruction est "compilée" à la volée et ses exécutions ultérieures seront plus rapides.

Elle peut contenir des marqueurs (?) représentant des valeurs fournies plus tard

Exemple

 /copy jdbc_h
dcl-s stmt          like(PreparedStatement);
dcl-s result       like(ResultSet );

Stmt = JDBC_PrepStmt( conn : 'Select nocli, raisoc +
                                      dep, ville           +
                                      from clients order by raisoc');

  if ( stmt = *null );
         // signaler l'erreur
 endif ;
 Result = JDBC_ExecPrepQry( Stmt );  if (Result = *null);
         // autre erreur
  endif;    // lecture des enregistrements comme vu plus haut

   JDBC_freeResult( result);    JDBC_freePrepStmt( stmt );

 

 

Les fonctions JDBC_getCol et JDBC_Setxxx (int, date, etc...)  possèdent un paramètre supplémentaire, facultatif, de type indicateur.

 

Procédures cataloguées

Il existe aussi des instructions pour appeler des procédures cataloguées :

JDBC_getString(), JDBC_getInt(), JDBC_getShort(), JDBC_getBoolean()  permettent de récupérer les valeurs des paramètres en sortie  


Contrôle de validation

Enfin, il y a deux instructions pour gérer les transactions

 

© Volubis