SQL Basics for RPG Developers
Chris Adair
Manager of Application Development National Envelope Vice President/Treasurer Metro Midrange Systems Assoc.
SQL HISTORY
Structured English Query Language (SEQUEL) IBM - Donald D. Chamberlin and Raymond F. Boyce in the early 1970s Based on Dr. E F COBBs relational model published in 1970 Relational Software, now Oracle, 1st to have a commercially available SQL base system, Oracle V2 - 1979
SQL on OS/400
Available on OS/400 V1R1 1988
Poor Performance Misconception! Poorly written statements caused the performance issue and the rumors spread like wildfire. SQE (SQL Query Engine) V5R2 (2002) Major changes to improve performance
SQL: Why?
Great for selecting/updating groups of data Columnar functions allow for field manipulation at record selection Aggregate columns in like rows for summarizing data IBM continues to enhance the SQL engine Let the engine pick the best logical view to process
Most Common Uses for System i Developers
Interactive SQL
STRSQL Quick ad-hoc queries Remote Database Connectivity
Embedded SQL
Alternative to native file I/O Allows for SQL functionality in RPG Remote Database Connectivity
Interactive SQL
Interactive SQL
STRSQL (Green Screen) System i Navigator Most Common SQL Statements
The SELECT statement is used to select data from a database. The result is stored in a result table, called the result-set. The UPDATE statement is used to update existing records in a table. The DELETE statement is used to delete rows in a table.
Interactive SQL
From a command line, STRSQL
Interactive SQL
Options F13, option 1, Change Session Attributes
Interactive SQL - Select
SQL SELECT Syntax
SELECT column_name(s) FROM table_name SELECT * FROM table_name
SQL WHERE clause syntax
SELECT column_name(s) FROM table_name WHERE column_name operator value
Interactive SQL - Select
Operators allowed on WHERE clause
= Equal <> Not Equal > Greater Than < Less Than >= Greater than or Equal <= Less than or Equal Between - Between an inclusive range Like Search for a pattern IN If you know the exact values you want to return
Interactive SQL - Select
Select * From F0116 Where ALCTY1 in('DALLAS','FT WORTH') Select * From F0116 Where ALAN8 in(112109,112117)
Remember: Quotes around alpha fields are mandatory.
Interactive SQL - Select
Interactive SQL - Select
System i Navigator
Interactive SQL - Select
Interactive SQL - Select
Interactive SQL - Select
Interactive SQL - Update
SQL UPDATE Syntax UPDATE table_name SET column1=value, column2=value2,... WHERE some_column=some_value
BE CAREFUL WHEN UPDATING RECORDS!
If you omit the WHERE, all records get updated. May be a good idea to backup your data to a SAVF prior to execution. Also, I make it a practice to get my WHERE clause set in a SELECT statement, then copy/paste to the UPDATE statement.
Interactive SQL - UPDATE
All rows Updated UPDATE NECCRPDTA/F3002 SET IXQNTY = ixqnty * 10
Selective Update UPDATE NECPRDDTA/F0101 SET ABAC02 = 'I05 WHERE abac02 = 'D04'
INTERACTIVE SQL - UPDATE
Use a sub-select to update a column with data from another file update stlrenum/fstlrenum set rnaitm = (select imaitm from F4101 where rnuitm = imlitm) where rnuitm in(select imlitm from f4101 where rnuitm = imlitm) Can be confusing, but POWERFUL!
Interactive SQL - Update
Like the SELECT, UPDATE can be run/saved in System i Navigator. For updates, BACKUP THE FILE! Be sure you know the Commitment Control
Interactive SQL - DELETE
SQL DELETE Syntax DELETE FROM table_name WHERE some_column=some_value
BE CAREFUL WHEN DELETING RECORDS!
Like the UPDATE statement, if you omit the WHERE clause, all records get deleted. BACK IT UP!
Interactive SQL - DELETE
DELETE From F42119 WHERE SDTRDJ < 110000
Remote Databases
Remote Databases
Use the CONNECT Statement to SQL other i5 OS partitions or any DB2 database supporting DRDA (Distributed Relational Database Architecture) What about Microsoft SQL Server or Oracle Not 100% compliant with DRDA standard. WebSphere Federation Server allows for connectivity to these databases.
Remote Databases
For i5 OS Partitions
Add remote system to Relational Database Directory (WRKRDBDIRE) STRSQL Issue a CONNECT statement
Does require credentials
VIOLA! You can now query the remote DB2 Database.
Remote Databases
Remote Databases
Embedded SQL
Types of Embedded SQL
Static SQL
The simplest form of embedding SQL in RPG Essentially, the SQL statement is hard coded in your program
Dynamic SQL
The SQL statement is assembled at run-time Requires more resource at run-time for preparing the statement Can become very sophisticated
Variables
Most variables defined in RPG can be used in a SQL statement
Variables are preceded by a colon, : . Some non-supported variables include
UDATE, UDAY, UMONTH, UYEAR Pointer Tables Named Constants
Source Members
New Source Types
SQLRPG SQLRPGLE Note: RPG II and Auto Report does not support SQL
Static SQL
Getting Started
Lets create a new SQLRPGLE Module Get_ALPH Well pass a Customer Number
Create a Static SQL That Will Query the Address Book Return the Name
Get_ALPH
Lets Make This A Service Program
Compile Get_ALPH with CRTRPGSQLI
Opt. 15 From SEU
Create the Service Program SP_F0101
CRTSRVPGM Specify Get_Alph as a module
Lets Give it a Test Ride
First, Well need a sample program to call our new module thats in the service program.
Lets name that code SampleA
SampleA Program
Lets run that in GUI Debug
Running in GUI Debugger
Specified Break Points
Call from Command Line
GUI Debugger
What If I Need To Return Multiple Rows
Result Sets The multiple rows returned by a SELECT statement Think of it as a temporary work file in memory Access to each individual row is achieved by the SQL cursor. The cursor is a pointer that keeps track of which row youre working with
More on Cursors
Working with the cursor requires several new SQL statements.
Declare Analyzes the Select statement and names the buffer area the result set is sent to Open After the Declare, the Open statement actually runs the SQL and returns the result set Fetch Reads the row that the cursor is on and advances the cursor Close Essentially, removes the cursor and result set.
Lets Take a Look at Some Cursors In Action
P591801 This module is used to report the daily bookings from the NY JDE system We pass in some parameters, query the F4211 and F42119 Process the data Return the Daily Bookings
The Declare and Open
The Fetch
The Close
The Scroll Cursor
If you have a need to process the result set more than once, youll need to specify the Dynamic Scroll Cursor
The Scroll cursor lets you control how the records in the results are read
Example: Dynamic Scroll Cursor
Dynamic SQL
The SQL statement is built within the RPG The SQL statement is verified at run time, not compile time Takes more overhead during run-time Makes an application very dynamic
Lets Take a Look at Dynamic SQL
JDEdwards P032002 Customer Ledger Inquiry A SQLRPG Program written in 1990 Based on user input, program either uses a LF or builds a SQL statement using the CAT opcode. Yikes!!! A Prepare statement is used to minimize the overhead for repeat executions
P032002 Building the String
P032002 Running the Prepare
P032002 ISDB Debug
Columnar Functions
Some SQL Columnar Functions
SUM This function returns the total of the supplied field values within the data set AVG This function returns an average of the field. COUNT How many rows meet the selection criteria Min or Max Returns Min or Max
Some Examples
Select SDAN8, SUM(SDAEXP) as Total From F42119 Where SDIVD > 107000 Group BY SDAN8 Order By Total Desc
Things to Watch For
Commitment Control
Query Manager
Query Manager
Use QUERY MANAGER
Build SQL statement in CL using variables Using STRQMQRY in your CL, call a QM Query passing the variables to execute the SQL Can be somewhat cryptic with the CAT(catenation) in the CL, but works well. Like building the OPNQRYF Only character data allowed
Query Manager
Query Manager
Query Manager
STRCGISQL
Using Apache, CGI, and SQL
Basic Apache server Allow CGI Run SQL Selects Data is displayed in CSV, HTML, TXT, or PDF
Quick data dump to Excel
STRCGISQL
STRCGISQL
STRCGISQL
STRCGISQL
http://www.mcpressonline.com/database/d b2/make-db2-data-downloads-easy-withstart-cgi-sql-session-strcgisql.html
Helpful Links
SQL Reference
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=/db2/rbafzmst02.htm SQL Error Codes http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=/rzala/rzalaml.htm An Introduction to SQL, with Paul Tuohy, System i Developer Dates 01/17/2012 - 01/26/2012 http://www.systeminetwork.com/events
Power Tips for iSeries Database and SQL, with Paul Conte http://www.amazon.com/Power-Tips-iSeries-Database-SQL/dp/1583040986
Questions?
cadair@natenv.com