2009-03-19 5 views
3

배경 : DB2의 iSeries 버전. 모든 환경에는 다른 테이블에 대한 위치 정보 열이 포함 된 테이블이 있습니다. 이 테이블의 데이터는 정적이며 테이블이 변경 될 때마다 다시 생성되어야하므로 단계가 벗어나면 문제가 발생할 수 있습니다.현재 스키마/라이브러리 이름을 인식하는 뷰를 만들 수 있습니까?

모든 위치 데이터는 QSYS2.SYSTABLESQSYS2.SYSCOLUMNS에 있으므로 동일한 정보가 포함되어 있지만 올바른 것으로 보장되는보기를 만들 수 있어야합니다. 오래된 프로그램이이보기를 사용할 수 있어야합니다.

유일한 문제는보기가 현재 스키마 (iSeries의 데이터 라이브러리 말하는)가 모든 스키마에 대한 데이터를 포함하기 때문에, /의 QSYS2 테이블에서 올바른 정보를 검색 할 수 알아야 할 것입니다 라이브러리.

이것이 가능한지 여부에 대한 아이디어는?

편집 : 재 : 라이언 Guill

효과적으로 나는 그것의 기준에서 현재 라이브러리 이름을 사용 QSYS2.SYSCOLUMNS 행을 선택보기로합니다. 여러 라이브러리에 테이블 T가있는 경우 SYSCOLUMNS에는 각 라이브러리의 T 인스턴스에 대한 데이터가 있습니다.

세련되지 솔루션은 당신이보기 및 스틱을 만들 건가요 ...

답변

2

을 나는 각 라이브러리에서 라이브러리/스키마 이름을 저장할 수 있고, 뷰가 선택이 값을 사용한다는 것입니다 라이브러리의 내용 만 보여주는 라이브러리에 있습니까? 라이브러리 목록을 사용하고 특정 라이브러리를 지정하지 않고이 자료에 액세스하고있는 것 같습니다.

sql을 사용하여 라이브러리 목록을 사용할 때 현재 라이브러리를 알 수 없다고 생각합니다. 라이브러리 목록을 사용하고 있지 않다면 알고있는 라이브러리를 사용하여 쿼리를 실행할 수 있습니다.

나는 오해하고 있습니까?

당신이 동적으로이 무엇 스키마 알고 SQL 문의 일환으로, 나는 그것이 가능하다고 생각하지 않는 것을 사용하는보기를 원한다면

업데이트. 뷰에 대한 쿼리를 하드 코딩하여 현재 라이브러리에 대해 schema = 'myLib'가 어디에서 작동하는지 말할 수 있지만 모든 라이브러리에 넣기 위해서는 다른 버전을 만들어야합니다. 그리고 잘못 입력했거나 스위치를 켰는 지 여부는 분명하지 않습니다.

+0

syscolumns는 전역이며 각 스키마에만 해당되지 않으므로 라이브러리 목록을 사용하여 syscolumns를 분할 할 수 없습니다. 그는 테이블이 다른 스키마 (가능하면 다른 열이 있음)에 있음을 알면서 단 하나의 스키마에 대한 테이블의 열을 선택하려고합니다. –

3

테이블에 테이블 이름 &을 저장하는 것이 좋습니다. 해당 스키마 & 테이블을 syscolumns의 내부 조인을 사용하여 해당 스키마에서 뷰를 생성하면 뷰가 생성됩니다.

선택적으로 SQL 대신 DDS를 사용하여 각 라이브러리의 syscolumns에 대한 논리 파일 (보기)을 만들 수 있습니다. 얼마나 많은 라이브러리를 다루고 있는지 확신 할 수 없지만, 몇 개만 있다면이 방법을 사용할 수 있습니다.

은 선택과 DDS를 사용하려면 :

SYSCOLUMNS 아직 선택을위한 DDS의 LF를 작성하는 도면이다/당신이 (QADBXSFLD도 관련되어 기본 QADBIFLD 실제 파일에 그것을 만들 필요가 생략하지만, 난 몰라 이 응용 프로그램에 대한 해당 파일에서 어떤 필드를) 필요가 있다고 생각 : 당신이 스키마와 테이블 이름이야 10 아래를하는 경우

A   R QDBIFLD     PFILE(QADBIFLD)      
A   S DBILB2     COMP(EQ 'SCHEMANAME')     
A   S DBILFI     COMP(EQ 'TABLENAME') 

당신은 DBILIB & DBIFIL를 사용할 수 있습니다. SYSCOLUMN 이름이 필요한 경우 일부 필드 이름을 변경해야합니다.

CREATE TABLE MYSCHEMA/MYTABLESELECT 
      (MYSCHEMA VARCHAR (128), 
      MYTABLE VARCHAR (128)); 
INSERT INTO MYTABLESELECT VALUES('SCHEMANAME', 'TABLENAME'); 
CREATE VIEW MYSCHEMA/MYSYSCOLUMN AS 
    SELECT SYSCOLUMNS.* 
     FROM SYSCOLUMNS, MYTABLESELECT 
     WHERE SYSCOLUMNS.DBNAME = MYTABLESELECT.MYSCHEMA 
     AND SYSCOLUMNS.TBNAME = MYTABLESELECT.MYTABLE; 

없음 주문은 DDS 또는 중 하나에서 수행되고 있지 :

CREATE VIEW MYSCHEMA/MYSYSCOLUMN AS 
    SELECT * 
     FROM SYSCOLUMNS 
     WHERE SYSCOLUMNS.DBNAME = 'SCHEMANAME' 
     AND SYSCOLUMNS.TBNAME = 'TABLENAME' 

은 조인을 사용하려면, 당신은 또한 SQL보기로이 작업을 수행 할 수 있기

라이언, 내가 틀렸다 보기.

+0

DDS 논리적 의미의 예를 들어 줄 수 있습니까 (예 : 선택/생략 논리와 같은 뜻입니까?) sql보기로 수행 할 수없는 레코드 선택을 수행 할 수 있습니까? –

+0

네, CL/RPG를 통해 얻을 수 있고 자동 생성 된 스키마 이름 만 저장하면됩니다. 나는 논리 파일을 이해하기가 힘들 기보다는 그렇게하기를 원한다. –

4

특수 레지스터 CURRENT_SCHEMA을 사용해 보셨습니까?

예 : Select CURRENT_SCHEMA From QSQPTABL

(참고 : QSQPTABL 주위 재생을위한 SysIBM/SysDummy1 더미 테이블과 동일) 당신이 * SYS를 * SQL 명명을 사용하지 않는 경우에만 작동

Select * From SysViews 
Where System_View_Schema = CURRENT_SCHEMA 

'과정을 이름 짓기,하지만 그건 또 다른 이야기예요.

+0

아,이게 더 비슷해. 필자가 언급 한대로 * SQL 명명 방식으로 변경하지 않고 이전에 현재 스키마를 명시 적으로 설정하지 않으면 동작 할 수는 없지만 다시보고 할 것이다. 감사합니다 –

+1

ODBC를 통해 IBM i (V6R1)에 연결하고'SELECT CURRENT_SCHEMA FROM SYSIBM.SYSDUMMY1'을 실행하면 라이브러리 이름을 리턴하지 않고 대신 ODBC 연결을 작성하고 조회를 실행하는 데 사용 된 사용자 이름을 리턴합니다. 그냥 다른 사람이이 대답을 통해오고 또한 ODBC를 통해 연결하는 경우에 대비하여 언급 할 것이라고 생각했습니다. –

+0

"username"** IS **는 (는) CURRENT_SCHEMA이기 때문입니다. SELECT 문은 표준 SQL 명명 형식 인 표준 스키마 "도트"테이블 명명 형식을 사용합니다. 표준 SQL은 현재 스키마의 이름을 사용자 이름과 동일하게 설정합니다. 현재 스키마를 명시 적으로 설정하거나 연결 속성을 * SQL에서 * SYS 이름 지정으로 변경해야합니다. (그리고 그것은 다른 것들 사이에서 스키마 "도트"테이블에서 스키마 "/"테이블로 모든 규정 된 이름을 변경해야합니다.) – user2338816

1

CRTLIB이 아닌 CREATE SCHEMA을 사용하면 라이브러리를 스키마로 만들면 필요한 정보는 모두 이미 있습니다. 스키마. 즉,및 myschema.SYSCOLUMNS을 쿼리 할 수 ​​있으므로 QSYS2.SYSTABLESQSYS2.SYSCOLUMNS을 쿼리 할 필요가 없으며 CURRENT_SCHEMA가 'myschema'로 설정된 경우 SYABOLUMNS 및 SYBRULNS를 정규화하지 않아도됩니다.