#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. Будет ли это практической проблемой производительности.