如何从 C 代码 (ECPG) 调用 PostgreSQL 函数?

How to call PostgreSQL function from C code (ECPG)?

我们正在将 Oracle Pro*C 代码移植到 PostgreSQL ECPG。我们有几个 Oracle 存储过程被移植到 PostgreSQL 函数中,例如:

db1.update_some_logic(double precision, double precision, text, text)

在 C 文件上,我尝试了几种方法,但似乎没有任何效果。

选项 1:

EXEC SQL SELECT db1.update_some_logic(10411, 920, 'TYT','N');

错误 1:

too few arguments on line 4379

选项 2:

EXEC SQL BEGIN DECLARE SECTION;
const char *stmt2 = "SELECT db1.update_some_logic(10411, 920, 'TYT','N');";
EXEC SQL END DECLARE SECTION;
EXEC SQL EXECUTE IMMEDIATE :stmt2;

错误 2:

too few arguments on line 4384

该函数显然有 4 个参数,不确定我在这里遗漏了什么。

我可以使用 PostgreSQL 12.3 重现该问题。

我发现了以下解决方法:

  • 函数不应该 return 无效,而是一个值,例如整数
  • ECPG 程序必须执行该函数并使用 SELECT ... INTO:
  • 获得 returned 值

EXEC SQL SELECT update_some_logic(10411, 920, 'TYT','N') INTO :v_key;

您需要为这些参数使用共享变量。

EXEC SQL BEGIN DECLARE SECTION;

double parameter_1;
double parameter_2; 
char parameter_3[100];
char parameter_4[100];
int result; //I guess your function return int??

EXEC SQL END DECLARE SECTION;


EXEC SQL SELECT update_some_logic(:parameter_1, :parameter_2, :parameter_3, :parameter_4) INTO :result;

if (sqlca.sqlcode!=0)
{
  printf("Error: %ld\n", sqlca.sqlcode);
  printf("Message:%s\n", sqlca.sqlerrm.sqlerrmc);
}

printf("It works %d\n", result);