On Tue, 25 Feb 2014 08:43:05 -0800, Sri h Kolusu wrote:
>..., it is quite easy to generate
>another dynamic JCL to MERGE(Since the SORTING is already done) all these
>into a single dataset in the same job I have shown.
>
>Either way isn't it true for any utility about the concatenation limits
>unless OP writes a program to perform a SORT(bubble..) inside the program?
>
OK. Here's my highly Rexx-centric approach. It allocates only one data set
at a time, freeing it to allocate the next one.
It uses no temporary disk files other than what DFSort may use, and I
trust DFSort to do that very wisely.
It invokes IEBGENER for each input data set. I hope that if IEBGENER is
in LPA the overhead is tolerable. And, no, I don't perform a SORT(bubble..)
inside the program. I trust DFSort to do that much better than I could.
Two Rexx EXECs. Invoke the combination with "generpipe | pipesort".
user@HOST: head -99 generpipe pipesort
==> generpipe <==
/* Rexx */ signal on novalue; /* ***************************
Doc: Use IEBGENER to dynamically concatenate an unlimited
number of data sets.
*/
SYSRC = SYSCALLS( 'ON' )
address 'SYSCALL'
'dup 1' /* Alias for stdout. */
stdout = RETVAL
'dup2 2 1' /* Redirect Rexx output. */
trace R
say 'stdout saved in' stdout
RC = BPXWDYN( 'alloc dd(SYSPRINT) filedata(TEXT)' ,
'path(''/dev/fd/1'') pathopts(OWRONLY) reuse msg(WTP)' )
RC = BPXWDYN( 'alloc dd(SYSIN) filedata(TEXT)' ,
'path(''/dev/./null'') pathopts(ORDONLY) reuse msg(WTP)' )
RC = BPXWDYN( 'alloc dd(SYSUT2) filedata(RECORD)' ,
'path(''/dev/fd/'stdout''') pathopts(OWRONLY) reuse msg(WTP)' )
/* Arbitrary sample data sets. Or, the names could be read from a file;
perhaps from output of LISTDS.
*/
call PipeIt 'SYS1.MACLIB(ACI)'
call PipeIt 'SYS1.MACLIB(ATLAS)'
call PipeIt 'SYS1.MACLIB(BDTDACKN)'
/* ... (more ad lib. ... */
return( RC )
PipeIt:
RC = BPXWDYN( 'alloc dd(SYSUT1) shr dsn('''arg( 1 )''') reuse msg(WTP)' )
address 'LINKMVS' 'IEBGENER'
return( RC )
/* ********************************************************* */
==> pipesort <==
/* Rexx */ signal on novalue; /* ***************************
Doc: Use stdin as SORTIN; stdout as SORTOUT.
*/
SYSRC = SYSCALLS( 'ON' )
address 'SYSCALL'
'dup 1' /* Alias for stdout. */
stdout = RETVAL
'dup2 2 1' /* Redirect Rexx output. */
trace R
say 'stdout saved in' stdout
RC = BPXWDYN( 'alloc dd(SYSOUT) filedata(TEXT)' ,
'path(''/dev/fd/1'') pathopts(OWRONLY) reuse msg(WTP)' )
RC = BPXWDYN( 'alloc dd(SYSIN) reuse msg(WTP)' )
L.1 = ' SORT FIELDS=(73,8,CH,A)' /* Sort by seqence number field. */
address 'MVS' 'EXECIO 1 DISKW SYSIN (finis stem L.'
RC = BPXWDYN( 'alloc dd(SORTOUT) filedata(TEXT)' ,
'path(''/dev/fd/'stdout''') pathopts(OWRONLY) reuse msg(WTP)' )
RC = BPXWDYN( 'alloc dd(SORTIN) filedata(RECORD)' ,
'recfm(F,B) lrecl(80) blksize(8000)' ,
'path(''/dev/fd/0'') pathopts(ORDONLY) reuse msg(WTP)' )
address 'LINKMVS' 'ICEMAN'
return( RC )
/* ********************************************************* */
user@HOST:
-- gil
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN