Postgresql подготавливает инструкцию с помощью оператора ANY

#postgresql #prepared-statement

#postgresql #подготовленная инструкция

Вопрос:

ВЫБЕРИТЕ * ИЗ tbl_emp, ГДЕ процент = 1 доллар И emp_id = ЛЮБОЙ (?)

Правильно ли приведенное выше утверждение для использования в функции PQprepare?

Если да, то каким должно быть значение для nParams и как будет вызываться PQexecPrepared?

С уважением, Mayank

Ответ №1:

Если вы пытаетесь подготовить что-то вроде = ANY (1, 2, 3) , это не будет работать напрямую, потому что 1, 2, 3 это синтаксическая конструкция, а не выражение. (Конечно, вы могли бы сделать = ANY ($2, $3, $4) , но это работает, только если вы точно знаете, сколько значений у вас есть.)

Но вы можете сделать это с помощью массивов. Приведенное выше эквивалентно = ANY(ARRAY[1, 2, 3]) , и поэтому вы бы написали

 SELECT * FROM tbl_emp WHERE interest = $1 AND emp_id = ANY($2)
  

и типами параметров являются, скажем, int и int[] .

Для вызова PQexecPrepared вам понадобится массив в виде строкового литерала. Подойдет что-то вроде "{1, 2, 3}" (в виде строки C). Подробности см. в документации.

Комментарии:

1. Большое спасибо, Питер. Все, что вы сказали, сработало отлично. (Хотя я не мог проголосовать за это, поскольку для этого требовалось 15 репутаций). Ну, я подумываю об использовании PQexec и передаче инструкций PREPARE и EXECUTE вместо использования PQprepare и PQexecPrepared. Будет ли это практической проблемой производительности.