subselect from examples example as400 select db2 mainframe jcl

select - from - sql as400 examples



Cómo escribir la instrucción DB2 SELECT en trabajo de descarga para delimitadores (4)

He pasado por esto ... parece una tontería, pero no pude entenderlo.

Quiero DESCARGAR una tabla pero con un delimitador ''|'' entre los campos. Aquí está el JCL usado para descargar la tabla:

//JS020 EXEC PGM=IKJEFT01, // DYNAMNBR=20 //* //SYSTSPRT DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //SYSPUNCH DD SYSOUT=* //* //SYSTSIN DD * DSN SYSTEM(XXXX) RUN PROGRAM(DSNTIAUL) PLAN(DSNTIAUL) PARM(''SQL'') //* //SYSREC00 DD DSN=TABLEA.UNLOAD.FILE, // DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,LRECL=80 //SYSIN DD * SELECT COLUMN1 ,''|'',COLUMN2 ,''|'',COLUMN3 ,''|'',COLUMN4 ,''|'',COLUMN5 FROM TABLEA WITH UR; /* //*

Rendimientos de producción

VALUEA..|VALUEB..|VALUEC..|VALUED..|VALUEE VALUEA..|VALUEB..|VALUEC..|VALUED..|VALUEE VALUEA..|VALUEB..|VALUEC..|VALUED..|VALUEE VALUEA..|VALUEB..|VALUEC..|VALUED..|VALUEE VALUEA..|VALUEB..|VALUEC..|VALUED..|VALUEE

Pero deseo tener más abajo

VALUEA|VALUEB|VALUEC|VALUED|VALUEE VALUEA|VALUEB|VALUEC|VALUED|VALUEE VALUEA|VALUEB|VALUEC|VALUED|VALUEE VALUEA|VALUEB|VALUEC|VALUED|VALUEE VALUEA|VALUEB|VALUEC|VALUED|VALUEE

No puedo entender por qué eso ... está precediendo al delimitador ''|''. ¿Alguna suposición qué significa ese valor? Gracias por tu interés.


Intente cambiar su SELECT siguiente manera:

SELECT COLUMN1 ,CHAR(''|''),COLUMN2 ,CHAR(''|''),COLUMN3 ,CHAR(''|''),COLUMN4 ,CHAR(''|''),COLUMN5 FROM TABLEA WITH UR;

Colocando la cadena constante ''|'' en su entrada crea una cadena de caracteres de longitud variable en la salida. Las cadenas de caracteres de longitud variable están precedidas por un campo binario de 2 bytes que proporciona la longitud de la cadena. En su caso, sería 01 (intente ver la salida con HEX ON). Como la longitud es un valor entero binario, no se muestra como esperabas.

La función escalar CHAR convierte una cadena de caracteres de longitud variable en una cadena de caracteres de longitud fija, que es lo que esperabas.

Nota: DSNTIAUL es diferente de SPUFI, que sospecho que usted está más familiarizado. DSNTIAUL no convierte datos seleccionados a caracteres, SPUFI sí lo hace. Entonces, si utilizó DSNTIAUL para seleccionar una columna que contenga datos numéricos (por ejemplo, DECIMAL), se escribirá en su archivo de salida en formato binario. Los datos VARCHAR se escribirán con un campo principal de 2 bytes (como el carácter ''|'' en su ejemplo). Las columnas definidas como carácter de longitud fija (por ejemplo, CHAR (5)) se escribirán como cadenas de caracteres de longitud fija (sin campo principal de longitud binaria).


`**SELECT COLUMN1 || CAST(''|'' AS CHAR(1)) || COLUMN2 || CAST(''|'' AS CHAR(1)) || COLUMN3 || CAST(''|'' AS CHAR(1)) || COLUMN4 || CAST(''|'' AS CHAR(1)) || COLUMN5 FROM TABLEA WITH UR;**


Use la función CHAR:

SELECT CHAR(COLUMN1 ,CHAR(''|''),COLUMN2 ,CHAR(''|''),COLUMN3 ,CHAR(''|''),COLUMN4 ,CHAR(''|''),COLUMN5) FROM TABLEA WITH UR;


SELECCIONAR recorte (COLUMN1) ||
''|'' || trim (COLUMN2) ||
''|'' || trim (COLUMN3) ||
''|'' || trim (COLUMN4) ||
''|'' || trim (COLUMN5) DE TABLEA CON UR;

En la instrucción de selección, recortará la salida de cada columna y anexará ''|'' utilizando el operador de concatenación. Como resultado de usar el ajuste, no habrá espacios entre la columna y ''|''. Para más referencia: IBM Manual On Trim