Dengan asumsi Anda ingin meneruskan nilai dari klien . Jika nilai sudah ada di database, ada cara lain yang lebih sederhana.
Sintaks untuk array tipe_komposit
Apa yang dapat Anda lewati tampaknya dibatasi oleh Jenis Java dan Jenis JDBC , dan sepertinya tidak ada ketentuan untuk tipe array, apalagi array nilai komposit ...
Namun, Anda selalu dapat mengirimkan text
perwakilan. Saya membangun dua fakta dasar:
- Mengutip manual :
Penekanan saya yang berani. Oleh karena itu, setelah Anda membuat ketik number_with_time
seperti yang didefinisikan dalam pertanyaan Anda, atau mendefinisikan tabel dengan kolom yang sama yang mendaftarkan tipe baris dalam sistem secara otomatis, Anda juga dapat menggunakan tipe array number_with_time[]
.
- Ada
text
representasi untuk setiap nilai.
Oleh karena itu, ada juga representasi teks untuk number_with_time[]
:
'{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}'::number_with_time[]
Panggilan fungsi
Panggilan fungsi yang sebenarnya bergantung pada nilai kembalian yang ditentukan dalam fungsi Anda - yang tersembunyi dalam pertanyaan Anda.
Untuk menghindari komplikasi dari penanganan array di JDBC, berikan text
perwakilan. Buat fungsi dengan mengambil text
parameter.
Saya tidak akan menggunakan nama "tanggal" untuk timestamp
. Bekerja dengan definisi tipe yang sedikit disesuaikan ini:
CREATE TYPE number_with_time AS(
_num float
, _ts timestamp
);
Fungsi SQL sederhana:
CREATE OR REPLACE FUNCTION myfunc_sql(_arr_txt text)
RETURNS integer -- example
LANGUAGE sql AS
$func$
SELECT sum(_num)::int
FROM unnest (_arr_txt::number_with_time[]) x
WHERE _ts > '2014-04-19 20:00:00';
$func$;
Telepon:
SELECT myfunc_sql('{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}');
db<>fiddle di sini
Lama sqlfiddle
Mendemonstrasikan:
- di atas fungsi SQL
- Varian PL/pgSQL
- beberapa varian sintaks untuk larik tipe komposit
- fungsi memanggil
Panggil fungsi seperti fungsi lainnya dengan menggunakan text
sederhana parameter:
CallableStatement myProc = conn.prepareCall("{ ? = call myfunc_sql( ? ) }");
myProc.registerOutParameter(1, Types.VARCHAR);
// you have to escape double quotes in a Java string!
myProc.setString(2, "{\"(1,2014-04-20 20:00:00)\",\"(2,2014-04-21 21:00:00)\"}");
myProc.execute();
String mySum = myProc.getInt(1);
myProc.close();
Detail dalam manual Postgres JDBC di sini.
Contoh untuk mengembalikan seluruh tabel melalui JDBC: