다양한 애플리케이션의 사용환경 지원
본 장에서는 다양한 애플리케이션에서 ProSort의 기능들을 사용하는 방법을 설명한다.
1. ProSort 명령어
prosort 명령어는 ProSort가 설치된 머신에서 실행해야 한다. 또한, 명령어를 실행하기 전에 반드시 환경 변수가 제대로 설정되어 있어야 한다.
prosort 명령어의 사용법은 다음과 같다.
prosort [-h] [-v] [-s] [-j] [script file]
| 옵션 | 설명 |
|---|---|
-h |
|
-v |
ProSort의 버전 정보를 보여주는 옵션이다. |
-s |
스크립트 파일을 실행한 후 상태 정보를 보여주는 옵션이다. -s 옵션을 사용하면 다음의 상태 정보를 확인할 수 있다.
|
-j |
스크립트 파일을 실행한 후 프로파일의 정보를 보여주는 옵션이다. 프로파일의 정보는 제품의 버전에 따라 변경될 수 있으므로, 본 안내서에서는 별도로 설명하지 않는다. |
script file |
스크립트 파일의 디렉터리 경로와 이름을 입력한다. 생략하면 표준 입력을 통해 스크립트 파일을 입력받는다. |
2. ProSort API 함수
ProSort는 C 함수의 형태로 API를 제공한다. 모든 함수는 반환값을 가지며, 성공할 경우에는 0을 반환하고 실패할 경우에는 음수 값을 반환한다.
API로 제공되는 함수는 다음과 같다.
| 함수 | 설명 |
|---|---|
스크립트(script)의 연산을 모두 수행하는 함수이다. |
|
ProSort 실행에 필요한 정보를 초기화한다. |
|
모든 입출력 파라미터가 prosort_setup 함수와 동일하다. |
|
SORT 연산을 할 때 데이터를 레코드별로 입력하는 함수이다. |
|
SORT 연산을 할 때 데이터 입력이 끝났음을 나타내는 함수이다. |
|
연산의 결과를 레코드 건별로 가져오는 함수이다. |
|
모든 연산에 사용한 리소스를 반환하는 함수이다. |
|
에러가 발생했을 때 에러 번호를 가져오는 함수이다. |
|
에러가 발생했을 때 에러 메시지를 가져오는 함수이다. |
2.1. prosort_run_script
스크립트(script)의 연산을 모두 수행하는 함수이다.
-
프로토타입
int prosort_run_script(const char *const script);
-
파라미터
파라미터 설명 script
연산에 사용할 ProSort의 스크립트(script)이다.
-
예제
#include <stdio.h> #include <stdlib.h> #include "prosort.h" int main(int argc, char **argv) { int rc; char *script = "DEFREC FIXED,SIZE=256 " "MEMORY 500M " "INFILE = (x1,100M, x2, 100M, x3, 100M, x4, 100M) " "SORT FIELDS=(1,13,AC,A) " "OUTFIL FNAMES = xresult "; rc = prosort_run_script (script); if (rc < 0) { fprintf(stderr,"Error[%d]:\n", rc); fprintf(stderr,"%s\n", ps_err_code_to_cause(rc)); fprintf(stderr,"%s\n", ps_err_code_to_action(rc)); exit (rc); } return 0; }
2.2. prosort_setup
ProSort 실행에 필요한 정보를 초기화한다. 단, prosort_run_script 함수를 사용할 경우에는 prosort_setup 함수를 호출할 필요가 없다.
-
프로토타입
typedef int (*callback_func_t)(char **data_buf_addr, int *data_buf_length); int prosort_setup (const char *prosort_script, callback_func_t *data_fetch_callback_funcs, int data_fetch_callback_func_cnt, void **ptr_prosort_context); -
파라미터
파라미터 설명 *prosort_script
ProSort API에서 사용할 스크립트이다.
*data_fetch_callback_funcs
MERGE 및 COPY 연산을 할 때에는 데이터를 별도로 입력받지 않고, callback function를 통해 입력 받는다.
특히, MERGE 연산을 할 때에는 여러 callback function를 입력받을 수 있으므로, callback function의 배열 주소를 파라미터로 받는다.
data_fetch_callback_func_cnt
callback function의 개수이다.
**ptr_prosort_context
연산 수행을 위해 필요한 컨텍스트(context)의 정보를 얻는다. 생성된 컨텍스트는 다른 API에 적용하여 연산을 수행할 수 있다.
-
예제
#include <stdio.h> #include <stdlib.h> #include "prosort.h" static void print_err_msg(int ec) { fprintf(stderr,"Error[%d]:\n", ec); fprintf(stderr,"%s\n", ps_err_code_to_cause(ec)); fprintf(stderr,"%s\n", ps_err_code_to_action(ec)); fprintf(stderr,"%s\n", ps_err_get_last_msg()); } /* 16byte 레코드 */ #define REC_LEN 16 #define RAND (char) (rand() % 24) + 'A' int main(int argc, char **argv) { int i = 0; int j = 0; int rc = 0; void *ps_ctx; char buf[REC_LEN]; const char *script = "MEMORY 100M\n" "DATASIZE 100M\n" "DEFREC FIXED, SIZE=16\n" "SORT FIELDS = (1,8,CH,A)\n"; /* 스크립트 설정 */ rc = prosort_setup (script, NULL, 0, &ps_ctx); if (rc < 0) { print_err_msg (rc); exit (rc); } /* 레코드 입력 */ for (i = 0; i < 100; i++) { for (j = 0; j < REC_LEN - 1; j++) buf[j] = RAND; buf[j] = 0; rc = prosort_release_record (ps_ctx, buf, REC_LEN); if (rc < 0) { print_err_msg (rc); exit (rc); } } /* 레코드 입력 완료 */ prosort_release_end (ps_ctx); do { char outbuf[REC_LEN]; char *outbufs[1]; unsigned int len = REC_LEN; outbufs[0] = outbuf; rc = prosort_return_record (ps_ctx, outbufs, &len); if (rc < 0) { print_err_msg (rc); exit (rc); } if (len == 0) break; printf ("%s\n", outbuf); } while (1); prosort_end (ps_ctx); return 0; }
2.3. prosort_setup_with_userexit
모든 입출력 파라미터가 prosort_setup 함수와 동일하다. 단, func_e15, func_e32, func_e35, func_e61 파라미터는 제외이다.
-
프로토타입
typedef int (*user_exit_func_t)(const void *rec_addr, const int rec_len, int file_no, void **ret_rec_addr, int *ret_rec_len); int prosort_setup_with_userexit(const char *prosort_script, callback_func_t *data_fetch_callback_funcs, int data_fetch_callback_func_cnt, user_exit_func_t func_e15, user_exit_func_t func_e32, user_exit_func_t func_e35, user_exit_func_t func_e61, void **ptr_prosort_context); -
파라미터
파라미터 설명 *prosort_script
ProSort API에서 사용할 스크립트이다.
*data_fetch_callback_funcs
MERGE 및 COPY 연산을 할 때에는 데이터를 별도로 입력받지 않고, callback function를 통해 입력 받는다.
특히, MERGE 연산을 할 때에는 여러 callback function를 입력받을 수 있으므로, callback function의 배열 주소를 파라미터로 받는다.
data_fetch_callback_func_cnt
callback function의 개수이다.
func_e15
User Exit Function E15 이다.
func_e32
User Exit Function E32 이다.
func_e35
User Exit Function E35 이다.
func_e61
User Exit Function E61 이다.
**ptr_prosort_context
연산 수행을 위해 필요한 컨텍스트의 정보를 얻는다. 생성된 컨텍스트는 다른 API에 적용하여 연산을 수행할 수 있다.
-
예제
int func_e15(const void *rec_addr, const int rec_len, int file_no, void **ret_rec_addr, int *ret_rec_len) { ... } int main(int argc, char **argv) { int rc; void *ps_ctx; const char *script = "DEFREC FIXED,SIZE=150 \n" "DATASIZE 2M \n" "MEMORY 512M \n" "WORKSPACE = (./) \n" "SORT FIELDS=(1,2,A),FORMAT=BI \n" "INCLUDE COND=(1,2,CH,EQ,C'12',OR,1,2,CH,EQ,C'22',OR,1,2,CH,EQ,C'32') \n" "OUTFIL FNAMES=OUT1 \n"; rc = prosort_setup_with_userexit(script, NULL, 0, func_e15, NULL, NULL, NULL, &ps_ctx); ... }
2.4. prosort_release_record
SORT 연산을 할 때 데이터를 레코드별로 입력하는 함수이다.
-
프로토타입
int prosort_release_record(void *prosort_context, const char *record, const unsigned int record_length); -
파라미터
파라미터 설명 *prosort_context
prosort_setup 함수에서 생성한 컨텍스트를 전달한다.
*record
레코드가 있는 주소이다.
record_length
레코드의 길이이다.
-
예제
#include <stdio.h> #include <stdlib.h> #include "prosort.h" static void print_err_msg(int ec) { fprintf(stderr,"Error[%d]:\n", ec); fprintf(stderr,"%s\n", ps_err_code_to_cause(ec)); fprintf(stderr,"%s\n", ps_err_code_to_action(ec)); fprintf(stderr,"%s\n", ps_err_get_last_msg()); } /* 16byte 레코드 */ #define REC_LEN 16 #define RAND (char) (rand() % 24) + 'A' int main(int argc, char **argv) { int i = 0; int j = 0; int rc = 0; void *ps_ctx; char buf[REC_LEN]; const char *script = "MEMORY 100M\n" "DATASIZE 100M\n" "DEFREC FIXED, SIZE=16\n" "SORT FIELDS = (1,8,CH,A)\n"; /* 스크립트 설정 */ rc = prosort_setup (script, NULL, 0, &ps_ctx); if (rc < 0) { print_err_msg (rc); exit (rc); } /* 레코드 입력 */ for (i = 0; i < 100; i++) { for (j = 0; j < REC_LEN - 1; j++) buf[j] = RAND; buf[j] = 0; rc = prosort_release_record (ps_ctx, buf, REC_LEN); if (rc < 0) { print_err_msg (rc); exit (rc); } } /* 레코드 입력 완료 */ prosort_release_end (ps_ctx); do { char outbuf[REC_LEN]; char *outbufs[1]; unsigned int len = REC_LEN; outbufs[0] = outbuf; rc = prosort_return_record (ps_ctx, outbufs, &len); if (rc < 0) { print_err_msg (rc); exit (rc); } if (len == 0) break; printf ("%s\n", outbuf); } while (1); prosort_end (ps_ctx); return 0; }
2.5. prosort_release_end
SORT 연산을 할 때 데이터 입력이 끝났음을 나타내는 함수이다.
-
프로토타입
int prosort_release_end(void *prosort_context);
-
파라미터
파라미터 설명 *prosort_context
prosort_setup 함수에서 생성한 컨텍스트를 전달한다.
-
예제
#include <stdio.h> #include <stdlib.h> #include "prosort.h" static void print_err_msg(int ec) { fprintf(stderr,"Error[%d]:\n", ec); fprintf(stderr,"%s\n", ps_err_code_to_cause(ec)); fprintf(stderr,"%s\n", ps_err_code_to_action(ec)); fprintf(stderr,"%s\n", ps_err_get_last_msg()); } /* 16byte 레코드 */ #define REC_LEN 16 #define RAND (char) (rand() % 24) + 'A' int main(int argc, char **argv) { int i = 0; int j = 0; int rc = 0; void *ps_ctx; char buf[REC_LEN]; const char *script = "MEMORY 100M\n" "DATASIZE 100M\n" "DEFREC FIXED, SIZE=16\n" "SORT FIELDS = (1,8,CH,A)\n"; /* 스크립트 설정 */ rc = prosort_setup (script, NULL, 0, &ps_ctx); if (rc < 0) { print_err_msg (rc); exit (rc); } /* 레코드 입력 */ for (i = 0; i < 100; i++) { for (j = 0; j < REC_LEN - 1; j++) buf[j] = RAND; buf[j] = 0; rc = prosort_release_record (ps_ctx, buf, REC_LEN); if (rc < 0) { print_err_msg (rc); exit (rc); } } /* 레코드 입력 완료 */ prosort_release_end (ps_ctx); do { char outbuf[REC_LEN]; char *outbufs[1]; unsigned int len = REC_LEN; outbufs[0] = outbuf; rc = prosort_return_record (ps_ctx, outbufs, &len); if (rc < 0) { print_err_msg (rc); exit (rc); } if (len == 0) break; printf ("%s\n", outbuf); } while (1); prosort_end (ps_ctx); return 0; }
2.6. prosort_return_record
연산의 결과를 레코드 건별로 가져오는 함수이다. 출력은 OUTFIL로 인해 여러 개가 나올 수 있으므로, 버퍼의 배열로 가져온다. 0 번째는 SORTOUT (OUTFIL을 수행하지 않은 출력)이 나오며, 스크립트에 정의된 OUTFIL이 순서대로 출력된다.
-
프로토타입
int prosort_return_record(void *prosort_context, char **output_buffer, unsigned int *output_buffer_length); -
파라미터
파라미터 설명 *prosort_context
prosort_setup 함수에서 생성한 컨텍스트를 전달한다.
**output_buffer
출력 레코드를 가져올 버퍼 주소의 배열이다.
*output_buffer_length
출력 레코드의 크기를 저장할 배열이다.
-
예제
#include <stdio.h> #include <stdlib.h> #include "prosort.h" static void print_err_msg(int ec) { fprintf(stderr,"Error[%d]:\n", ec); fprintf(stderr,"%s\n", ps_err_code_to_cause(ec)); fprintf(stderr,"%s\n", ps_err_code_to_action(ec)); fprintf(stderr,"%s\n", ps_err_get_last_msg()); } /* 16byte 레코드 */ #define REC_LEN 16 #define RAND (char) (rand() % 24) + 'A' int main(int argc, char **argv) { int i = 0; int j = 0; int rc = 0; void *ps_ctx; char buf[REC_LEN]; const char *script = "MEMORY 100M\n" "DATASIZE 100M\n" "DEFREC FIXED, SIZE=16\n" "SORT FIELDS = (1,8,CH,A)\n"; /* 스크립트 설정 */ rc = prosort_setup (script, NULL, 0, &ps_ctx); if (rc < 0) { print_err_msg (rc); exit (rc); } /* 레코드 입력 */ for (i = 0; i < 100; i++) { for (j = 0; j < REC_LEN - 1; j++) buf[j] = RAND; buf[j] = 0; rc = prosort_release_record (ps_ctx, buf, REC_LEN); if (rc < 0) { print_err_msg (rc); exit (rc); } } /* 레코드 입력 완료 */ prosort_release_end (ps_ctx); do { char outbuf[REC_LEN]; char *outbufs[1]; unsigned int len = REC_LEN; outbufs[0] = outbuf; rc = prosort_return_record (ps_ctx, outbufs, &len); if (rc < 0) { print_err_msg (rc); exit (rc); } if (len == 0) break; printf ("%s\n", outbuf); } while (1); prosort_end (ps_ctx); return 0; }
2.7. prosort_end
모든 연산에 사용한 리소스를 반환하는 함수이다.
-
프로토타입
int prosort_end(void *prosort_context);
-
파라미터
파라미터 설명 *prosort_context
prosort_setup 함수에서 생성한 컨텍스트를 전달한다.
-
예제
#include <stdio.h> #include <stdlib.h> #include "prosort.h" static void print_err_msg(int ec) { fprintf(stderr,"Error[%d]:\n", ec); fprintf(stderr,"%s\n", ps_err_code_to_cause(ec)); fprintf(stderr,"%s\n", ps_err_code_to_action(ec)); fprintf(stderr,"%s\n", ps_err_get_last_msg()); } /* 16byte 레코드 */ #define REC_LEN 16 #define RAND (char) (rand() % 24) + 'A' int main(int argc, char **argv) { int i = 0; int j = 0; int rc = 0; void *ps_ctx; char buf[REC_LEN]; const char *script = "MEMORY 100M\n" "DATASIZE 100M\n" "DEFREC FIXED, SIZE=16\n" "SORT FIELDS = (1,8,CH,A)\n"; /* 스크립트 설정 */ rc = prosort_setup (script, NULL, 0, &ps_ctx); if (rc < 0) { print_err_msg (rc); exit (rc); } /* 레코드 입력 */ for (i = 0; i < 100; i++) { for (j = 0; j < REC_LEN - 1; j++) buf[j] = RAND; buf[j] = 0; rc = prosort_release_record (ps_ctx, buf, REC_LEN); if (rc < 0) { print_err_msg (rc); exit (rc); } } /* 레코드 입력 완료 */ prosort_release_end (ps_ctx); do { char outbuf[REC_LEN]; char *outbufs[1]; unsigned int len = REC_LEN; outbufs[0] = outbuf; rc = prosort_return_record (ps_ctx, outbufs, &len); if (rc < 0) { print_err_msg (rc); exit (rc); } if (len == 0) break; printf ("%s\n", outbuf); } while (1); prosort_end (ps_ctx); return 0; }
2.8. prosort_get_error_number
에러가 발생했을 때 에러 번호를 가져오는 함수이다.
-
프로토타입
int prosort_get_error_number(void *prosort_context);
-
파라미터
파라미터 설명 *prosort_context
prosort_setup 함수에서 생성한 컨텍스트를 전달한다.
-
예제
int main(int argc, char **argv) { int rc; void *ps_ctx; const char *script = "DEFREC FIXED,SIZE=150 \n" "DATASIZE 2M \n" "MEMORY 512M \n" "WORKSPACE = (./) \n" "SORT FIELDS=(1,2,A),FORMAT=BI \n" "INCLUDE COND=(1,2,CH,EQ,C'12',OR,1,2,CH,EQ,C'22',OR,1,2,CH,EQ,C'32') \n" "OUTFIL FNAMES=OUT1 \n"; rc = prosort_setup(script, NULL, 0, &ps_ctx); if(rc < 0) { fprintf(stderr, "Error number is %d\n", prosort_get_error_number(ps_ctx)); } ... }
2.9. prosort_get_error_message
에러가 발생했을 때 에러 메시지를 가져오는 함수이다.
-
프로토타입
int prosort_get_error_message(void *prosort_context, char *error_message_buffer, unsigned int *error_message_length); -
파라미터
파라미터 설명 *prosort_context
prosort_setup 함수에서 생성한 컨텍스트를 전달한다.
*error_message_buffer
에러 메시지를 가져올 버퍼의 주소이다.
*error_message_length
에러 메시지의 길이이다.
-
예제
#define ERR_MSG_MAXLEN 1024 int main(int argc, char **argv) { int rc; void *ps_ctx; char *err_msg; unsigned int err_msg_len; const char *script = "DEFREC FIXED,SIZE=150 \n" "DATASIZE 2M \n" "MEMORY 512M \n" "WORKSPACE = (./) \n" "SORT FIELDS=(1,2,A),FORMAT=BI \n" "INCLUDE COND=(1,2,CH,EQ,C'12',OR,1,2,CH,EQ,C'22',OR,1,2,CH,EQ,C'32') \n" "OUTFIL FNAMES=OUT1 \n"; err_msg = (char *)malloc(sizeof(char) * ERR_MSG_MAXLEN); err_msg_len = ERR_MSG_MAXLEN; rc = prosort_setup(script, NULL, 0, &ps_ctx); if(rc < 0) { prosort_get_error_message(ps_ctx, err_msg, &err_msg_len); fprintf(stderr, "Error message is %s\n", err_msg); } ... }
3. OpenFrame Batch에서 ProSort의 기동
OpenFrame에서는 ProSort를 직접 실행하지 않고 중간에 DFSORT 유틸리티를 통해서 입력 데이터 셋을 정렬, 병합, 복사, 필터링, 재편집, 합산 등을 수행하여 출력 데이터 셋을 생성한다.
OpenFrame에서 Sort 작업을 수행 하기 위해서는 작업 제어문(JCL)을 작성해야 하며, 작성된 작업 제어문을 배치 작업(JOB)으로 OpenFrame Batch에 제출해야 한다.
|
배치 작업에 대한 자세한 설명은 OpenFrame "Batch 안내서" 또는 OpenFrame "TJES 안내서"를 참고한다. |
3.1. 작업 제어문
작업 제어문은 크게 JOB 문, EXEC 문, DD 문, /* 등으로 이루어져 있다.
|
JCL 문법에 대한 자세한 설명은 OpenFrame "JCL 문법 안내서"를 참고한다. |
-
JOB 문
작업의 선두에 위치하는 제어문이며, 작업의 시작을 알림과 동시에 그 작업의 성격을 정의한다.
기술 방법의 예는 다음과 같다.
//SORT00 JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
-
EXEC 문
하나의 JOB은 여러 개의 STEP으로 이루어져 있으며, EXEC 문은 JOB STEP의 선두에 위치한다. 프로그램의 명칭 및 프로그램에 전달할 파라미터 등을 지정한다. ProSort를 이용해서 소트 작업을 실해하기 위해서는 PGM=DFSORT라고 기술해야 한다.
기술 방법의 예는 다음과 같다.
//SORT EXEC PGM=DFSORT,REGION=2M
-
DD 문
SORT를 실행할 때 사용하게 되는 데이터 셋의 명칭, 속성 등을 다음 항목을 통해 지정한다.
항목 설명 SYSIN
SORT의 제어문을 입력하기 위한 데이터 셋이다.
일반적으로 DD *로 시스템 입력 스트림을 이용한다. SORT 제어문은 ProSort의 제어문이 아니라 DFSORT 제어문에 기초하여 작성해야 한다.
SYSOUT
제어문의 리스팅 및 메시지를 출력하기 위한 데이터 셋이다.
일반적으로 시스템의 출력 스트림을 이용한다.
SORTIN
SORT/COPY 처리의 입력 데이터 셋이다.
SORTINnn
MERGE 처리의 입력 데이터 셋이다. 데이터 셋의 이름은 반드시 SORTIN01부터 순서대로 정의할 필요는 없으나, 같은 번호를 중복하여 사용할 수는 없다.
SORTINWKnn
SORT 처리 중에 작업용 영역으로 사용하는 데이터 셋이다.
SORTOUT
SORT/MERGE/COPY 처리 결과를 출력하는 데이터 셋이다.
SORTIN 또는 SORTINnn이 고정길이(FB)이면 SORTOUT도 고정길이, SORTIN 또는 SORTINnn이 가변길이(VB)이면 SORTOUT도 가변길이여야 한다. 입력이 NVSM인 레코드를 VSAM 레코드로 출력하거나, VSAM 레코드를 NVSM 레코드로 출력하는 것도 가능하다.
SORTOFxx
OUTFIL로 레코드를 재편집할 때 복수의 출력 데이터 셋으로 출력할 때의 데이터 셋이다. xx는 1문자 혹은 2문자로 구성된 임의의 영문자나 숫자이다.
SYMNAMES
심볼을 치환하는 경우 참조되는 데이터 셋이다.
-
레코드 형식
심볼 이름,필드의 시작 위치,필드의 길이,필드의 포맷
JNFnCNTL
JOIN을 수행할 때 subtaskn의 control statement이다. JOIN 수행 이전에 수행할 SORT statement를 명시한다. n은 1 또는 2이다.
-
-
/* 문
SYSIN 데이터 셋의 종료를 지정한다. SORT 제어문의 END를 사용하여 종료를 지정할 수도 있다.
3.2. 데이터 셋 정의
다음은 데이터 셋 정의에 일반적으로 필요한 오퍼랜드이다.
| 데이터 셋명 | DCB | DISP | DSN | LABEL | SPACE | UNIT | VOL | AMP |
|---|---|---|---|---|---|---|---|---|
SORTIN |
1 |
O |
O |
2 |
X |
3 |
3 |
7 |
SORTINnn |
1 |
O |
O |
2 |
5 |
3 |
3 |
7 |
SORTOUT |
1 |
O |
4 |
2 |
5 |
3 |
6 |
7 |
SORTOFxx |
1 |
O |
4 |
2 |
5 |
3 |
6 |
7 |
SORTWKnn |
X |
4 |
4 |
X |
5 |
3 |
6 |
X |
JNFnCNTL |
1 |
4 |
4 |
2 |
5 |
3 |
3 |
7 |
-
O: 반드시 지정해야 한다.
-
X: 지정하지 않아도 된다.
-
1: 경우에 따라 지정할 필요가 있다.
-
2: 디스크 상에서는 불필요하다.
-
3: 현재 JOB STEP 이전에 작성 및 카탈로깅되어 있다면 필요 없으나 그렇지 않다면 지정해야 한다.
-
4: 임시 데이터 셋이 아니라면 지정해야 한다.
-
5: 직접 액세스 장치 상에 작성하는 경우에는 지정해야 한다.
-
6: 임시 데이터 셋인 경우, 현재 STEP 이전에 작성되고 카탈로깅된 경우, 동일 JOB 내의 다른 STEP으로부터 전달받은 경우를 제외하고는 지정해야 한다.
-
7: VSAM 데이터 셋의 경우에는 지정할 수 있으나 다른 경우에는 필요하지 않다.
DCB 오퍼랜드의 서브 파라미터
입출력 데이터 셋이 VSAM 데이터 셋이 아닌 경우, 레코드 형식(RECFM), 레코드 길이(LRECL), 블록 크기(BLKSIZE)의 정보를 지정해 주어야 한다.
| 항목 | 설명 |
|---|---|
레코드 형식 (RECFM) |
데이터 셋에 기록되어 있는 레코드의 형식을 지정한다. |
레코드 길이 (LRECL) |
데이터 셋에 기록되어 있는 레코드의 논리적인 최대 길이를 Byte로 지정한다. |
블록 크기 (BLKSIZE) |
데이터 셋에 기록되어 있는 레코드의 물리적인 최대 길이를 Byte로 지정한다. |
위의 정보의 지정은 다음 순서에 따라 결정된다.
-
RECFM, LRECL, BLKSIZE가 DD 문의 DCB 오퍼랜드로 지정되어 있으면 그 정보를 사용하고 다른 정보는 무시한다.
-
입력 데이터 셋의 경우 DCB 오퍼랜드가 지정되어 있지 않다면 에러가 발생한다. 단, 기존에 이미 데이터 셋이 존재하는 경우에는 기존의 정보를 사용한다. 출력 데이터 셋의 경우에 DCB 오퍼랜드의 지정이 없다면 다음 순서로 지정된다.
-
OUTREC에서 지정된 정보를 오버라이드하여 사용한다.
-
RECORD를 통해 지정된 정보를 오버라이드하여 사용한다.
-
INREC에서 지정된 정보를 오버라이드하여 사용한다.
-
입력 데이터 셋에서 지정된 정보를 오버라이드하여 사용한다.
-