2012-05-11 13 views
1

JavaとJDBCを使用してPostgres関数にタイムスタンプの配列を渡すにはどうすればよいですか?ここでJava/JDBCを使用してタイムスタンプの配列をPostgres関数に渡す方法は?

は、関数のシグネチャです:ここで

CREATE OR REPLACE FUNCTION getlistcount(_id integer, _subs text, _download_array timestamp without time zone[], _filter integer, _fault text) RETURNS refcursor AS... 

は、配列を作成するJavaコードです:

GregorianCalendar[] dataDownloads = 
     downloadTimes.toArray(new GregorianCalendar[downloadTimes.size()]); 

Array sqlArray = conn.createArrayOf("timestamp", dataDownloads); 
cstmt.setArray(4, sqlArray); 

downloadTimesリストは、Java関数に渡されます。

1つのヒント:Postgres documentationに従って日付と時刻を連結する必要があります。

+1

「TIMESTAMP WITHOUT TIME ZONE'」が表示されています。ほぼすべてのユースケースでは、 'TIMESTAMP WITH TIME ZONE'が優れています。実際の瞬間を表し、もう一方はそうではありません。 – kgrittn

+0

@KGrittn、意味があります。ダウンロード時間からタイムゾーンを取得しています(下記参照)。タイムゾーンをタイムスタンプで保存してください。ありがとうございました! – MAbraham1

答えて

2

an answer on StackOverflow that is similarが見つかりましたが、JDBC表記ではなくPreparedStatementが使用されています。

//Get timezone from first entry, assuming all same timezone 
if(!downloadTimes.isEmpty()) { 
    cal.setTimeZone(downloadTimes.get(0).getTimeZone()); 
} 

//Create an array of timestamps 
java.sql.Timestamp [] array = new java.sql.Timestamp [downloadTimes.size()]; 

for(int i=0; i < array.length; i++) { 
    array[i] = new java.sql.Timestamp(downloadTimes.get(i).getTimeInMillis()); 
} 

//pass the array to JDBC call 
//conn is the connection, and cstmt is the CallableStatement 
Array sqlArray = conn.createArrayOf("timestamp", array); 
cstmt.setArray(4, sqlArray); 
関連する問題