Build SQL to Define Your Existing Files
June 5, 2002 Timothy Prickett Morgan
Note: The code accompanying this article is available for download here.
Hey, Ted:
We have always defined our files with DDS, but now we’re ready to use SQL for data definition.
![]() |
Do you have a good way to convert our DDS to SQL Data Definition Language (DDL) commands?
— Paul
IBM included just the tool you need in V5R1.
It’s the Generate Data Definition Language (QSQGNDDL) API.
You can read about it on the Web at http://publib.boulder.ibm.com/html/as400/v5r1/ic2924/index.htm?info/apis/qsqgnddl.htm .
I’ll give you an example of what it can do. Then I’ll give you some code you can use to generate DDL.
Here are DDS members for a physical file called CUSTOMER and a logical file called CUSTOMER2:
* Physical file CUSTOMER
A UNIQUE
A R CUSTREC
A COMPANY 3P 0 DFT(1)
A TEXT('Company')
A COLHDG(' ' ' '
'Comp')
A CUSTNBR 5P 0
A TEXT('Customer
account number')
A COLHDG('Cust'
'acct' 'nbr')
A CUSTNAME 20
A TEXT('Customer name')
A COLHDG(' ' 'Cust'
'name')
A CREDITLIM 7S 2
A TEXT('Credit limit')
A COLHDG(' ' 'Credit'
'limit')
A K COMPANY
A K CUSTNBR
* Logical file CUSTOMER2 A R CUSTREC PFILE(CUSTOMER) A COMPANY A CUSTNBR A CUSTNAME A K CUSTNAME A S COMPANY CMP(EQ 2)
Here is the SQL source member that QSQGNDDL created from the object definitions:
-- Generate SQL
-- Version: V5R1M0 010525
-- Generated on: 05/31/02 14:19:55
-- Relational Database:
-- Standards Option: DB2 UDB AS/400
CREATE TABLE ABCLIB/CUSTOMER (
-- SQL150B 10 REUSEDLT(*NO) in table CUSTOMER
in ABCLIB ignored.
-- SQL1509 10 Format name CUSTREC for CUSTOMER
in ABCLIB ignored.
COMPANY DECIMAL(3, 0) NOT NULL DEFAULT +1 ,
CUSTNBR DECIMAL(5, 0) NOT NULL DEFAULT 0 ,
CUSTNAME CHAR(20) CCSID 37 NOT NULL DEFAULT '' ,
CREDITLIM NUMERIC(7, 2) NOT NULL DEFAULT 0 ,
PRIMARY KEY( COMPANY , CUSTNBR ) ) ;
-- SQL150A 30
-- System trigger QSYS_TRIG_ABCLIB_____
CUSTOMER___000002 in ABCLIB ignored.
-- SQL150A 30
-- System trigger QSYS_TRIG_ABCLIB_____
CUSTOMER___000001 in ABCLIB ignored.
LABEL ON COLUMN ABCLIB/CUSTOMER
( COMPANY IS ' Comp' ,
CUSTNBR IS 'Cust acct nbr' ,
CUSTNAME IS ' Cust name' ,
CREDITLIM IS ' Credit limit' ) ;
LABEL ON COLUMN ABCLIB/CUSTOMER
( COMPANY TEXT IS 'Company' ,
CUSTNBR TEXT IS 'Customer account number' ,
CUSTNAME TEXT IS 'Customer name' ,
CREDITLIM TEXT IS 'Credit limit' ) ;
-- Generate SQL
-- Version: V5R1M0 010525
-- Generated on: 05/31/02 14:21:14
-- Relational Database:
-- Standards Option: DB2 UDB AS/400
CREATE VIEW ABCLIB/CUSTOMER2 (
-- SQL1509 10 Format name CUSTREC for
CUSTOMER2 in ABCLIB ignored.
-- SQL1506 30 Key or attribute for
CUSTOMER2 in ABCLIB ignored.
COMPANY ,
CUSTNBR ,
CUSTNAME )
AS
SELECT
COMPANY ,
CUSTNBR ,
CUSTNAME
FROM ABCLIB/CUSTOMER
WHERE
COMPANY = +2 ;
I wrote a quick utility to run the API. I call it GENDDL. It consists of a command object, an ILE CL program called GENDDL01C, and an ILE RPG program called GENDDL01R. It’s not meant to be a general-purpose utility–I hard-wired a lot of the options in the template parameter, the first parameter that is passed to the API. I have used it to generate SQL code for tables, views, indexes, and functions and it has worked for me, but I don’t make any guarantees. You will need to change it to suit your purposes.
These are the commands I used to generate the SQL for the CUSTOMER and CUSTOMER2 files in the examples above.
GENDDL OBJECT(CUSTOMER) + OBJECTLIB(ABCLIB) OBJECTTYPE(TABLE) + SRCFILE(SQLGEN) SRCLIB(QTEMP) SRCMBR(CUS) + REPLACE(Y) GENDDL OBJECT(CUSTOMER2) + OBJECTLIB(ABCLIB) OBJECTTYPE(VIEW) + SRCFILE(SQLGEN) SRCLIB(QTEMP) SRCMBR(CUS) + REPLACE(N)
I hope this helps.
— Ted
/******************************************************/
/* Generate SQL DDL for a database object. */
/* No warranty implied. Use at your own risk. */
/* */
/* To compile: */
/* CRTCMD CMD(XXX/GENDDL) PGM(*LIBL/GENDDL01C) + */
/* SRCFILE(XXX/QCMDSRC) SRCMBR(GENDDL) */
/*****************************************************/
CMD PROMPT('Generate SQL DDL')
PARM KWD(OBJECT) TYPE(*CHAR) LEN(258) MIN(1) +
EXPR(*YES) PROMPT('Object name')
PARM KWD(OBJECTLIB) TYPE(*CHAR) LEN(258) MIN(1) +
EXPR(*YES) PROMPT('Object library')
PARM KWD(OBJECTTYPE) TYPE(*CHAR) LEN(10) +
RSTD(*YES) VALUES(TABLE VIEW ALIAS +
CONSTRAINT FUNCTION INDEX SCHEMA TRIGGER +
TYPE) MIN(1) EXPR(*YES) PROMPT('Object type')
PARM KWD(SRCFILE) TYPE(*NAME) LEN(10) MIN(1) +
EXPR(*YES) PROMPT('Source physical file')
PARM KWD(SRCLIB) TYPE(*NAME) LEN(10) +
SPCVAL((*CURLIB) (*LIBL)) MIN(1) +
EXPR(*YES) PROMPT('Source library')
PARM KWD(SRCMBR) TYPE(*NAME) LEN(10) +
SPCVAL((*FIRST) (*LAST)) MIN(1) +
EXPR(*YES) PROMPT('Source member')
PARM KWD(CRTSRC) TYPE(*CHAR) LEN(4) RSTD(*YES) +
DFT(*NO) VALUES(*YES *NO) SPCVAL((*YES +
'1') (*NO '0')) EXPR(*YES) CHOICE('*YES, +
*NO') PROMPT('Create file and/or member?')
PARM KWD(REPLACE) TYPE(*CHAR) LEN(8) RSTD(*YES) +
DFT(*APPEND) VALUES(*REPLACE *APPEND) +
SPCVAL((*REPLACE '1') (*APPEND '0')) +
EXPR(*YES) CHOICE('*REPLACE, *APPEND') +
PROMPT('Replace or append to source?')
/******************************************************/
/* Generate SQL DDL for a database object. */
/* No warranty implied. Use at your own risk. */
/* */
/* To compile: */
/* CRTBNDCL PGM(XXX/GENDDL01C) SRCFILE(XXX/QCLSRC) + */
/*SRCMBR(GENDDL01C) DFTACTGRP(*NO) ACTGRP(*NEW) */
/*****************************************************/
pgm (&obj &objlib &objtype +
&srcfile &srclib &srcmbr &crtsrc &replace)
dcl &obj *char 258
dcl &objlib *char 258
dcl &objtype *char 10
dcl &srcfile *char 10
dcl &srclib *char 10
dcl &srcmbr *char 10
dcl &replace *lgl 1
dcl &crtsrc *lgl 1
dcl &error *char 7
monmsg cpf0000 exec(goto error)
chkobj obj(&srclib/&srcfile) objtype(*file) +
aut(*objexist)
monmsg cpf9801 exec(do)
if &crtsrc +
then( crtsrcpf (&srclib/&srcfile))
enddo
chkobj obj(&srclib/&srcfile) objtype(*file) +
mbr(&srcmbr) aut(*objexist)
monmsg cpf9815 exec(do)
if &crtsrc +
then( addpfm &srclib/&srcfile &srcmbr)
enddo
call genddl01r (&obj &objlib &objtype +
&srcfile &srclib &srcmbr &replace &error)
if (&error *eq ' ') do
sndpgmmsg msgid(cpf9898) msgf(qcpfmsg) +
msgdta('Generation of DDL was successful') +
msgtype(*comp)
enddo
else do
sndpgmmsg msgid(cpf9898) msgf(qcpfmsg) +
msgdta('Generation of DDL failed. See +
source member for errors') msgtype(*escape)
enddo
return
error:
sndpgmmsg msgid(cpf9898) msgf(qcpfmsg) +
msgdta('Generation of DDL failed with +
an unexpected error') msgtype(*escape)
monmsg cpf0000
endpgm
* Member GENDDL01R, type RPGLE
*
* Generate SQL DDL for a database object.
* No warranty implied. Use at your own risk.
*
* To compile:
* CRTBNDRPG PGM(XXX/GENDDL01R) +
* SRCFILE(XXX/QRPGLESRC) SRCMBR(GENDDL01R)
H dftactgrp(*no) actgrp(*caller)
D Template ds 583
D DBObjName 258
D DBObjLib 258
D DBObjType 10
D DBSrcFile 10
D DBSrcLib 10
D DBSrcMbr 10
D Severity 10i 0 inz(30)
D Replace 1
D StmtFmtOpt 1 inz('0')
D DateFmt 3 inz('ISO')
D DateSep 1
D TimeFmt 3 inz('ISO')
D TimeSep 1
D NamingOpt 3 inz('SYS')
D DecimalPt 1 inz('.')
D StdsOpt 1 inz('0')
D DropOpt 1 inz('0')
D MsgLvl 10i 0 inz(0)
D CommentOpt 1 inz('1')
D LabelOpt 1 inz('1')
D HdrOpt 1 inz('1')
D TemplateLength s 10i 0 inz(%size(Template))
D TemplateFormat s 8 inz('SQLR0100')
D
D ErrorDS ds 16
D BytesProv 10i 0 inz(15)
D BytesAvail 10i 0
D ExceptionID 7
D
D GenDDL pr extpgm('QSQGNDDL')
D Template 583
D Length 10i 0
D Format 8
D ErrorDS 12
D
D*entry plist
D GenDDL01R pr extpgm('GENDDL01R')
D PIObjName 258
D PIObjLib 258
D PIObjType 10
D PISrcFile 10
D PISrcLib 10
D PISrcMbr 10
D PIReplace 1
D PIError 7
D
D GenDDL01R pi
D PIObjName 258
D PIObjLib 258
D PIObjType 10
D PISrcFile 10
D PISrcLib 10
D PISrcMbr 10
D PIReplace 1
D PIError 7
/free
DBObjName = PIObjName;
DBObjLib = PIObjLib;
DBObjType = PIObjType;
DBSrcFile = PISrcFile;
DBSrcLib = PISrcLib;
DBSrcMbr = PISrcMbr;
if (PIReplace = '1') or
(PIReplace = 'Y') or
(PIReplace = 'y');
Replace = '1';
else;
Replace = '0';
endif;
GenDDL (Template: TemplateLength:
TemplateFormat: ErrorDS);
PiError = ExceptionID;
*inlr = *on;
/end-free
| Sponsored By |
|
Application Modernization made Easy!
newlook allows you to rapidly re-face, web-enable, and extend your applications. And, newlook will integrate your iSeries applications with desktop applications like Notes, Excel, Add file transfer, DDM, display and printer emulation using secure browser-based deployment and move to Download your FREE evaluation at www.looksoftware.com/down_main.htm
|


