Thread: Get a table name

Get a table name

From
Gianvito Pio
Date:
Hi all,
I'm trying to get the table name of a column in this way:

ResultSet rs;
         try
         {
             rs = ps.executeQuery();
             ResultSetMetaData rsmd = rs.getMetaData();
             System.out.println(rsmd.getTableName(..));

but the getTableName( ..) method gives me an empty string. Isn't there a
way to know the table name of a specific field I'm obtaining? Thanks

Re: Get a table name

From
Filip Rembiałkowski
Date:
In general, no. That's because resultset columns can be "entangled" in
more complex way than "column a of table b".

2009/12/27, Gianvito Pio <pio.gianvito@gmail.com>:
> Hi all,
> I'm trying to get the table name of a column in this way:
>
> ResultSet rs;
>          try
>          {
>              rs = ps.executeQuery();
>              ResultSetMetaData rsmd = rs.getMetaData();
>              System.out.println(rsmd.getTableName(..));
>
> but the getTableName( ..) method gives me an empty string. Isn't there a
> way to know the table name of a specific field I'm obtaining? Thanks
>
> --
> Sent via pgsql-jdbc mailing list (pgsql-jdbc@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-jdbc
>

--
Wysłane z mojego urządzenia przenośnego

Filip Rembiałkowski
JID,mailto:filip.rembialkowski@gmail.com
http://filip.rembialkowski.net/

Re: Get a table name

From
Maciek Sakrejda
Date:
>In general, no. That's because resultset columns can be "entangled" in more complex way than "column a of table b".

Actually, this *is* defined at the protocol level:

From the RowDescription message at
http://developer.postgresql.org/pgdocs/postgres/protocol-message-formats.html
:
...

Then, for each field, there is the following:

String

    The field name.
Int32

    If the field can be identified as a column of a specific table,
the object ID of the table; otherwise zero.

...

No idea whether JDBC exposes this or whether the server actually sends
the correct oids, or if this is just part of the protocol as a
future-proofing attempt.

---
Maciek Sakrejda | Software Engineer | Truviso

1065 E. Hillsdale Blvd., Suite 230
Foster City, CA 94404
(650) 242-3500 Main
(650) 242-3501 F
www.truviso.com

Re: Get a table name

From
Oliver Jowett
Date:
Gianvito Pio wrote:
> Hi all,
> I'm trying to get the table name of a column in this way:
>
> ResultSet rs;
>         try
>         {
>             rs = ps.executeQuery();
>             ResultSetMetaData rsmd = rs.getMetaData();
>             System.out.println(rsmd.getTableName(..));
>
> but the getTableName( ..) method gives me an empty string. Isn't there a
> way to know the table name of a specific field I'm obtaining? Thanks

You can use PGResultSetMetaData.getBaseTableName() if you want to know
the name of the underlying table that provided the data for a column
(where known).

We concluded a while back that getTableName() is meant to return the
aliased table name in the query, not the underlying table name. It's not
easy for the driver to find the aliased name, so it always returns an
empty string, as you found.

-O

Re: Get a table name

From
Oliver Jowett
Date:
Maciek Sakrejda wrote:
>> In general, no. That's because resultset columns can be "entangled" in more complex way than "column a of table b".
>
> Actually, this *is* defined at the protocol level:

> No idea whether JDBC exposes this or whether the server actually sends
> the correct oids, or if this is just part of the protocol as a
> future-proofing attempt.

The driver exposes this via PGResultSetMetadata.getBaseTableName(), and
I believe the server does send useful data here.

-O


Re: Get a table name

From
Tom Lane
Date:
Oliver Jowett <oliver@opencloud.com> writes:
> Maciek Sakrejda wrote:
>> No idea whether JDBC exposes this or whether the server actually sends
>> the correct oids, or if this is just part of the protocol as a
>> future-proofing attempt.

> The driver exposes this via PGResultSetMetadata.getBaseTableName(), and
> I believe the server does send useful data here.

For the record, my recollection is that that part of the protocol was
put in specifically at the request of the JDBC hackers.

            regards, tom lane

Re: Get a table name

From
dmp
Date:
> Gianvito Pio wrote:
> Hi all,
> I'm trying to get the table name of a column in this way:
>
> ResultSet rs;
>         try
>         {
>             rs = ps.executeQuery();
>             ResultSetMetaData rsmd = rs.getMetaData();
>             System.out.println(rsmd.getTableName(..));
>
> but the getTableName( ..) method gives me an empty string. Isn't there
> a way to know the table name of a specific field I'm obtaining? Thanks


Well that is interesting.
danap.

      // Method Instances

      String sqlStatementString;
      Statement sqlStatement;
      ResultSet rs, db_resultSet;
      DatabaseMetaData dbMetaData;
      ResultSetMetaData tableMetaData;

       // ====================================================
      // Setting Up the Column Names, Form Fields, ComboBox
      // Text, Hashmaps, Special Fields, & Primary Key(s).

         sqlStatementString = "SELECT * FROM " + schemaTableName + "
LIMIT 1";
         System.out.println(sqlStatementString);

         db_resultSet = sqlStatement.executeQuery(sqlStatementString);

         // Primary Key(s)
         dbMetaData = dbConnection.getMetaData();
         tableMetaData = db_resultSet.getMetaData();
         System.out.println("TableName:" + tableMetaData.getTableName(1));
         System.out.println("CatalogName:" +
tableMetaData.getCatalogName(1));
         System.out.println("SchemaName:" + tableMetaData.getSchemaName(1));

         rs = dbMetaData.getPrimaryKeys(tableMetaData.getCatalogName(1),
                                        tableMetaData.getSchemaName(1),
                                        tableMetaData.getTableName(1));
         while (rs.next())
         {
            if (rs.getString("COLUMN_NAME").indexOf("chunk") == -1 &&
                rs.getString("TABLE_NAME").equals(tableName))
            {
               primaryKeys.add(rs.getString("COLUMN_NAME"));
               System.out.println(rs.getString("TABLE_NAME") + " " +
rs.getString("Column_NAME"));
            }
         }

DBTablesPanel actionPerformed() Connection Created
SELECT * FROM "public"."keY_tAble2" LIMIT 1
TableName:
CatalogName:
SchemaName:
keY_tAble2 Host
keY_tAble2 Db
keY_tAble2 Username
DBTablesPanel actionPerformed() Connection Closed

Re: Get a table name

From
Kris Jurka
Date:

On Mon, 28 Dec 2009, Oliver Jowett wrote:

> We concluded a while back that getTableName() is meant to return the
> aliased table name in the query, not the underlying table name. It's not
> easy for the driver to find the aliased name, so it always returns an
> empty string, as you found.
>

Just recently I was reading the Mysql JDBC driver's documentation [1] and
came across the "useColumnNamesInFindColumn" config option that comes with
this description:

     Prior to JDBC-4.0, the JDBC specification had a bug related to what
     could be given as a "column name" to ResultSet methods like
     findColumn(), or getters that took a String property. JDBC-4.0
     clarified "column name" to mean the label, as given in an "AS"
     clause and returned by ResultSetMetaData.getColumnLabel(), and if
     no AS clause, the column name. Setting this property to "true" will
     give behavior that is congruent to JDBC-3.0 and earlier versions of
     the JDBC specification, but which because of the specification bug
     could give unexpected results. This property is preferred over
     "useOldAliasMetadataBehavior" unless you need the specific
     behavior that it provides with respect to ResultSetMetadata.

This claims that we've got things backwards now despite our extensive
previous discussion because the spec was misleading. I gave the JDBC 4
spec another read and didn't find anything particularly revealing, but
taking a look at the Javadoc for getColumnLabel [2] does clear things up:

     Gets the designated column's suggested title for use in printouts
     and displays. The suggested title is usually specified by the SQL
     AS clause. If a SQL AS is not specified, the value returned from
     getColumnLabel will be the same as the value returned by the
     getColumnName method.

For reference the previous discussion started at [3] and continued to [4].
So it looks like we should fix this up and ensure there's a way of
getting to old mode as well.

Kris Jurka

[1] http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html
[2] http://java.sun.com/javase/6/docs/api/java/sql/ResultSetMetaData.html#getColumnLabel(int)
[3] http://archives.postgresql.org/pgsql-jdbc/2004-07/threads.php#00314
[4] http://archives.postgresql.org/pgsql-jdbc/2004-08/threads.php#00008