如何从 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);
我们正在将 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);