descargar db2cli database db2 odbc database-connection db2400

database - db2cli - Especifique y use múltiples bibliotecas en la cadena de conexión ODBC



descargar ibm® db2 odbc driver (3)

Mi cadena de conexión odbc para conectarse a DB2i se ve así:

Driver={Client Access ODBC Driver (32-bit)};system=xx.xx.xx.xx;dbq=LIB1 LIB2 LIB3 LIB4 LIB5 LIB6 LIB7 LIB8;languageid=ENU;qrystglmt=-1;cmt=0;signon=1

La cadena de conexión anterior especifica múltiples bibliotecas / esquemas para su uso. Pero cuando trato de acceder a un archivo / tabla desde una biblioteca que no sea la primera (como desde LIB2 ... LIB8) recibo una excepción que dice "ARCHIVO xx no encontrado en LIB1"

¿Por qué no busca automáticamente el archivo / tabla en otras bibliotecas específicas, sino que busca el archivo en la primera biblioteca solamente?

Necesito una solución para esta situación.


Esto funciona como está documentado en el manual:

La lista de bibliotecas se usa para resolver llamadas de procedimientos almacenados no calificados y buscar bibliotecas en las llamadas de la API del catálogo. ... Nota: La primera biblioteca enumerada en esta propiedad también será la biblioteca predeterminada, que se utiliza para resolver nombres no calificados en declaraciones SQL.


Use el modo " denominación del sistema ", agregando naming=1 a su cadena de conexión .

En su lista de bibliotecas, coloque una coma antes de la primera biblioteca.

Driver={Client Access ODBC Driver (32-bit)};system=systemname;naming=1; dbq=,LIB1,LIB2,LIB3,LIB4,LIB5,LIB6,LIB7,LIB8;languageid=ENU;cmt=0;signon=1


Como se indicó anteriormente, la lista Esquema / biblioteca se usa para resolver nombres de funciones / procedimientos, no tablas.

Supongamos que necesita leer datos de lib1.tab1 y lib2.tab2;

Aquí mis soluciones personales (de fácil a complejo):

a) pedirle al administrador de db que tenga, para cada tabla que necesite usar, el nombre de esquema correspondiente, luego seleccione "seleccionar * de lib1.tab1 join lib2.tab2 on [...]" ;-) b) pregunte a db admin para crear en el esquema "MyAlias" varios alias (crear alias) para cada tabla que desee utilizar. Luego haga "establecer el esquema actual = MyAlias" seguido por toda la instrucción SQL que necesite, por ejemplo, "select * from tab1 join tab2". Como está consultando myalias.tab1, que es un alias que apunta a la tabla lib1.tab1, debería funcionar.

c) Complejo: crea tu propia función SQL que devuelve el nombre_esquema correspondiente para una tabla (ej. myfunct (''TAB1''). Esto podría hacerse leyendo la vista del sistema "qsys2.systables" donde table_name = ''TAB1'' y devolviendo la columna TABLE_SCHEMA, que es un varchar (128). Una vez que lo tienes, compila dinámicamente preparado usando la variable que acabas de obtener. Por ejemplo, "set mylib = myfunct (''TAB1'')." establece mystmt = ''select * from'' || table_schema || ''.tab1'' ... "

Prepara mystmt y luego ejecuta mystmt.

Hice algo similar en VBA usando ado ibmdrda y funcionó.

espero que esto ayude.

F.