PostgreSQL-простой `execute` для функции завершается с ошибкой"execute приводит к результату Col-столбца "

Я хочу выполнить функцию Postgres из Haskell, которая обновляет 3 строки, но объявляется с RETURNS VOID, Я запускаю функцию следующим образом:

catch (do execute conn "select record(?,?)" [id1, id2])
      (\(e :: SomeException) -> do putStrLn ("Exception:" ++ (show e)); return False)

но это приводит к:

QueryError {qeMessage = "execute resulted in Col 1-column result", qeQuery = "select record(?,?)"}

Запрос не возвращает результаты:

ebdb=> select record('','');
 record
--------------------

(1 row)

Как я могу выполнить эту функцию Postgresql из Haskell?

3 ответа

Решение

Я бы попробовал использовать query вместо execute:

query conn "select 1 from record(?,?)" [id1, id2]

execute для таких заявлений, как INSERT, UPDATEи т. д. Даже если ваш оператор не возвращает никаких строк, он все равно SELECT так что я думаю, что вам нужно использовать query запустить его.

Этот сложный запрос не возвращает строк, но функция все же выполняется:

select 1 where record('', '') isnull;

Я получил эту ошибку и нашел этот вопрос, но не смог переключиться на query потому что я использую библиотеку, которая использует execute для миграции базы данных. (Мне нужна была пустая / неоперационная миграция.)

Вот то, что я в конечном итоге использовал, который работал:

UPDATE arbitrary_but_real_table_name
  SET arbitrary_text_column = 'this will not happen' 
  WHERE 'this is not null' IS NULL;

Надеюсь, это поможет кому-то!

Другие вопросы по тегам