This TechTip explains how the iSeries can read data directly from DBMSs like Oracle and populate files on the iSeries. These files can then be used by native RPG applications for a variety of purposes. Once you understand the concept, you can integrate your existing RPG applications with data from Oracle, SQL Server, or any DBMS that supports JDBC. Let me show you how can you acquire data directly from DBMSs using RPG or CL.
We will follow a simple step-by-step approach:
- Write a simple Java class on your PC using a Java editor. I used WDSC, but you can use any Java editor.
- Compile and run the Java class on the PC, and make sure it works well.
- FTP the class file to the iSeries IFS folder of your choice.
- Call the class from a CL program.
The figure below demonstrates the methodology:
Note that none of this will work if you do not have the JDBC drivers for both IBM and Oracle in your classpath. If you are running this program from a PC using WDSC, you will need both drivers in your classpath, and the same is true for iSeries. On iSeries, you find the IBM drivers in the following folder:
/QIBM/PRODDATA/HTTP/PUBLIC/JT400/LIB/JT400.JAR
For Oracle, you will have to download JDBC drivers from Oracle's Web site. You will need pure Java JDBC drivers for Oracle.
Step 1: Write the Java Class
Here is the code for the Java class called Phone_TST:
import java.sql.*;
import com.ibm.as400.access.*;
class Phone_Tst {
public static void main (String[] args) throws SQLException
{
//Let's get a connection to the Oracle server
DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
//substitute your Oracle machine
//ip, port, databasename, username, password
Connection conn = DriverManager.getConnection
("jdbc:oracle:thin:@192.168.1.1:1521:database",
"userid", "Password");
Statement stmt = conn.createStatement();
ResultSet rset = stmt.executeQuery("Select * from contact ");
//Sql query to get data from Oracle.
//You are extracting a table called Contact.
//Let's say it only contains one field called Fname char 50
String system="10.10.10.1"; //Ip address of the AS/400
String collectionname="Joe"; //Library Name
String tablename="Contact"; //File name
Connection connection=null;
//Let's get a connection to the iSeries
//user id, password for iSeries
DriverManager.registerDriver (new AS400JDBCDriver());
connection=DriverManager.getConnection
("jdbc:as400://"+ system + "/" + collectionname,
"Userid", "Password");
// Insert statement
DatabaseMetaData dmd=connection.getMetaData();
PreparedStatement select = connection.prepareStatement
("insert into Joe.Contact (FNAME)
values (?)");
// Loop through the recordset we got from Oracle
// and write it to iSeries //JOHN/CONTACT
while (rset.next())
{
//Print col 1 for the recordset you receive from Oracle
System.out.println (rset.getString(1)); // Print col 1
select.setString(1,rset.getString(1));
select.executeUpdate(); //write to iSeries
}
stmt.close();
conn.close();
connection.close() ;
select.close();
System.out.println ("DONE!");
}
}
Step 2: Compile and Test It on Your PC
When you run this program, you will get something like this:
Robert
Richard
Ralf
Christopher
Susan
Perry
Christopher
Basically, what you are doing is reading data from Oracle and writing it to the iSeries file. First, you open a connection to Oracle and get your recordset from Oracle.
Second, you open a connection to iSeries, loop through the recordset you
got from Oracle, and write the value of the first column to the first column of the file called Contact in library JOE.
If you are doing this in WDSC, then you've already written records to the iSeries. If you
check on the iSeries in the file called JOE/Contact, you will see the records there. Obviously, the file JOE/Contact must exist with at least one text field with appropriate length.
Step 3: FTP the Class File to IFS
Now you need to send this class to the iSeries by FTPing it to the IFS. Let's say you have a folder call JOE under your root. FTP this class to folder JOE. Important note: Be sure you FTP the Phone_Tst.Class file, not the Phone_Tst.java file. That's a common mistake people make.
Do a WRKLNK '/folder'. In my case, I did a WRKLNK '/Malik' and made sure there
is a file there called Phone_Tst.class.
Step 4: Call the Class from a CL Program
Now use the following code to call this class from a CL program:
0001.00 PGM
0004.00 CHGENVVAR ENVVAR(CLASSPATH) +
0005.00 VALUE('/MALIK:/QIBM/PRODDATA/HTTP/PUBLIC/JT+
0006.00 400/LIB/JT400.JAR') /* NEED THAT FOR IBM +
0007.00 DRIVERS */
0008.00 MONMSG MSGID(CPF0000)
0009.00 JAVA CLASS(Phone_Tst)
0010.00 ENDPGM
****************** End of data ****************************************
Java is case-sensitive, so be sure to type the class name in the correct case.
On line 4.00, I added both '/Malik' and JT400 folders to my CLASSPATH variable.
This is because my Oracle drivers and the Java class Phone_Tst are in the '/Malik' folder.
You can add different folders to this CLASSPATH variable separated by ":". This is very similar to adding library list entries before calling the program. You must have the correct library list prior to calling the program. Java works the same way; it must have the correct CLASSPATH variable to find all the required objects that it will use in the program (class).
Once you call the CL program, your screen will look like this:
This simple example shows how you can integrate your iSeries with other DBMSs in a diverse computing environment.
Tahir Malik is a Senior iSeries programmer/analyst with Kos Pharmaceuticals, Inc. He has over a decade of iSeries development experience. He has worked extensively with iSeries Web-enablement/Cross platform integration projects, including client/server programming and intranet/extranet Web development using .NET. He can be reached at
LATEST COMMENTS
MC Press Online