以下是代码,直接来自示例。 64位安装,x64版本。
#include "postgres.h"
#include "executor/spi.h"
#include "commands/trigger.h"
#include "fmgr.h"
#include "access/heapam.h"
#include "utils/syscache.h"
#include "catalog/pg_proc.h"
#include "catalog/pg_type.h"
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
PGDLLEXPORT Datum plsample_call_handler(PG_FUNCTION_ARGS); // <-- the answer!!
PG_FUNCTION_INFO_V1(plsample_call_handler);
Datum
plsample_call_handler(PG_FUNCTION_ARGS)
{
Datum retval;
retval = 42;
return retval;
}
它编译并链接好。这是SQL:
CREATE FUNCTION plsample_call_handler() RETURNS language_handler
AS 'TryPostgresPl.dll'
LANGUAGE C;
CREATE LANGUAGE plsample
HANDLER plsample_call_handler;
这是错误信息。
ERROR: could not find function "plsample_call_handler" in file "C:/Program Files/PostgreSQL/9.5/lib/TryPostgresPl.dll"
SQL state: 42883
如此近,但到目前为止。真的不知道在哪里看。
按照尼克巴恩斯的说法编辑以显示答案。请注意,使用depends.exe查看先前显示2个导出,现在为3。
答案 0 :(得分:1)
Postgres文档中的示例主要针对Linux环境;显然,Windows中有更多内容。 an excellent article @CraigRinger解释了如何在Visual Studio中进行此操作。
在这种情况下,看起来您只需要添加以下函数原型:
PGDLLEXPORT Datum plsample_call_handler(PG_FUNCTION_ARGS);
答案 1 :(得分:1)
对我来说(Postgres 13 x64,VS2019,MSVC 14.27),只需在PGDLLEXPORT
前面添加PG_FUNCTION_INFO_V1
,即:
PGDLLEXPORT PG_FUNCTION_INFO_V1(my_func);
进一步看,它扩展为以下内容:
PGDLLEXPORT extern Datum my_func(PG_FUNCTION_ARGS);
... plus a bunch more stuff
您会注意到,这与接受的答案中的手动操作非常相似,因此这种方式似乎可以避免重复。唯一的区别是extern
关键字;老实说,我对C的了解还不足以知道为什么将PGDLLEXPORT
放在之前 extern
仍然有效(而不是像我在所有示例中看到的那样),但是编译器不会抱怨,并且扩展可以正常工作。
YMMV,尤其是如果这些宏将来会更改。