Lists: | pgsql-jdbc |
---|
From: | Daron Ryan <daron(dot)ryan(at)gmail(dot)com> |
---|---|
To: | pgsql-jdbc(at)postgresql(dot)org |
Subject: | PreparedStatement for set membership (The IN operator) |
Date: | 2011-04-05 07:17:55 |
Message-ID: | 4D9AC223.4000602@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-jdbc |
Hello,
I need to use a SELECT statement with varying data for set membership. IE.
SELECT link_id
FROM links
WHERE heading_id IN (?, ?, ?)
It won't always be the same number of members in the set. I am using an
ordinary statement with an executeQuery call but would prefer to use a
PreparedStatement. Is this possible? If so how do I set the values in
the set?
Regards,
Daron.
From: | Heikki Linnakangas <heikki(dot)linnakangas(at)enterprisedb(dot)com> |
---|---|
To: | Daron Ryan <daron(dot)ryan(at)gmail(dot)com> |
Cc: | pgsql-jdbc(at)postgresql(dot)org |
Subject: | Re: PreparedStatement for set membership (The IN operator) |
Date: | 2011-04-05 08:27:48 |
Message-ID: | 4D9AD284.1090306@enterprisedb.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-jdbc |
On 05.04.2011 10:17, Daron Ryan wrote:
> Hello,
>
> I need to use a SELECT statement with varying data for set membership. IE.
>
> SELECT link_id
> FROM links
> WHERE heading_id IN (?, ?, ?)
>
> It won't always be the same number of members in the set. I am using an
> ordinary statement with an executeQuery call but would prefer to use a
> PreparedStatement. Is this possible? If so how do I set the values in
> the set?
You can do "WHERE heading_id = ANY (?)", and pass an array of the ids
for the parameter.
--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com
From: | Daron Ryan <daron(dot)ryan(at)gmail(dot)com> |
---|---|
To: | Heikki Linnakangas <heikki(dot)linnakangas(at)enterprisedb(dot)com>, pgsql-jdbc(at)postgresql(dot)org |
Subject: | Re: PreparedStatement for set membership (The IN operator) |
Date: | 2011-04-05 12:39:08 |
Message-ID: | 4D9B0D6C.70707@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-jdbc |
Thanks Heikki. I have tried using the setArray method but I am still
running into an error.
Exception in thread "main" org.postgresql.util.PSQLException: Unknown
type _INTEGER.
at
org.postgresql.jdbc2.AbstractJdbc2Statement.setArray(AbstractJdbc2Statement.java:2800)
at dictionary.test.Main.main(Main.java:85)
This is the Array implementation I have created.
http://pastebin.com/tkzPRL4A
For baseTypeName I have also tried "int" and received the same error
referring to type _int instead.
This is the code I used to test the implementation
calling code
http://pastebin.com/T1mvADaF
Any idea what I need to do?
On 5/04/2011 5:57 PM, Heikki Linnakangas wrote:
> On 05.04.2011 10:17, Daron Ryan wrote:
>> Hello,
>>
>> I need to use a SELECT statement with varying data for set
>> membership. IE.
>>
>> SELECT link_id
>> FROM links
>> WHERE heading_id IN (?, ?, ?)
>>
>> It won't always be the same number of members in the set. I am using an
>> ordinary statement with an executeQuery call but would prefer to use a
>> PreparedStatement. Is this possible? If so how do I set the values in
>> the set?
>
> You can do "WHERE heading_id = ANY (?)", and pass an array of the ids
> for the parameter.
>
From: | Thomas Markus <t(dot)markus(at)proventis(dot)net> |
---|---|
To: | Daron Ryan <daron(dot)ryan(at)gmail(dot)com> |
Cc: | pgsql-jdbc(at)postgresql(dot)org |
Subject: | Re: PreparedStatement for set membership (The IN operator) |
Date: | 2011-04-05 12:52:22 |
Message-ID: | 4D9B1086.6040302@proventis.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-jdbc |
hi,
try
select unnest(ARRAY[?,?,?])
regards
Thomas
Am 05.04.2011 09:17, schrieb Daron Ryan:
> Hello,
>
> I need to use a SELECT statement with varying data for set membership.
> IE.
>
> SELECT link_id
> FROM links
> WHERE heading_id IN (?, ?, ?)
>
> It won't always be the same number of members in the set. I am using
> an ordinary statement with an executeQuery call but would prefer to
> use a PreparedStatement. Is this possible? If so how do I set the
> values in the set?
>
> Regards,
> Daron.
>
From: | Heikki Linnakangas <heikki(dot)linnakangas(at)enterprisedb(dot)com> |
---|---|
To: | Daron Ryan <daron(dot)ryan(at)gmail(dot)com> |
Cc: | pgsql-jdbc(at)postgresql(dot)org |
Subject: | Re: PreparedStatement for set membership (The IN operator) |
Date: | 2011-04-05 12:56:36 |
Message-ID: | 4D9B1184.9090404@enterprisedb.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-jdbc |
On 05.04.2011 15:39, Daron Ryan wrote:
> Thanks Heikki. I have tried using the setArray method but I am still
> running into an error.
>
> Exception in thread "main" org.postgresql.util.PSQLException: Unknown
> type _INTEGER.
> at
> org.postgresql.jdbc2.AbstractJdbc2Statement.setArray(AbstractJdbc2Statement.java:2800)
>
> at dictionary.test.Main.main(Main.java:85)
>
> This is the Array implementation I have created.
> http://pastebin.com/tkzPRL4A
Starting with JDBC4, you can use conn.createArrayOf() function. No need
to create a custom Array class anymore. This is what we have in the test
suite:
public void testCreateArrayOfInt() throws SQLException {
PreparedStatement pstmt = _conn.prepareStatement("SELECT
?::int[]");
Integer in[] = new Integer[3];
in[0] = 0;
in[1] = -1;
in[2] = 2;
pstmt.setArray(1, _conn.createArrayOf("int4", in));
ResultSet rs = pstmt.executeQuery();
assertTrue(rs.next());
Array arr = rs.getArray(1);
Integer out[] = (Integer [])arr.getArray();
assertEquals(3, out.length);
assertEquals(0, out[0].intValue());
assertEquals(-1, out[1].intValue());
assertEquals(2, out[2].intValue());
}
--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com
From: | Daron Ryan <daron(dot)ryan(at)gmail(dot)com> |
---|---|
To: | Heikki Linnakangas <heikki(dot)linnakangas(at)enterprisedb(dot)com> |
Cc: | pgsql-jdbc(at)postgresql(dot)org |
Subject: | Re: PreparedStatement for set membership (The IN operator) |
Date: | 2011-04-05 13:42:46 |
Message-ID: | 4D9B1C56.7010709@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-jdbc |
On 5/04/2011 10:26 PM, Heikki Linnakangas wrote:
> On 05.04.2011 15:39, Daron Ryan wrote:
>> Thanks Heikki. I have tried using the setArray method but I am still
>> running into an error.
>>
>> Exception in thread "main" org.postgresql.util.PSQLException: Unknown
>> type _INTEGER.
>> at
>> org.postgresql.jdbc2.AbstractJdbc2Statement.setArray(AbstractJdbc2Statement.java:2800)
>>
>>
>> at dictionary.test.Main.main(Main.java:85)
>>
>> This is the Array implementation I have created.
>> http://pastebin.com/tkzPRL4A
>
> Starting with JDBC4, you can use conn.createArrayOf() function. No
> need to create a custom Array class anymore. This is what we have in
> the test suite:
>
> public void testCreateArrayOfInt() throws SQLException {
> PreparedStatement pstmt = _conn.prepareStatement("SELECT
> ?::int[]");
> Integer in[] = new Integer[3];
> in[0] = 0;
> in[1] = -1;
> in[2] = 2;
> pstmt.setArray(1, _conn.createArrayOf("int4", in));
>
> ResultSet rs = pstmt.executeQuery();
> assertTrue(rs.next());
> Array arr = rs.getArray(1);
> Integer out[] = (Integer [])arr.getArray();
>
> assertEquals(3, out.length);
> assertEquals(0, out[0].intValue());
> assertEquals(-1, out[1].intValue());
> assertEquals(2, out[2].intValue());
> }
>
Thanks, my code is working now. I changed my baseTypeName to int4 and
after a few more fixes my code worked. Then I tried the
Connection.createArrayOf method and that worked too.
From: | Daron Ryan <daron(dot)ryan(at)gmail(dot)com> |
---|---|
To: | Heikki Linnakangas <heikki(dot)linnakangas(at)enterprisedb(dot)com> |
Cc: | pgsql-jdbc(at)postgresql(dot)org |
Subject: | PreparedStatement with ANY |
Date: | 2011-04-06 11:28:03 |
Message-ID: | 4D9C4E43.9050101@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-jdbc |
Thanks to your help before I made ANY work with integers. I now need
to work with strings. Any idea where I can find a list of the
type names used by postgres for the Connection.createArray method?
From: | Daron Ryan <daron(dot)ryan(at)gmail(dot)com> |
---|---|
To: | Heikki Linnakangas <heikki(dot)linnakangas(at)enterprisedb(dot)com> |
Cc: | pgsql-jdbc(at)postgresql(dot)org |
Subject: | Re: PreparedStatement with ANY |
Date: | 2011-04-06 11:32:38 |
Message-ID: | 4D9C4F56.1060709@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-jdbc |
On 6/04/2011 8:58 PM, Daron Ryan wrote:
> Thanks to your help before I made ANY work with integers. I now need
> to work with strings. Any idea where I can find a list of the
> type names used by postgres for the Connection.createArray method?
Just found it at http://db.apache.org/ojb/docu/guides/jdbc-types.html.
Sorry.