Tengo un campo en la sección de almacenamiento de trabajo WS_CONTRACT_NUM, esto tiene algunos valores codificados de forma rígida de 15 caracteres de longitud. Pero los primeros 5 caracteres podrían ser cualquier cosa, mi pregunta es cómo puedo declarar esta variable en ese caso.

WORKING STORAGE
 01 WS_CONTRACT_NUM PIC X(15) VALUE '?????9999999999' --- > instead of '?' what can i give so that dynamic value can be substituted in my query.

Y estoy realizando una consulta de selección como esta:

EXEC SQL
  SELECT * FROM TABLE WHERE CONTRACT_NUM = :WS_CONTRACT_NUM
END-EXEC

¡Gracias de antemano!

1
user8898467 14 nov. 2017 a las 10:01

2 respuestas

La mejor respuesta

Está buscando SQL LIKE, consulte Documentos de IBM, donde

El carácter de subrayado (_) representa cualquier carácter individual. El signo de porcentaje (%) representa una cadena de cero o más caracteres.

Para usar esto en COBOL deberías

MOVE '_____9999999999' TO WS_CONTRACT_NUM 
EXEC SQL
  SELECT * FROM TABLE WHERE CONTRACT_NUM LIKE :WS_CONTRACT_NUM
END-EXEC

O (es menos probable que quieras hacerlo)

EXEC SQL
  SELECT * FROM TABLE WHERE CONTRACT_NUM LIKE '%9999999999'
END-EXEC

O tal vez (no tengo la opción de probar esto, por favor informe)

MOVE '%9999999999' TO WS_CONTRACT_NUM
*> this may search for the trailing spaces,
*> if it does define a smaller variable
EXEC SQL
  SELECT * FROM TABLE WHERE CONTRACT_NUM LIKE :WS_CONTRACT_NUM
END-EXEC
0
Simon Sobisch 14 nov. 2017 a las 18:46

PIC X es el símbolo de cualquier carácter. Entonces PIC X(5)9(10).

A menos que necesite hacer aritmética, puede salirse con la suya PIC X(15). El hecho de que algo se llame "Número" no significa que deba almacenarse como computacional. La mayoría de las veces es más eficiente almacenar campos llamados "Número" como datos de caracteres. Por ejemplo, Número de seguro social: rara vez tiene que sumar 1 o dividir por 2, por lo que puede salirse con la suya tratando el campo como PIC X.

O para agregar claridad en este caso:

01 ws-contract-value.
   05 first-part pic x(5).
   05 contract-number pic 9(10).   *> or x(10) unless you need to do math

Si necesita verificar que los datos de los caracteres sean todos dígitos, puede usar IF field IS NUMERIC ... para la validación de los campos PIC X.

0
Brian Tiffin 14 nov. 2017 a las 13:29