Можно ли создать представление, которое знает текущую схему / имя библиотеки? - PullRequest
3 голосов
/ 19 марта 2009

Справочная информация: версия DB2 для iSeries. В каждой среде есть таблица, содержащая информацию о позиционном столбце о других таблицах. Поскольку данные в этой таблице являются статическими и должны создаваться заново при каждом изменении таблицы, могут возникнуть проблемы, если она вышла из строя.

Все позиционные данные существуют в QSYS2.SYSTABLES и QSYS2.SYSCOLUMNS, поэтому должна быть возможность создать представление, содержащее ту же информацию, но гарантированно правильное. Старые программы должны иметь возможность использовать это представление.

Единственная проблема заключается в том, что представление должно знать текущую схему (говорят в библиотеке данных в iSeries) для получения нужной информации из таблиц QSYS2, поскольку они содержат данные для все схемы / библиотеки.

Есть идеи, возможно ли это, и если да, то как?

РЕДАКТИРОВАТЬ: Re: Райан Guill

Эффективно, я хочу, чтобы представление выбирало строки в QSYS2.SYSCOLUMNS, используя текущее имя библиотеки в своих критериях. Если у меня есть таблица T в нескольких библиотеках, то SYSCOLUMNS будет иметь данные для экземпляров T в каждой библиотеке.

Не элегантное решение состоит в том, что я могу сохранить имя библиотеки / схемы в каждой библиотеке, и представление будет использовать это значение в выделении ...

Ответы [ 4 ]

4 голосов
/ 20 марта 2009

Вы пробовали использовать специальный регистр CURRENT_SCHEMA?

например: Select CURRENT_SCHEMA From QSQPTABL

(примечание: QSQPTABL совпадает с SysIBM/SysDummy1 фиктивным столом для игры)

Select * From SysViews
Where System_View_Schema = CURRENT_SCHEMA

'Конечно, это работает, только если вы используете * именование SQL, а не * SYS, но это другая история:)

3 голосов
/ 19 марта 2009

Я думаю, у вас есть идея сохранить схемы и имена таблиц в таблице. Ваше представление создается в этой схеме с помощью внутреннего соединения этой схемы и таблицы с syscolumns для создания представления.

При желании вы можете рассмотреть возможность использования DDS вместо SQL для создания логического файла (представления) по syscolumns для каждой библиотеки. Не знаю, с какими библиотеками вы имеете дело, но если их всего несколько, это может сработать.

Чтобы использовать DDS с выбором:

SYSCOLUMNS уже является представлением, поэтому для создания DDS LF для Select / Omit необходимо создать его поверх базового физического файла QADBIFLD (также задействован QADBXSFLD, но я не думаю, что вам нужны какие-либо поля из этого файла для этого приложения ):

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

Вы можете использовать DBILIB и DBIFIL, если ваша схема и имена таблиц 10 или меньше. Если вам нужны имена SYSCOLUMN, вам нужно переименовать некоторые поля.

Райан, я не прав, так как вы могли бы сделать это с помощью представления SQL:

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

Чтобы использовать объединение:

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, ни в представлении.

2 голосов
/ 19 марта 2009

Вы говорите, что хотите создать представление и вставить его в библиотеку, которая показывает только содержимое ее библиотеки? Я предполагаю, что вы обращаетесь к этому материалу, используя список библиотек и не указав конкретную библиотеку?

Я не думаю, что можно использовать sql для представления, чтобы узнать его текущую библиотеку при использовании списка библиотек. Если вы не пользуетесь списком библиотек, вы можете просто выполнять запросы, используя библиотеку, которую вы знаете.

Или я неправильно понимаю?

Обновление

Если вы хотите иметь представление, которое динамически знает, в какой схеме оно находится, и использует его как часть оператора sql, я не думаю, что это возможно. Если вы жестко закодируете запрос для представления, чтобы сказать, где schema = 'myLib' к текущей библиотеке, тогда он может работать, но вам придется создать другую версию для каждой библиотеки. И это не было бы очевидно, если бы это было когда-нибудь неправильно или если это было переключено, и т. Д.

1 голос
/ 23 марта 2014

Если вы создаете свои библиотеки как схемы (т. Е. Используете CREATE SCHEMA вместо CRTLIB, тогда вся необходимая информация уже будет в схеме. То есть вам не нужно запрашивать QSYS2.SYSTABLES и QSYS2.SYSCOLUMNS, потому что вы можете запросить myschema.SYSTABLES и myschema.SYSCOLUMNS или просто неквалифицированные SYSTABLES и SYSCOLUMNS, если для CURRENT_SCHEMA установлено значение «myschema».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...