vistas vista varias una tipos tablas parametros ejemplos crear con como sql database db2 ibm-midrange

varias - tipos de vistas en postgresql



¿Es posible crear una vista que tenga conocimiento del nombre del esquema/biblioteca actual? (4)

¿Estás diciendo que quieres crear una vista y pegarla en una biblioteca que muestra solo los contenidos de la biblioteca? Supongo que está accediendo a esto usando una lista de bibliotecas y no especificando una biblioteca específica.

No creo que sea posible usar sql para la vista para saber que es una biblioteca actual cuando se utiliza una lista de bibliotecas. Si no está utilizando una lista de bibliotecas, entonces debería poder ejecutar sus consultas utilizando la biblioteca que conoce.

¿O estoy malentendido?

Actualizar

Si desea tener una vista que conozca dinámicamente en qué esquema se encuentra y lo utiliza como parte de la declaración sql, no creo que sea posible. Si codifica la consulta de la vista para decir dónde schema = ''myLib'' a la biblioteca actual, entonces podría funcionar, pero tendría que hacer una versión diferente para poner en cada biblioteca. Y no sería obvio si alguna vez estuvo mal o si fue cambiado, etc.

Antecedentes: versión iSeries de DB2. En cada entorno, hay una tabla que contiene información de columnas posicionales sobre otras tablas. Como los datos en esta tabla son estáticos y deben volverse a generar cada vez que se modifica una tabla, pueden surgir problemas si no se realizan.

Todos los datos posicionales existen en QSYS2.SYSTABLES y QSYS2.SYSCOLUMNS , por lo que debería ser posible crear una vista que contenga la misma información pero se garantiza que es correcta. Los viejos programas deberían poder usar esta vista.

El único problema es que la vista debería conocer el esquema actual (biblioteca de datos en iSeries) para recuperar la información correcta de las tablas QSYS2, ya que contienen datos para todos los esquemas / bibliotecas.

Alguna idea sobre si esto es posible y si es así como?

EDITAR: Re: Ryan Guill

Efectivamente, quiero que la vista seleccione filas en QSYS2.SYSCOLUMNS utilizando el nombre de la biblioteca actual en sus criterios. Si tengo la tabla T en múltiples bibliotecas, entonces SYSCOLUMNS tendrá datos para las instancias de la T en cada biblioteca.

Una solución poco elegante es que podría almacenar el nombre de biblioteca / esquema en cada biblioteca, y la vista usaría este valor en la selección ...


Creo que tienes idea de almacenar los nombres de esquema y tabla en una tabla que funcionará. Su vista se crea en ese esquema utilizando una combinación interna de ese esquema y tabla con syscolumns para crear la vista.

Opcionalmente, es posible que desee considerar el uso de DDS en lugar de SQL para crear un archivo lógico (vista) sobre syscolumns para cada biblioteca. No estoy seguro de cuántas bibliotecas está tratando, pero si son pocas, podría funcionar.

Para usar DDS con Selection:

SYSCOLUMNS ya es una vista, por lo que para crear un DDS LF para Seleccionar / Omitir debe crearlo sobre el archivo físico QADBIFLD subyacente (QADBXSFLD también está involucrado pero no creo que necesite ningún campo de ese archivo para esta aplicación):

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

Puede usar DBILIB y DBIFIL si su esquema y los nombres de tabla son 10 o menos. Si necesita los nombres SYSCOLUMN, debe cambiar el nombre de algunos campos.

Ryan, estoy equivocado ya que también puedes hacer esto con una vista de SQL:

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

Para usar una unión:

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;

No se realiza ningún pedido ni en el DDS ni en la Vista.


¿Has intentado usar el registro especial CURRENT_SCHEMA ?

ex: Select CURRENT_SCHEMA From QSQPTABL

(nota: QSQPTABL es lo mismo que la tabla simulada SysIBM/SysDummy1 para jugar)

Select * From SysViews Where System_View_Schema = CURRENT_SCHEMA

''Por supuesto que solo funciona si usa * SQL naming y no * SYS naming, pero esa es otra historia :)


Si crea sus bibliotecas como esquemas (es decir, usa CREATE SCHEMA lugar de CRTLIB , entonces toda la información necesaria ya estará en el esquema. Es decir, no necesita consultar QSYS2.SYSTABLES y QSYS2.SYSCOLUMNS porque puede consultar myschema.SYSTABLES y myschema.SYSCOLUMNS , o simplemente SYSTABLES no calificados y SYSCOLUMNS si su CURRENT_SCHEMA está establecido en ''myschema''.