2012-03-27 82 views
1

问题:调用带有空的参数的一个PL/pgSQL函数

我在与PLPGSQL语言,我已经在Postgres里(9.1),创建了一个功能问题。我来自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); 

在这种情况下,我没有分配参数2为任意值。它是可以空的 - 不应该是一个问题。

我得到的错误是:

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

从我所看到的,调用试图以分配参数,忽略了参数名称。

问题:

1 - 我怎样才能调用这个函数来完成这项工作?我是否必须通过“NULL”作为缺失的参数,并确保它们全部合格?

2 - 如果我正在使用ODBC连接,我确实应该调用一个SQL语言函数,然后调用PLPGSQL函数?这有点复杂,但我愿意尝试。

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

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

UPDATE:

这里的DboCommand:

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

曾经是这个

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

现在,错误的是:

the # of binded parameters < the # of parameter markers

回答

2

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

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

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

问题2:引入SQL存根功能不能在这方面帮助。

问题3:从查看来电者的角度命名参数的可能性是最近(出现在PG 9.0我认为),所以它可能是为什么ODBC驱动程序有这方面的支持。

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

此消息指出问题:Postgres无法找出要调用的函数,因为它具有不完整的函数签名,没有名为func1的函数将未知类型作为其第一个参数,将一个整数作为第二个参数。试试您铸造占位符预期的类型,当你调用函数所以Postgres不能化解的签名,例如,像:func1(:param1::character varying, :param2::character varying, :param3::integer)func1(CAST(:param1 as character varying), CAST(:param2 as character varying), CAST(:param3 as integer))。你没有发布函数调用或sql语句,所以我从你的绑定调用的风格,我假设名为形式的名称占位符,使用任何正确的形式为您的odbc客户端库。我会很有帮助知道你使用的是什么C++客户端库。

+0

感谢您的提示。我没有忘记添加实际的DboCommand对象,该对象具有错误指定的函数调用。我更新了我的代码和问题,并发布了我收到的新错误。 – 2012-03-27 17:57:52