2016-07-08 3 views
0

IBM i에서 PASE 및 Qshell의 세계로 들어가고 있으며, 여전히 문제를 해결하는 "쉘 방식"을 배우고 있습니다.PASE/Qshell에서 데이터베이스 관계를 판별하는 방}은?

주어진 실제 파일과 연관된 주어진 라이브러리의 모든 논리 파일을 삭제하는 쉘 스크립트를 작성하려고합니다. OS는 IBM i 7.2입니다. QSYS-land에서는 실제 파일에 대해 DSPDBR을 outfile에 작성한 다음 outfile을 읽고 각 종속 파일을 삭제합니다. PASE 또는 Qshell에서이 작업을 어떻게 수행합니까? 몇 가지 아이디어가 있었지만 모두 너무 지나치게 복잡해 보였습니다. 쉘 스크립팅에 대해 배울수록 더 많은 단축키를 찾을 수있었습니다.

system "DSPDBR FILE(MYLIB/MYFILE) OUTPUT(*OUTFILE) OUTFILE(QTEMP/DSPDBR)" 
db2 "select WHREFI from QTEMP/DSPDBR where WHRELI = 'MYLIB'" 

(나는 QTEMP 정말 일시적으로 작동하지 않습니다 지금은 볼

:

내 첫번째 생각은 기본적으로 같은 일을하고, 위의 과정을 복제하고 어떻게 든 SELECT의 출력을 사용하는 것이 었습니다 라이브러리,하지만 어쨌든이 주위에 방법이 있습니다.) 두 번째 아이디어는 DSPDBR 문의 출력을 awk와 같은 것으로 파이프 처리하고 논리 파일 이름을 선택하여 출력을 a 스트림 파일 (또는 쉘 변수?). 그리고 거기에서 어떻게 든이 목록을 사용하여 논리 파일을 삭제합니다.

더 간단한 방법이 있습니까? 답이 무엇이든간에 QSYS 명령 및 오브젝트와 상호 작용하기 위해 쉘 스크립트를 작성할 때 종종 반복되는 패턴이 될 것입니다.

답변

1

먼저 Running SQL queries from PASE instead of QSH을 검토 할 수 있습니다. db2 유틸리티는 PASE가 아닌 Qshell의 일부입니다. 불행히도 그 뒤에있는 처리는 ILE을 기반으로하므로 PASE (AIX 런타임) 환경에서는 직접 사용할 수 없습니다. 링크 된 질문은 두 질문 사이에 다리를 놓는 방법을 제공합니다.

그러나, 직접의 QShell에서,이 같은 실험을 할 수 있습니다

db2 "SELECT substr(VIEW_NAME,1,18), substr(OBJECT_NAME,1,10), 
     substr(OBJECT_SCHEMA,1,10), substr(VIEW_SCHEMA,1,10), 
     substr(TABLE_NAME,1,18) 
FROM qsys2.sysviewdep 
WHERE OBJECT_SCHEMA = '<yourSchemaName>'" 

SUBSTR() 함수를가하거나 유용하지 않을 수도 있습니다. 그것은 당신의 이름 길이와 그들이 제한적이든 아니든간에 원하는지 여부에 달려 있습니다. 출력은 outfile로 리디렉션되거나 조작을 위해 sed 또는 다른 유틸리티로 파이프 될 수 있습니다.

+0

QSYS2.SYSVIEWDEP에는 필자의 테스트 PF와 LF가 포함되지 않은 것 같습니다. 어쩌면 LF는 인덱스로 간주되므로 SYSVIEWDEP에 포함되지 않을 수 있습니까? – smeep

+0

내가 찾는 것이 QSYS 명령/프로그램과 상호 작용할 필요가있는 쉘 스크립트를 작성할 때 사람들이 사용하는 일반적인 패턴이라고 생각합니다.위의 LF 시나리오에서 주어진 PF에 대한 LF 목록을 얻는 것이 올바른 방법인지 궁금합니다. 스크립트가 프로그램을 호출해야 QSYS에 목록을 작성합니까? DSPDBR 명령의 파이프 출력을 구문 분석해야합니까? 그것은 DSPDBR에 의해 생성 된 출력 파일과 함께 작동해야합니까? QSYS 오브젝트를 조작하고 쉘 내에서 QSYS 오브젝트에 대한 메타 데이터를 얻으 려 할 때 사람들이 사용하는 공통 패턴은 무엇입니까? – smeep

+0

@smeep 마지막 비트를 명확히하기 위해 질문을 편집 할 수 있습니까? (의견은 일시적 일 수 있습니다.) PASE에 더 관심이 있습니까? QShell은 OS와 비교적 잘 통합되어 있으며, PASE는 AIX 런타임에서 IBM i 기능을 복제하거나 액세스하기 위해보다 특정한 프로그래밍을 요구할 수 있습니다. – user2338816

1

QTEMP 라이브러리는 쉘에서 요청을 구현하는 프로세스에 특정 적입니다 [scoped]. 동일한 QTEMP 라이브러리에 의존하는 모든 요청이 동일한 프로세스에서 실행되는지 확인하십시오. 시스템 유틸리티는 db2 유틸리티와 별도의 프로세스에서 실행됩니다. 예를 들어, QSHell의 다음 명령 행 호출에서 QTEMP에 종속 된 모든 요청은 db2 유틸리티가 실행되는 동일한 프로세스에서 실행됩니다. DB2 유틸리티는 스크립트를 실행 [나 대신 동적 복합 명령문을 실행할 수 있습니다]이 시나리오에서 그는 쉘 유틸리티 내에서 \에 대한 스크립트 요청에 의해 생성 된 :

qsh cmd('                 
    echo "call qsys2.qcmdexc             
      (''dspdbr mylib/myfile output(*outfile) outfile(qtemp/dspdbr)'') 
     " >> mydb2.script             
; echo "select WHREFI from QTEMP.DSPDBR where WHRELI =''MYLIB''   
     " >> mydb2.script             
; db2 -f mydb2.script             
; rm  mydb2.script             
     ')                 
+0

qsys2.qcmdexc는 'system'과 달리 상위 프로세스 (이 경우'db2') 내에서 실행되므로 select 문은 DSPDBR과 동일한 QTEMP 라이브러리를 볼 수 있습니까? – smeep

+0

수정; 저장 프로시 듀어 CALL은 이전 및 이후 스크립트 요청과 동일한 프로세스 내에서 동 기적으로 수행됩니다. 하나의'db2' 호출 내에서 만들어진 모든 스크립트 요청은'db2' 호출을 위해 시작된 별도의 프로세스에서 실행됩니다. 모든 프로세스와 마찬가지로 QTEMP 라이브러리는 프로세스가 종료 될 때까지 지속되며 모든 프로세스에서 종료 될 때까지 지속됩니다 해당 프로세스 내에서 실행되는 요청 – CRPence