Ако приемем, че искате да предадете стойности от клиента . Ако стойностите вече съществуват в базата данни, има други, по-прости начини.
Синтаксис за масив от composite_type
Това, което можете да преминете, изглежда е ограничено от Типове Java и JDBC типове , и изглежда няма разпоредби за типове масиви, да не говорим за масиви от съставни стойности ...
Винаги обаче можете да подадете text
представителство. Разчитам на два основни факта:
- Цитиране на ръководството :
Удебелен акцент мой. Следователно, след като сте създали типа number_with_time
както е дефинирано във вашия въпрос, или дефинирана таблица със същите колони, която автоматично регистрира типа ред в системата, можете също да използвате типа масив number_with_time[]
.
- Има
text
представителство за всеки стойност.
Следователно има и текстово представяне за number_with_time[]
:
'{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}'::number_with_time[]
Извикване на функция
Действителното извикване на функция зависи от върнатите стойности, дефинирани във вашата функция - което е скрито във вашия въпрос.
За да избегнете усложнения от обработката на масиви в JDBC, предайте text
представителство. Създайте функцията, като вземете text
параметър.
Няма да използвам името „дата“ за timestamp
. Работа с тази леко коригирана дефиниция на тип:
CREATE TYPE number_with_time AS(
_num float
, _ts timestamp
);
Проста SQL функция:
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$;
Обаждане:
SELECT myfunc_sql('{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}');
Демонстрираме:
- над SQL функция
- PL/pgSQL вариант
- няколко варианта на синтаксис за масива от съставен тип
- функцията извиква
Извикайте функцията като всяка друга функция, приемаща прост text
параметър:
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();
Подробности в ръководството за Postgres JDBC тук.
Пример за връщане на цяла таблица чрез JDBC: