Я написал функцию C для выполнения из PostgreSQL (с помощью команды CREATE FUNCTION ... LANGUAGE C;
), но когда я это делаю, она отвечает: «PQnfields: символ не найден».
Я попытался указать путь к библиотеке libpq при компиляции, например:
gcc -lpq -fpic -c crossdb.c -I`pg_config --includedir-server` -I /usr/include/ -std=c99
Но это не сработало. Я думаю, что просто невозможно использовать libpq для запроса базы данных из функции... Поэтому, если вы знаете, как это сделать или что вызывает это сообщение об ошибке, я был бы рад узнать об этом от вас.
Вам нужно будет поместить каталог, содержащий libpq.so.*
, в путь к общей библиотеке PostgreSQL, либо установив LD_LIBRARY_PATH
в среде сервера, либо добавив -Wl,-rpath,/path/to/so
в строку компиляции.
Используете ли вы платформу PGXS для создания общей библиотеки? Это дает вам большинство правильных флагов автоматически.
Посмотрите на postgres_fdw
Makefile
для вдохновения, он тоже связан с libpq
.
Сделаем шаг назад: вы уверены, что вам нужна функция с именем crossdb
, которая вызывает клиент? Я бы исследовал, может ли внешняя таблица или dblink
сделать то, чего вы пытаетесь достичь.
libpq для фронтенд-программ. Ваша функция станет частью бэкенда СУБД, postgresql.org/docs/current/xfunc-c.html