#mirth
Вопрос:
Я пытаюсь создать отчет, который показывает количество сообщений по всем каналам, используя приведенный ниже блок PostgreSQL, настроив канал с источником в качестве считывателя базы данных и назначением в качестве записи файлов для хранения результата в файле xlm в определенном каталоге. После настройки канала, когда я включил его, он просто остается в состоянии опроса с приведенной ниже ошибкой в журнале сервера. Но когда я заменил этот блок простым запросом выбора, он работает. Было бы действительно полезно, если бы вы помогли мне понять, в чем я ошибаюсь, или канал Mirth не читает блок psql?
declare
tableName text;
msgCount int;
channelName text;
channelID text;
countDate date;
PortNum text;
begin
raise info ' | CHANNEL NAME | CHANNEL ID | DATE | COUNT | PORT NUM';
execute 'select CURRENT_DATE-1' into countDate;
<<"Yesterday's Received Message Count">>
for tableName in (select local_channel_id from d_channels) loop
execute 'select count(*) from d_mm' || tableName || ' where connector_name = ''Source'' and received_date between (select CURRENT_DATE-31 || '' 00:00:00.00'')::timestamp and (select CURRENT_DATE-1 || '' 23:59:59.99'')::timestamp' into msgCount;
execute 'select channel.name from channel inner join d_channels on d_channels.channel_id = channel.id where d_channels.local_channel_id = '|| tableName into channelName;
execute 'select channel.id from channel inner join d_channels on d_channels.channel_id = channel.id where d_channels.local_channel_id = '|| tableName into channelID;
execute 'select substring (channel.channel, position (''<port>'' IN channel) 6, 4) AS port from channel inner join d_channels on d_channels.channel_id = channel.id where d_channels.local_channel_id = '|| tableName into PortNum;
raise info ' | %', channelName || ' | ' || channelID || ' | ' || countDate || ' | '|| msgCount || ' | '|| PortNum;
end loop "Yesterday's Received Message Count";
end;
$channelLoop$;
Ошибка:
[2021-06-28 04:07:16,410] ERROR (com.mirth.connect.connectors.jdbc.DatabaseReceiverQuery:207): An error occurred while polling for messages, retrying after 10000 ms...
org.postgresql.util.PSQLException: No results were returned by the query.
at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:117)
at com.mirth.connect.connectors.jdbc.DatabaseReceiverQuery.poll(DatabaseReceiverQuery.java:190)
at com.mirth.connect.connectors.jdbc.DatabaseReceiver.poll(DatabaseReceiver.java:111)
at com.mirth.connect.donkey.server.channel.PollConnectorJob.execute(PollConnectorJob.java:49)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
Ответ №1:
Честно говоря, я не совсем понимаю, что здесь происходит.
Mirth собирается взять все, что вы поместите в качестве SQL-запроса в средство чтения баз данных, и использовать его для создания с java.sql.PreparedStatement
использованием любого выбранного вами драйвера JDBC. Затем он выполняет подготовленное утверждение, передавая при необходимости любые параметры в зависимости от того, использовали ли вы токены замены или нет.
Я не знаю, позволит ли драйвер postgres скомпилировать это в подготовленный оператор и выполнить. Похоже, что, возможно, так и есть, так как он не жалуется до тех пор, пока вы не попытаетесь выполнить запрос.
Проблема, по-видимому, заключается в том, что запрос не возвращает набор результатов. Глядя на ваш код, я думаю, что вместо этого вы отправляете свои выходные данные в журнал postgres?
Комментарии:
1. Спасибо за ваш ответ. Но я все еще использую тот же блок P-SQL в серверной части, чтобы вручную вытащить отчет, и он возвращает набор результатов.
2. Я думаю, что ошибка довольно четко говорит: «Запрос не вернул результатов». Я также не вижу никаких операторов select, которые не выбираются в переменную. Что вы делаете, чтобы на самом деле что-то вернуть?
3. Насколько я могу судить, сообщения, которые вы вызываете, необходимо извлекать с помощью метода getWarnings() для объекта оператора, но они не являются частью набора результатов.