gpt4 book ai didi

c++ - 使用可空参数调用 PL/PGSQL 函数

转载 作者:行者123 更新时间:2023-11-29 12:47:43 25 4
gpt4 key购买 nike

问题:

我在 Postgres (9.1) 中使用 plpgsql 语言创建的函数有问题。我来自 SQL Server 世界,所以这里存在一点语言差异。

我的问题是 postgres 似乎没有正确分配我传递的参数。

这是我的函数定义:

CREATE OR REPLACE FUNCTION func1 (
IN param1 character varying,
IN param2 character varying DEFAULT NULL::character varying,
IN param3 int DEFAULT NULL::int)
RETURNS void
AS $$
BEGIN
INSERT INTO table1
(
col1
, col2
, col3
)
VALUES
(
$1
, $2
, $3
)
END;
$$ LANGUAGE plpgsql;

函数本身在数据库环境中测试时运行良好,但我目前正尝试通过 ODBC 连接从 C++ 调用它。

这里是我设置参数的地方:

pCmd->paramIn( "param1", (char *)name.getString().c_str() );
pCmd->paramIn( "param3", 100 );

在这种情况下,我没有为 param2 分配任何值。它可以为空 - 应该不是问题。

我得到的错误是:

ERROR: function func1(unknown, integer) does not exist;

据我所见,调用试图按顺序分配参数,忽略参数名称。

问题:

1 - 我怎样才能调用这个函数来让它工作?我是否必须将“NULL”作为缺少的参数传递进来,并确保它们都是有序的?

2 - 如果我使用的是 ODBC 连接(我肯定是这样),我是否应该调用一个 SQL 语言函数,而该函数又会调用一个 PLPGSQL 函数?这有点令人费解,但我愿意尝试一下。

3 -(不是问题)请不要建议“不要使用 ODBC”。另外,除非必要,否则请不要尝试更改函数的内部结构。我现在主要关心的是学习如何通过 ODBC 在 postgres 中进行函数调用。

提前感谢大家花时间阅读本文,非常感谢所有回答的人。

更新:

这是 DboCommand:

DboCommand *cmd;
cmd = new DboCommand(dbConnection, "{call func1 (?) (?)}");

以前是这个

cmd = new DboCommand(dbConnection, "func1");

现在,错误是:

the # of binded parameters < the # of parameter markers

最佳答案

问题 #1:是的,您必须传递 NULL 并关心顺序(和类型)。

理论上,PostgreSQL 函数可以用命名或位置表示法的参数调用。在这里解释:http://www.postgresql.org/docs/9.1/static/sql-syntax-calling-funcs.html

当仅使用位置符号时,只有在省略任何后续参数时才可以省略第 N 个参数。由于您的 ODBC 驱动程序明确使用此表示法,因此如果要指定第三个参数,则必须指定第二个参数。据推测,您在客户端代码中为参数选择的名称与 plpgsql 函数声明的名称完全无关,位置和参数类型对于匹配对现有函数的调用很重要。

问题 #2:引入 SQL stub 函数对此无济于事。

问题 #3:从调用者的角度命名参数的可能性是最近出现的(我认为出现在 PG 9.0 中),所以这可能是 ODBC 驱动程序不支持它的原因。

关于c++ - 使用可空参数调用 PL/PGSQL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9893346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com