PDA

View Full Version : Java e DB2 - catalogo database


etonRifles
27-07-2004, 10:16
Vorrei realizzare un piccolo (?) programma java che mi visualizzi l'elenco di tutti i database gestiti da un DBMS specificato (nel mio caso DB2) con i nomi delle tabelle... ho visto che nel package java.sql ci sono alcune classi ed interfacce che potrebbero fare al caso mio (DatabaseMetaData ... ), ma onestamente non capisco come sia possibile utilizzarle nel mio caso. Il problema in pratica è solo ottenere l'elenco dei database... estrarre le informazioni relative alle tabelle di un database poi è piuttosto semplice.
help please :cry:

cavva81
27-07-2004, 15:19
prova una cosa tipo questa


public void readTables() throws SQLException {

DatabaseMetaData metadata = null;
Connection currentConnection = (tua connessione)
metadata = currentConnection.getMetaData();
String[] names = {"TABLE"};
ResultSet tableNames = metadata.getTables(null,"%", "%", names);
while (tableNames.next()) {
tableNames.getString("TABLE_NAME")
}
}


cmq qui (http://members.aol.com/kgb1001001/Articles/JDBCMetadata/JDBC_Metadata.htm) trovi una buona descrizione su tutto quello ke puoi fare con i metadata del JDBC

Fabio_si
28-07-2004, 11:28
Io so che in DB2 la tabella di catalogo che contiene le informazioni sulle tabelle utente e di sistema è la:

sysibm.systables

Credo che dovrai aprirti una connessione Jdbc con il DB2 e fare una query su questa con l'opzione:

where creator="il tuo qualificatore"

Fede
28-07-2004, 14:07
Originariamente inviato da cavva81




Connection currentConnection = (tua connessione)






:confused:
che vuol di'?
ma se non li so????
come faccio a sapere qual' e' la mia connessione?
(non conosco il database)

Fede
28-07-2004, 14:08
Originariamente inviato da Fabio_si
Io so che in DB2 la tabella di catalogo che contiene le informazioni sulle tabelle utente e di sistema è la:

sysibm.systables

Credo che dovrai aprirti una connessione Jdbc con il DB2 e fare una query su questa con l'opzione:

where creator="il tuo qualificatore"
gia' questa mi piace di piu'.
Questa potrebbe essere una chicca.

Fabio_si
28-07-2004, 14:18
Originariamente inviato da Fede
gia' questa mi piace di piu'.
Questa potrebbe essere una chicca.

Ciao Fede, come va ?

Non mi parlare di DB2 è stato il mio pane quotidiano per anni, assieme al Cobol e al Cics.

Sono già 3 o 4 anni ormai che lavoro su piattaforma Web / Java su Dbms Oracle/Db2/MySql , molto più divertente e ti da più soddisfazioni.

L'università come va ?

Stai lavorando ?

Fede
28-07-2004, 14:21
Originariamente inviato da Fabio_si
Ciao Fede, come va ?

Non mi parlare di DB2 è stato il mio pane quotidiano per anni, assieme al Cobol e al Cics.

Sono già 3 o 4 anni ormai che lavoro su piattaforma Web / Java su Dbms Oracle/Db2/MySql , molto più divertente e ti da più soddisfazioni.

L'università come va ?

Stai lavorando ?

non ti avevo riconosciuto... pensa un po' come sto:muro:

cmq uni non male...
lavoro ehmmm al momento no:)
tu tutto ok?
cmq grazie ;)
saluti

Fede
28-07-2004, 14:22
Originariamente inviato da Fabio_si
Io so che in DB2 la tabella di catalogo che contiene le informazioni sulle tabelle utente e di sistema è la:

sysibm.systables

Credo che dovrai aprirti una connessione Jdbc con il DB2 e fare una query su questa con l'opzione:

where creator="il tuo qualificatore"
scusa, ma che db specificherei? (nell'indirizzo della connessione)

Fabio_si
29-07-2004, 13:48
Originariamente inviato da Fede
scusa, ma che db specificherei? (nell'indirizzo della connessione)

Scusa il ritardo.

Se non usi datasource o pool di connessioni, puoi provare così:

Class.forName("COM.ibm.db2.jdbc.net.DB2Driver");
String url = "jdbc:db2://server_name:num_porta/nome_database";
Connection con = DriverManager.getConnection(url,"utente","password");
Statement stmt = con.createStatement();
Resultset rs = stmt.executeQuery("select * from sysibm.systables ....");

In Odbc dovrebbe essere così (non ne sono sicuro):

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:nome_database";
Connection con = DriverManager.getConnection(url);

Il tutto va preso con le dovute preucazioni poichè ho recuperato questo codice da vecchi programmi.
Adesso lavoro solo con i datasource (che oltretutto ti gestiscono automaticamente il pool di connessioni) e utilizzo l'approccio JNDI.

etonRifles
29-07-2004, 13:57
Originariamente inviato da Fabio_si
Credo che dovrai aprirti una connessione Jdbc con il DB2


prima di tutto grazie per la risposta... però ho ancora un problema
... in che modo posso aprire la connessione a DB2? teoricamente dovrei specificare un database a cui connettermi con relativi username e password... la mia domanda è: quale database dal momento che il programma dovrebbe stamparli tutti senza che io sappia a priori quanti ce ne sono e quali sono? :confused: :confused: :confused:

dataman
29-07-2004, 16:23
Originariamente inviato da etonRifles
prima di tutto grazie per la risposta... però ho ancora un problema
... in che modo posso aprire la connessione a DB2? teoricamente dovrei specificare un database a cui connettermi con relativi username e password... la mia domanda è: quale database dal momento che il programma dovrebbe stamparli tutti senza che io sappia a priori quanti ce ne sono e quali sono? :confused: :confused: :confused:

L'elenco dei database di una istanza DB2 viene dato dal comando
CLP "db2 list db directory".

E' però un comando interattivo, e non so se possa essere invocato via JDBC.

Aspè che vado nella documentazione e guardo.. ;)

Fede
29-07-2004, 17:31
Originariamente inviato da dataman
L'elenco dei database di una istanza DB2 viene dato dal comando
CLP "db2 list db directory".

E' però un comando interattivo, e non so se possa essere invocato via JDBC.

Aspè che vado nella documentazione e guardo.. ;)
se la mia memoria non erra, non si puo':(

etonRifles
29-07-2004, 18:02
Originariamente inviato da Fede
se la mia memoria non erra, non si puo':(

eseguire un comando è possibile, basta usare le classi Runtime e Process che non hanno nulla a che vedere con JDBC... il problema è che il comando che deve essere eseguito è un comando CLP :muro: ... se si potesse eseguire un comando di questo tipo poi si dovrebbe solo :muro: manipolare la stringa con l'output in maniera opportuna....

... sono sempre più disperato :cry: :cry: :cry:

Fabio_si
29-07-2004, 23:42
Non vorrei sbagliarmi, è un pò che non smanetto con le tabelle di catalogo, ma esiste anche la
sysibm.sysdatabase
che ti da l'elenco dei database

Comunque almeno un database per attivare la connessione dovresti conoscerlo, altrimenti la vedo difficile.

etonRifles
30-07-2004, 09:32
Originariamente inviato da Fabio_si
Comunque almeno un database per attivare la connessione dovresti conoscerlo, altrimenti la vedo difficile.

... pure io :muro:

dataman
30-07-2004, 09:40
Originariamente inviato da Fabio_si
Non vorrei sbagliarmi, è un pò che non smanetto con le tabelle di catalogo, ma esiste anche la
sysibm.sysdatabase
che ti da l'elenco dei database

Comunque almeno un database per attivare la connessione dovresti conoscerlo, altrimenti la vedo difficile.

SYSIBM.SYSDATABASE è una tabella di catalogo presente in un sottosistema DB2 z/OS, e non DB2 UDB. Il concetto di database in Z/OS è molto diverso da quello su piattaforme server (Windows e Unix).
In DB2 UDB ogni database ha il suo catalogo privato, che può quindi essere acceduto solo dopo una connessione esplicita.

Secondo me l'unica è agganciare la CLP e dare il comando "db2 list db directory" e formattarsi l'output.

dataman
30-07-2004, 09:57
Toh, forse ho trovato qualcosa di interessante.

____________________________________________________
sqledgne - Get Next Database Directory Entry

Returns the next entry in the system database directory or the local database directory copy returned by sqledosd - Open Database Directory Scan. Subsequent calls to this API return additional entries.

Authorization

None

Required connection

None

API include file

sqlenv.h

C API syntax

/* File: sqlenv.h */
/* API: sqledgne */
/* ... */
SQL_API_RC SQL_API_FN
sqledgne (
unsigned short Handle,
struct sqledinfo **ppDbDirEntry,
struct sqlca *pSqlca);
/* ... */

Generic API syntax

/* File: sqlenv.h */
/* API: sqlgdgne */
/* ... */
SQL_API_RC SQL_API_FN
sqlgdgne (
unsigned short Handle,
struct sqledinfo **ppDbDirEntry,
struct sqlca *pSqlca);
/* ... */

API parameters

Handle
Input. Identifier returned from the associated OPEN DATABASE DIRECTORY SCAN API.
ppDbDirEntry
Output. The caller supplies the API with the address of a pointer to an sqledinfo structure. The space for the directory data is allocated by the API, and a pointer to that space is returned to the caller.
pSqlca
Output. A pointer to the sqlca structure.
REXX API syntax

GET DATABASE DIRECTORY ENTRY :scanid [USING :value]

REXX API parameters

scanid
A REXX host variable containing the identifier returned from the OPEN DATABASE DIRECTORY SCAN API.
value
A compound REXX host variable to which the database entry information is returned. If no name is given, the name SQLDINFO is used. In the following, XXX represents the host variable name (the corresponding field names are taken from the structure returned by the API):
XXX.0
Number of elements in the variable (always 12)
XXX.1
ALIAS (alias of the database)
XXX.2
DBNAME (name of the database)
XXX.3
DRIVE/PATH (local database directory path name)
XXX.3.1
NODE NUMBER (valid for local database directory only)
XXX.4
INTNAME (token identifying the database subdirectory)
XXX.5
NODENAME (name of the node where the database is located)
XXX.6
DBTYPE (product name and release number)
XXX.7
COMMENT (comment associated with the database)
XXX.8
Reserved
XXX.9
TYPE (entry type)
XXX.10
AUTHENTICATION (authentication type)
XXX.10.1
DCE principal
XXX.11
GLBDBNAME (Global database name)
XXX.12
CATALOG NODE NUMBER
Usage notes

All fields of the directory entry information buffer are padded to the right with blanks.

A subsequent GET NEXT DATABASE DIRECTORY ENTRY obtains the entry following the current entry.

The sqlcode value of sqlca is set to 1014 if there are no more entries to scan when GET NEXT DATABASE DIRECTORY ENTRY is called.

The count value returned by the OPEN DATABASE DIRECTORY SCAN API can be used to scan through the entire directory by issuing GET NEXT DATABASE DIRECTORY ENTRY calls, one at a time, until the number of scans equals the count of entries.

Related reference

sqledcls - Close Database Directory Scan
sqledosd - Open Database Directory Scan
SQLCA
SQLEDINFO
Related samples

COBOL

dbcat.cbl -- Catalog to and uncatalog from a database (IBM COBOL)
dbcmt.cbl -- Change a database comment in the database directory (IBM COBOL)
C

ininfo.c -- Set and get information at the instance level (C)
C++

ininfo.C -- Set and get information at the instance level (C++)
___________________________________________________

Questa la trovi documentata qui:

ftp://ftp.software.ibm.com/ps/products/db2/info/vr8/pdf/letter/db2b0e80.pdf

Spero che ti aiuti

Ciao